使用iText7生成PDF-A时遭遇Courier字体未嵌入报错
解决iText7生成PDF-A时字体未嵌入的报错问题
问题原因
PDF-A标准强制要求所有使用的字体必须嵌入到文档中,你使用PdfFontFactory.createFont(StandardFonts.COURIER)创建字体时,默认是不嵌入状态(普通PDF允许依赖系统内置字体,但PDF-A不允许),因此触发了PdfAConformanceException。
解决方案
方法1:创建字体时显式指定嵌入参数
修改字体创建代码,添加PdfFontFactory.EMBEDDED参数,强制将字体嵌入到PDF-A文档中:
PdfFont font = PdfFontFactory.createFont(StandardFonts.COURIER, PdfFontFactory.EMBEDDED);
方法2:设置Document默认嵌入字体(无需单独为Paragraph创建字体)
如果你不想手动为每个Paragraph创建字体,可以先给Document设置默认的嵌入字体,后续添加的元素会自动继承该字体:
// 初始化Document后设置默认嵌入字体 Document document = new Document(pdfA, PageSize.A4, false); PdfFont defaultEmbedFont = PdfFontFactory.createFont(StandardFonts.COURIER, PdfFontFactory.EMBEDDED); document.setFont(defaultEmbedFont); // 直接创建Paragraph并添加,无需单独设置字体 Paragraph p = new Paragraph("Prova pdfa"); document.add(p);
完整修正后的测试代码
package testcreatepdfa; import com.itextpdf.io.font.constants.StandardFonts; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfAConformanceLevel; import com.itextpdf.kernel.pdf.PdfDocumentInfo; import com.itextpdf.kernel.pdf.PdfOutputIntent; import com.itextpdf.kernel.pdf.PdfString; import com.itextpdf.kernel.pdf.PdfViewerPreferences; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.pdfa.PdfADocument; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.SimpleDateFormat; public class TestCreatePDFA { public static void main(String[] args) throws FileNotFoundException, IOException { PdfWriter pdfWriter = new PdfWriter("C:\\Temp\\" + new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()) + ".pdf"); PdfADocument pdfA = new PdfADocument(pdfWriter, PdfAConformanceLevel.PDF_A_1B, new PdfOutputIntent("Custom", "", "https://www.color.org", "sRGB2014", new FileInputStream("C:\\Users\\UC9001309\\Documents\\NetBeansProjects\\GestionePdf\\sRGB2014.icc"))); Document document = new Document(pdfA, PageSize.A4, false); pdfA.setTagged(); pdfA.getCatalog().setLang(new PdfString("it-IT")); pdfA.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true)); PdfDocumentInfo info = pdfA.getDocumentInfo(); info.setTitle("TEST PdfA "); // 创建嵌入的Courier字体 PdfFont font = PdfFontFactory.createFont(StandardFonts.COURIER, PdfFontFactory.EMBEDDED); Paragraph p = new Paragraph(); p.setFont(font); p.add("Prova pdfa"); document.add(p); document.close(); } }
补充说明
- 所有PDF-A版本(包括1B)都要求字体嵌入,这是为了保证文档在任意设备上都能正确渲染,避免依赖系统字体。
- iText7中
StandardFonts下的字体默认不嵌入,必须显式指定EMBEDDED参数才能满足PDF-A的合规要求。
内容的提问来源于stack exchange,提问作者DropVid
相关产品推荐
相关产品推荐

