【问题标题】:How to embed fonts which don't have a font descriptor?如何嵌入没有字体描述符的字体?
【发布时间】:2016-10-03 07:45:58
【问题描述】:

我正在尝试将 PDF 转换为 PDFA-2B。而1 of my test files 包含没有字体描述符的 Type1 字体:

我需要嵌入这些字体。

如何嵌入这些字体?

我尝试创建字体描述符,但没有成功。

private static PdfDictionary addFontDesc(PdfDictionary font){
        PdfDictionary fontDescriptor;
        fontDescriptor = new PdfDictionary(PdfName.FONTDESCRIPTOR);
        PRIndirectReference fd = fontDescriptor.getIndRef();

        if (fd != null){
            font.put(PdfName.FONTDESCRIPTOR, fd);
            System.out.println("fontDescriptor was added to font " + font.getAsName(PdfName.BASEFONT).toString());
        }else {
            System.out.println("Error while trying to add fontDescriptor to " + font.getAsName(PdfName.BASEFONT).toString());
        }
        return font;
}

我总是收到NullPointerException

【问题讨论】:

  • 正如@mkl 在他对iTextSharp embed subset fonts in existing PDF 的评论中所解释的那样,您所问的问题在 Stack Overflow 帖子中无法回答。你需要聘请专家来实现你想要的。我投票结束这个问题,因为过于宽泛。你需要提供字体程序,你需要检查内容流,选择正确的编码,等等。向我们展示您的开发过程中的进展,我们可以提供帮助。问我们“为我做这件事”,我们将结束您的问题。
  • 基本字体不需要嵌入,PDF 查看器应该提供它们或其适当的替代品。请参阅 PDF 规范标准类型 1 字体(标准 14 字体)的第 9.6.2.2 节。 Type 1字体,被称为标准14字体,如下:Times-Roman、Helvetica、Courier、Symbol、Times-Bold、Helvetica-Bold、Courier-Bold、ZapfDingbats、Times-Italic、Helvetica-Oblique、Courier-Oblique , Times-BoldItalic, Helvetica-BoldOblique, Courier-BoldOblique 这些字体,或其字体规格和合适的替代字体,应提供给符合要求的读者。
  • @JoelGeraci 就 PDF 标准而言,不需要嵌入标准的 14 种字体。实际上,就该标准而言,不需要嵌入字体(Type 3 字体很特殊,因为没有字体程序可以嵌入)。但是 OP 想要生成 PDF/A 文件,这里的规则是:“用于在符合文件中呈现的所有字体的字体程序应嵌入该文件中。”
  • 缺少一个非常重要的信息:你用什么转换?我看到了代码,但没有说明此代码何时运行(转换的一部分?转换后?侧载实用程序?)。具体来说:始终为工作使用正确的工具。如果您需要将 PDF 转换为 PDFA-2B,显而易见的解决方案是使用 Adob​​e 的 PDF 工具来实现该转换,而不是为您自己的代码无法涵盖的 1000 页规范自行开发解决方案

标签: java pdf fonts itext


【解决方案1】:

正如@Bruno 在评论中已经说过的那样,您当前状态下的问题太宽泛了。因此,此答案仅关注您提出的具体问题部分:

总是得到 NullPointerException。

您似乎认为getIndRef

PRIndirectReference fd = fontDescriptor.getIndRef();

如果 fontDescriptor 不是一个间接对象(因为只有间接对象可以有间接引用),则将其设为间接对象。

这个假设是错误的。如果你在一个不是间接的对象上调用getIndRef,你会在观察时得到null


您可以使用PdfWriter 方法addToBody 间接创建任何PdfObject,该方法返回一个PdfIndirectObject,您可以使用getIndirectReference 查询其间接引用,

public PdfIndirectObject addToBody(final PdfObject object) throws IOException

public PdfIndirectObject addToBody(final PdfObject object, final boolean inObjStm) throws IOException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多