字体嵌入错误 PDFA/1a iText 5.5.6

Font embedding error PDFA/1a iText 5.5.6

我在下面给出了一个 class 异常:Exception in thread "main" com.itextpdf.text.DocumentException: com.itextpdf.text.pdf.PdfAConformanceException: All the fonts must be embedded. This one isn't: ZapfDingbats 我嵌入了 ZapfDingbats 字体,但我仍然得到这个 Exception。 我在这里想要实现的是在 list 中的每个 item 前面创建一个 list 和一个 bullet。 我在这里错过了什么?

public class SquareBullet {
    public static void main(String[] args) throws IOException, DocumentException, XMPException {
        Document document = new Document();
        PdfAWriter writer = PdfAWriter.getInstance(document, new FileOutputStream("list.pdf"), PdfAConformanceLevel.PDF_A_1A);
        writer.setViewerPreferences(PdfAWriter.PageModeUseOutlines);
        writer.setRunDirection(PdfAWriter.RUN_DIRECTION_LTR);
        writer.setTagged(PdfAWriter.markAll);
        writer.createXmpMetadata();
        XmpWriter xmp = writer.getXmpWriter();

        DublinCoreProperties.addSubject(xmp.getXmpMeta(), "Subject");
        DublinCoreProperties.setTitle(xmp.getXmpMeta(), "Title", "en_US", "en_US");
        DublinCoreProperties.setDescription(xmp.getXmpMeta(), "Description", "en_US", "en_US");
        PdfProperties.setKeywords(xmp.getXmpMeta(), "Keywords");
        PdfProperties.setVersion(xmp.getXmpMeta(), "1.4");
        document.addLanguage("en_US");
        document.open();
        Font font = FontFactory.getFont(FontFactory.ZAPFDINGBATS, BaseFont.ZAPFDINGBATS, BaseFont.EMBEDDED, 12);
        Font font1 = FontFactory.getFont(FontFactory.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED, 12);
        ICC_Profile icc = ICC_Profile.getInstance(new FileInputStream("sRGB Color Space Profile.icm"));
        writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
        List list = new List(10);
        list.setListSymbol(new Chunk(String.valueOf((char)110), font));
        list.add(new ListItem(new Chunk("Test 1", font1)));
        list.add(new ListItem(new Chunk("Test 2", font1)));
        list.add(new ListItem(new Chunk("Test 3", font1)));
        document.add(list);
        document.close();
    }
}

你的说法我嵌入了 ZapfDingbats 字体是错误的。

当然,您可以这样定义字体:

Font font = FontFactory.getFont(FontFactory.ZAPFDINGBATS,
    BaseFont.ZAPFDINGBATS, BaseFont.EMBEDDED, 12);

当您使用 BaseFont.EMBEDDED 时,您可能会假设字体将被嵌入,但事实并非如此。 您可以通过在任何其他不是 PDF/A 的 PDF:如果您转至 文档属性 > 字体,您会看到字体未嵌入。

这是为什么?

PDF中有14种特殊字体。我们将它们称为 标准 Type 1 字体。每个 PDF 查看器都应该能够呈现使用这些字体的文本,因此不需要嵌入这些字体:4 种 Helvetica 字体(常规、粗体、斜体、粗体-斜体)、4 种 Times Roman 字体(常规、粗体、斜体) , 粗体-斜体), 4 种 Courier 字体(常规, 粗体, 斜体, 粗体-斜体), Symbol 和 Zapfdingbats.

iText 附带这些字体的 AFM 文件。 AFM 代表 Adobe Font Metrics,文件包含有关宽度、边界框和每种字体可用的字形的其他指标的数据。

这些字体的 形状 的实际描述并未随 iText 一起提供。这些存储在 PFB(打印机字体二进制)文件中。没有这些 PFB 文件,iText 不能(也不会)嵌入这些 Standard Type 1 字体。

换句话说: iText忽略BaseFont.EMBEDDED参数。

这在很多地方都有记载。如果要创建 PDF/A,则需要字体文件,例如 TTF、OTF、TTC 文件,或 AFM 和 PFB 文件的组合。

您必须将 "jasperreports-fonts-" jar 添加到类路径中。