0

我有一个下面给出的类,它给了我例外:Exception in thread "main" com.itextpdf.text.DocumentException: com.itextpdf.text.pdf.PdfAConformanceException: All the fonts must be embedded. This one isn't: ZapfDingbatsZapfDingbats嵌入了字体,但我仍然得到这个Exception。我在这里想要实现list的是bullet在. 我在这里想念什么?itemlist

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

2 回答 2

3

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

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

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

当您使用BaseFont.EMBEDDED时,您可能会假设字体将被嵌入,但事实并非如此。您可以通过在任何其他不是 PDF/A 的 PDF 中使用该字体来检查这一点:如果您转到Document Properties > Fonts,您会看到该字体未嵌入。

为什么是这样?

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

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

iText 不附带这些字体形状的实际描述。这些存储在 PFB(打印机字体二进制)文件中。如果没有这些 PFB 文件,iText 就不能(也不会)嵌入这些 Standard Type 1 字体。

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

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

于 2015-09-02T09:41:19.867 回答
0

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

于 2017-06-29T10:40:14.790 回答