【发布时间】: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,显而易见的解决方案是使用 Adobe 的 PDF 工具来实现该转换,而不是为您自己的代码无法涵盖的 1000 页规范自行开发解决方案