0

我一直在尝试将所有丢失的字体嵌入到 pdf 中,以避免在打印或渲染它们时因为字体替换而出现“意外”。

因此,我使用BergamoStd字体创建了一个仅包含“Bergamo Std”文本的文档。之后使用 Pdf Creator 生成没有字体嵌入的 pdf:BergamoStd.pdf

使用 C#/iText 我将字体嵌入到 pdf 中。(BergamoStd-embedded.pdf) 无论系统中是否存在字体,我都可以正确渲染嵌入的 pdf。Adobe reader、qpdfview、evince 可以毫无问题地渲染 pdf,acrobat reader 告诉字体是嵌入的以及 pdffonts。

qpdf没有报告此 pdf 的任何问题。

如果我使用ghostscript(9.07)从嵌入的pdf生成一个ps文件,我会得到一个可以渲染和打印的ps,并且字体也嵌入到该ps文件中。pdf2ps 当然会得到与 ghostscript 相同的结果。甚至Windows 中的xpdf也会生成一个有效的 ps 文件,其中嵌入了字体。

但是如果我使用 poppler-utils (v0.24) 的 pdftops 生成 ps 文件,我会得到一个没有嵌入字体的小 ps 文件。

更深入; 即使系统中存在 bergamoStd.ttf 文件,pdftops 也无法在 .ps 中嵌入字体,无论输入的 pdf 是嵌入字体还是未嵌入字体。

谁能解释为什么 pdftops 不能嵌入这种字体?我错过了什么吗?

如果您不想按照我之前描述的步骤生成自己的文件,我的测试文件可以在这里找到。

TIA。

4

1 回答 1

1

您的文件Bergamo Std-embeded.pdf有问题。嵌入字体在 FontDescriptor > FontFile3 > 字体字典的子类型条目中标记为“Type1C”(Type1 Compact,或 CFF)。它是由例如 pdffonts (poppler-utils) 或 mutool (of MuPDF) 报告的。但实际上,它以原始 OpenType 格式嵌入并保持不变。您可以使用例如 mutool 从 PDF 中提取它并与 BergamoStd-Regular.otf 进行比较 - 相同的文件。

C#/iText 应该做的(或者你,如果它是这个库的开发人员责任)要么明确地将嵌入式 FontFile 的子类型标记为 OpenType(PDF 1.6 功能),要么将 BergamoStd-Regular.otf 转换为 pfb(或进一步转换为 cff,也许 - 如果一切都是手动控制的)嵌入之前。

我在您的Bergamo Std-embeded.pdf 中将“Type1C”字符串更改为“OpenType” (使用 Enfocus PDF 浏览器,但 PoDoFo 或 PDFEdit 也应该完成这项工作),然后 pdftops 从固定 pdf 创建正确(即嵌入字体)后记. 我认为(但没有检查)将 otf 文件转换为 cff 并将其嵌入就地也将修复原始 pdf。

看起来您提到的所有实用程序对于轻微的 PDF 语法违规都非常宽容,但 pdftops 不是。

于 2013-10-04T15:51:49.873 回答