【问题标题】:GhostScript - wrong font substitution (wrong characters)GhostScript - 错误的字体替换(错误的字符)
【发布时间】:2016-02-08 06:06:46
【问题描述】:

我正在尝试将 pdf 文件转换为图像。

命令:gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 myfile.pdf

输出:

Can't find CID font "MyStrangeNonEmbeddedFont".
Attempting to substitute CID font /Adobe-Identity for /MyStrangeNonEmbeddedFont, see doc/Use.htm#CIDFontSubstitution.
The substitute CID font "Adobe-Identity" is not provided either. attempting to use fallback CIDFont.See doc/Use.htm#CIDFontSubstitution.
Loading a TT font from /some/path/DroidSansFallback.ttf to emulate a CID font Adobe-Identity ... Done.

字体已成功替换为 DroidSansFallback.ttf,但所有字符均不正确。例子:

'C' is substituted with '<'
'6' is substituted with '>'
'B' is substituted with '@'
'D' is substituted with 'B'

有办法解决吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果您还有时间,请阅读简短的介绍性 tour 以熟悉 Stack Overflow。您能否添加一个指向您遇到此问题的可下载 PDF 的链接?这样我们至少可以检查问题是否来自输入文件。您可以edit您的问题添加链接。
  • 盲目替换通常是个坏主意。只需按照ghostscript advice 并将正确的候选人放在正确的目录中,然后再试一次。
  • @Mike'Pomax'Kamermans - 我做到了,使用了几种不同的字体(CID 和备用 TFF)。字符仍然是错误的,但有趣的是仍然是相同的方式 - “B”是“D”等等。
  • 如果“替换字体”的字符 ID 映射(CID 字体的 CID 部分)与原始字体使用的 CID 映射不匹配,则会发生这种情况。如果情况很少,您可以尝试编辑目标字体并手动更改其 CID 映射(老实说,这有点麻烦),或者您可以尝试获取副本使用的原始字体

标签: linux pdf fonts ghostscript truetype


【解决方案1】:

评论太长,作为答案添加。

这就是 PDF 规范强烈建议嵌入 CIDFonts 的原因。

字符代码 -> CID -> 字形描述是规范的一个复杂领域,比常规字体更复杂。

要做到这一点,唯一的方法是使用未嵌入的原始字体。 “修复”这个问题的最佳选择是嵌入字体并制作一个新的 PDF 文件。

如果您不能这样做,那么您可以获取字体并将特定条目添加到 cidfmap。

如果失败,您可以尝试编辑 PDF 文件中的 CMap(CMap 将字符代码映射到 CID)或文档中的字符代码,以匹配您可用的任何字体(这可能需要大量工作)。

CIDSystemInfo 的排序“可能”会为您提供一些线索,您可以使用注册表和排序来确定 CID 与实际字形的关系。

如果您有一个真正的 CIDFont 可以用作替代品可能能够操纵字形的 CID,但这会很困难。如果您使用 TrueType 字体作为 CIDFont 的替代品,那么您无法更改 Ghostscript 将为该 CIDFont 生成的 CMap。

【讨论】:

  • 谢谢,@KenS。有些东西我不明白 - pdftotext 能够很好地从 PDF 中检索文本,所以我们可以假设 ghostscript 能够理解 PDF 文件中的文本。那么,为什么它不能“仅仅”用任何“愚蠢”的字体甚至纯文本(“(whatever)show”)来写呢?
  • 你不能使用字体,你必须使用 CIDFont。在没有看到文件的情况下,我什至无法开始猜测到底发生了什么,但是您假设缺少的字体的字符代码->CID 与替换字体的字符代码->CID 相同.这可能不会是真的。我们正在替换 TrueType 字体,这意味着我们必须映射字符代码->CID,然后从 CID->GID 进行进一步映射(因为 TrueType 字体使用 GID)。现在所有这些都发生在幕后,但我们为该字体选择一组不同的 CID 也就不足为奇了。
  • 我的猜测是 pdftotext 正在做一些“愚蠢”的事情,比如假设(原始)字符代码可以用作 ASCII,这对于 CIDFonts 来说是完全错误的,但有时它可能会起作用。从 PDF 中获取“文本”的唯一可靠方法是,如果字体具有关联的 ToUnicode CMap,它将字符代码映射到 Unicode 代码点。我冒昧地猜测你的原始文件没有,所以基本上所有的赌注都没有了。您没有说明您使用的是什么版本的 Ghostscript,但我建议您尝试最新版本,我们会不断改进。
猜你喜欢
  • 2013-09-13
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多