You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:06:22