我一直在尝试将所有丢失的字体嵌入到pdf中,以避免因打印或渲染字体而导致出现“惊喜”。
所以我使用BergamoStd字体创建了一个仅包含“Bergamo Std”文本的文档。 之后使用Pdf Creator生成没有字体嵌入的pdf:BergamoStd.pdf
使用C#/ iText我将字体嵌入pdf中。 (BergamoStd-embedded.pdf) 无论系统中是否存在字体,我都能正确呈现嵌入式pdf。 Adobe阅读器,qpdfview,evince渲染pdf没有问题,acrobat reader告诉嵌入字体以及pdffonts。
qpdf并未使用此pdf报告任何不良内容。
如果我使用ghostscript(9.07)从嵌入式pdf生成ps文件,我会得到一个可以渲染和打印的ps,并且该字体也嵌入在该ps文件中。 pdf2ps当然得到与ghostscript相同的resoults。 Windows中的偶数xpdf生成一个有效的ps文件,其中嵌入了字体。
但如果我使用poppler-utils(v0.24)的pdftops生成ps文件,我会得到一个没有嵌入字体的小ps文件。
更进一步; pdftops无法在.ps中嵌入字体,即使系统中存在bergamoStd.ttf文件,无论输入pdf是否包含嵌入字体的文件。
有人可以解释为什么pdftops无法嵌入此字体吗? 我错过了什么吗?
如果您不想按照我之前描述的步骤生成您自己的文件,那么我的测试文件可用here。
TIA。
答案 0 :(得分:1)
您的文件 Bergamo Std-embeded.pdf 存在问题。嵌入字体在FontDescriptor>中标记为“Type1C”(Type1 Compact或CFF)。 FontFile3>字体字典的子类型输入。并且例如通过例如报道pdffonts(poppler-utils)或mutool(MuPDF)。但实际上,它在原始OpenType格式中的嵌入不变。您可以使用PDF格式从PDF中提取它mutool并与BergamoStd-Regular.otf进行比较 - 相同的文件。
C#/ iText应该做什么(或者,如果它是开发人员对此库的责任),要么将嵌入式FontFile的Subtype明确标记为OpenType(PDF 1.6特性),要么将BergamoStd-Regular.otf转换为pfb(或者进一步在嵌入之前,可能 - 如果一切都是手动控制的话。)
我在 Bergamo Std-embeded.pdf 中将“Type1C”字符串更改为“OpenType”(使用Enfocus PDF浏览器,但PoDoFo或PDFEdit也可以完成此工作),然后创建pdftops来自固定pdf的正确(即字体嵌入)postscript。我认为(但没有检查)将otf文件转换为cff并将其嵌入就地也将修复原始pdf。
看起来你提到的所有实用程序都是非常宽松的,因为轻微的PDF语法违规,但pdftops不是。