【问题标题】:Pdf embedded fonts ignored by pdftopspdftops 忽略的 pdf 嵌入字体
【发布时间】:2013-10-08 05:11:54
【问题描述】:

我一直在尝试将所有丢失的字体嵌入到 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 不能嵌入这种字体? 我错过了什么吗?

如果您不想按照我之前描述的步骤生成自己的文件,我的测试文件可用here

TIA。

【问题讨论】:

  • 您究竟是如何使用 iTextSharp 事后嵌入字体的?
  • 我遵循了您提到的相同 itext 示例(使用 itextSharp),因为字体不是 TrueType,我使用 PdfName.FONTFILE3 代替。所以我需要指定所需的子类型,为此我关注this iText post。这样,pdf 就“足够接近”正确性了,许多工具都没有报告任何问题,但 pdftops 确实如此,@VadimR 解释了原因。

标签: pdf fonts itextsharp


【解决方案1】:

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

【讨论】:

  • 实际上 iTextSharp 没有将字体事后嵌入的功能(即在现有文档中为现有的非嵌入字体)作为其高级 API 的一部分;不过,它有一个公共的低级 API,它几乎可以用于任何类型的操作,并且确实有一个 example 展示了如何使用这个低级 API 来进行这种事后字体嵌入。低级 API 的使用当然需要您知道自己在做什么,并允许您以多种方式自行其是... ;) 我假设 @Nomada 在这里使用了 C# 挂件。
  • @VadimR,只是一个松散的结局。我已经生成了 Bergamo Stf.pdf 的 1.6 版本 pdf 克隆(没有嵌入字体),以防 pdftops 忽略 1.4 文件的 1.6 功能。我的系统上安装了 Bergamo.otf,但在这种情况下 pdftops 没有嵌入字体。它可以将它与您的解决方案完美嵌入,因此它可以处理字体......
  • 这可能无关 - 此实用程序的另一个问题。上面的解决方案(解释)是关于嵌入字体的,当 FontFile Subtype 错误时(尽管 that 不是 pdftops 的问题,而是 PDF 文件的创建者)。现在,如果没有嵌入字体,pdftops 会在系统字体中查找它们,但并不总是成功。如果字体是 Type1 或带有后记轮廓的 OTF(作为您的字体),它似乎失败了 - 我检查的任何字体都是这种情况,而不仅仅是 BergamoStd-Regular.otf。但是,如果字体是 TTF 或 OTF “具有真实类型轮廓”,则它已成功找到并嵌入到 PS 中。
  • + 我使用 FontForge 将 BergamoStd-Regular.otf 转换为 TrueType(可能是“TrueType 风格的 OpenType”),将其放入我的 .fonts 文件夹 - 然后 pdftops 轻松找到并嵌入转换成原始的“Bergamo Std.pdf”。
猜你喜欢
  • 2018-03-22
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2015-02-16
  • 2014-12-17
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多