Ghostscript - 在运行时确定最终替代字体
Posted
技术标签:
【中文标题】Ghostscript - 在运行时确定最终替代字体【英文标题】:Ghostscript - determine the final substituted font at runtime 【发布时间】:2014-11-21 06:16:12 【问题描述】:我有一个文件正在尝试查找可用于重新编码的字体,因为某些内部原因(我还不知道为什么,它只是另一个你自己的 PS 文件)。
它使用以下逻辑来做到这一点:
/Arial
dup /Font resourcestatus pop pop pop /ArialMT ifelse
dup /Font resourcestatus pop pop pop /Helvetica ifelse
意图是最好的可用字体键在最后的堆栈上。
在 Windows 上的 Ghostscript 中,这似乎是 /Arial(因为 resourcestatus 返回 2)。但是,尝试查找字体会导致常见警告:
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Querying operating system for font files...
Didn't find this font on the system!
Substituting font Helvetica for ArialMT.
在我们尝试使用之前,是否可以在这种情况下确定最终的 /Helvetica 字体键?
这很重要,因为替换过程会导致一些其他嵌入字体丢失的错误。肯定是某个地方的错误导致了这种情况,但我仍在调查,无论如何都很好奇。
【问题讨论】:
【参考方案1】:答案是“不是真的”。 Ghostscript 中的字体替换机制相当复杂,并且涉及一些基于字体特征的启发式算法。它还取决于您如何配置 Ghostscript 和安装的字体。
在您的具体情况下,您可能会发现 fontmap.GS 中有 Arial 的定义。事实上,默认的 fontmap.GS 包括这个:
/宋体 /ArialMT ;
但是,除非您在 Windows 系统上安装(并使用 GS 安装程序设置 FontPath),否则它实际上不会安装 ArialMT 参考。因此,由于没有定义 ArialMT,它会恢复为“如果一切都失败”字体,即 Helvetica。与您在上面的背面通道上看到的差不多。
避免字体替换问题的最佳选择是仔细配置 fontmap.GS,Ghostscript 源附带的版本是一个示例,它不打算在每个系统上“按原样”使用.
【讨论】:
感谢您清理它。在这种情况下,我只是使用编译到 Windows 版本中的默认值。我只是在研究替换字体时文件的行为,因为它似乎阻止了未来的字体被定义,或者类似的东西。 字体替换代码不会阻止字体的定义(或重新定义),但当然,如果 PostScript 程序在定义命名字体之前测试它是否存在,那么它可能会产生这种效果。但是,字体替换代码不会阻止任何东西。 如果您真的想了解神秘的字体替换启发式方法,那么您可以查看 gs_fonts.ps、gs_fapi.ps、gs_fntmem.ps。对于 CIDFonts,您需要查看 gs_cidcm.ps、gs_ciddc.ps、gs_cidfn.ps 和 gs_cmap.ps。 gs_ttf.ps 和 gs_cidtt.ps 用于直接加载 TrueType 字体,但不用于替换。请注意,您需要具备出色的 PostScript 工作知识才能在这些程序中走得更远。 谢谢肯 - 我昨天看了看,并确认我没有出色的工作知识 :) 这个问题类似于我不久前在 ***.com/questions/18477930/… 提出的问题,其中多次调用 'true setglobal execform false setglobal' 替换字体定义,但前提是最初替换了字体。 这与本地/全局虚拟机有关,我记得替换字体是在本地虚拟机中定义的,而嵌入字体是在定义字体时有效的虚拟机模式中定义的。 Distiller 所做的当然取决于 Distiller。它不必像我们那样严格遵循 PostScript 规则,因为它只转换为 PDF。而且,在某种程度上,字体替换几乎是特定于设备的,解释器可以或多或少地做他们想做的事。以上是关于Ghostscript - 在运行时确定最终替代字体的主要内容,如果未能解决你的问题,请参考以下文章
合并时批处理文件不会运行(在批处理文件中退出 ghostscript
在 ASP.NET Azure 网站上使用 Ghostscript.Net