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

标签 java itext pdfa

下面给出的类给了我异常:线程“main”中的异常com.itextpdf.text.DocumentException:com.itextpdf.text.pdf.PdfAConformanceException:必须嵌入所有字体。这不是:ZapfDingbats 我嵌入了 ZapfDingbats 字体,但我仍然收到此Exception。 我在这里想要实现的是创建一个 list ,在 list 中的每个 item 前面都有一个 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种特殊字体。我们将它们称为“标准 1 类字体”。每个 PDF 查看器都应该能够呈现使用这些字体的文本,因此不需要嵌入这些字体:4 种 Helvetica 字体(常规、粗体、斜体、粗斜体)、4 种 Times Roman 字体(常规、粗体、斜体) 、粗斜体)、4 种 Courier 字体(常规、粗体、斜体、粗体斜体)、Symbol 和 Zapfdingbats。

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

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

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

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

关于java - 字体嵌入错误 PDFA/1a iText 5.5.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349517/

相关文章:

java - 在 Android 应用程序中拍照并将其保存到图库中

c# - iTextSharp 中多行文本表单字段的对齐问题

java - 使用ITextRenderer从HTML生成pdf文件时出现编码问题

itext - 如何找出页面上当前光标位置?

java - 在 java 中使用 PDFBOX 检查 PDF 是否为 PDF/A 1-a 格式

java - 为什么我们将类声明为抽象类,即使它没有抽象方法

java - 为什么 WebApplicationContext 无法访问我的 spring 组件?

java - java.awt 的 Android 替代品(BufferedImage 和 Raster)

java - 如何从类路径加载 ICC 配置文件?

java - PDF/A 已通过印前检查正确验证,但在线 pdf-tools 无法验证它