Fonts Ghostscript—在运行时确定最终替换的字体

Fonts Ghostscript—在运行时确定最终替换的字体,fonts,ghostscript,postscript,Fonts,Ghostscript,Postscript,我有一个文件,它正试图找到哪种字体可用于重新编码它的一些内部原因我不知道为什么,这只是另一个滚动您自己的PS文件 它通过一些逻辑来实现这一点,如: /Arial dup /Font resourcestatus{ pop pop }{ pop /ArialMT }ifelse dup /Font resourcestatus{ pop pop }{ pop /Helvetica }ifelse 其目的是使可用的最佳字体键位于堆栈的末尾 在Windows上的Ghostscript中,这似乎是

我有一个文件,它正试图找到哪种字体可用于重新编码它的一些内部原因我不知道为什么,这只是另一个滚动您自己的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.
在我们尝试使用final/Helvetica字体键之前,是否可以在这种情况下确定它


这很重要,因为替换过程会导致其他嵌入字体丢失的错误。肯定是某个地方有一个bug导致了这种情况,但我仍在调查,而且很好奇。

答案是“不是真的”。Ghostscript中的字体替换机制非常复杂,并且涉及一些基于字体特征的启发式方法。它还取决于您如何配置Ghostscript和安装的字体

在您的特定情况下,您可能会发现fontmap.GS中有一个Arial的定义。实际上,默认的fontmap.GS包括以下内容:

/Arial/ArialMT

但是,除非您安装在Windows系统上并使用GS安装程序设置FontPath,否则它实际上不会安装ArialMT的引用。因此,由于ArialMT没有定义,它将恢复为“如果其他所有操作都失败”字体,即Helvetica。和你在后面频道看到的差不多


避免字体替换问题的最佳方法是仔细配置fontmap.GS,Ghostscript源附带的版本就是一个例子,它并不打算“按原样”在每个系统上使用。

答案是“不是真的”。Ghostscript中的字体替换机制非常复杂,并且涉及一些基于字体特征的启发式方法。它还取决于您如何配置Ghostscript和安装的字体

在您的特定情况下,您可能会发现fontmap.GS中有一个Arial的定义。实际上,默认的fontmap.GS包括以下内容:

/Arial/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工作知识才能完成这些程序。感谢Ken-我昨天看了一眼,并确认我没有出色的工作知识:这个问题与我前段时间提出的一个问题类似,即多次调用“true-setglobal execform-false-setglobal”替换字体定义,但只有当字体最初被替换时才可以。那是与本地/全局VM有关的,我记得,被替换的字体是在本地VM中定义的,而嵌入式字体是在定义字体时生效的VM模式中定义的。当然,蒸馏器的作用取决于蒸馏器。它不必像我们一样严格遵循PostScript规则,因为它只转换为PDF。而且,在某种程度上,字体替换几乎是特定于设备的,口译员可以或多或少地做他们想做的事情。谢谢你的澄清。在本例中,我只是使用编译到Windows版本中的默认值。我只是在研究替换字体时文件的行为,因为它似乎会阻止将来定义字体或类似的内容。字体替换代码不会阻止字体的定义或重新定义,但如果PostScript程序在定义之前测试命名字体的存在,那么它可能会有这种效果。但是,字体替换代码仍然不会被阻止
任何东西。如果你真的想通过神秘的字体替换启发,那么你可以看看gs_font.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工作知识才能完成这些程序。感谢Ken-我昨天看了一眼,并确认我没有出色的工作知识:这个问题与我前段时间提出的一个问题类似,即多次调用“true-setglobal execform-false-setglobal”替换字体定义,但只有当字体最初被替换时才可以。那是与本地/全局VM有关的,我记得,被替换的字体是在本地VM中定义的,而嵌入式字体是在定义字体时生效的VM模式中定义的。当然,蒸馏器的作用取决于蒸馏器。它不必像我们一样严格遵循PostScript规则,因为它只转换为PDF。而且,在某种程度上,字体替换几乎是特定于设备的,口译员可以或多或少地做他们想做的事情。