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

时间:2015-09-02 09:30:51

标签: java itext pdfa

我在下面给出了一个给出异常的课程: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中的每个bullet前面创建一个item list。 我在这里缺少什么?

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();
    }
}

2 个答案:

答案 0 :(得分:2)

您的声明我嵌入了ZapfDingbats字体是错误的。

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

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

当您使用BaseFont.EMBEDDED时,您可能会认为该字体将被嵌入,但不是。您可以在任何其他PDF中使用该字体来检查t PDF / A:如果你去文件属性>字体,你会看到字体没有嵌入。

为什么会这样?

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

iText附带这些字体的AFM文件。 AFM代表 Adob​​e字体度量标准,文件包含有关宽度,边界框以及每种字体中可用字形的其他度量标准的数据。

这些字体的形状的实际描述不随iText一起提供。它们存储在PFB(打印机字体二进制)文件中。如果没有这些PFB文件,iText就不能(也不会)嵌入这些标准类型1字体。

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

许多地方都记录了这一点。如果要创建PDF / A,则需要字体文件,例如TTF,OTF,TTC文件或AFM和PFB文件的组合。

答案 1 :(得分:0)

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