如何阻止 GhostScript 将 Times-Roman 替换为 NimbusRomNo9L-Regu(在 Windows 上)
How to stop GhostScript replacing Times-Roman with NimbusRomNo9L-Regu (on Windows)
我在 Windows 7 (x64) 上使用 Ghostscript v9.07 将 PostScript 文件转换为 PDF。在 PostScript 文件中,使用了 Times-Roman
和 Times-Bold
字体——这可以在 PostScript 纯文本中看到:
/Times-Roman findfont 24.00 scalefont setfont
.
.
.
/Times-Bold findfont 24.00 scalefont setfont
.
.
.
(这在 TeX 的 PostScript 输出中非常常见。)
当我使用 Ghostscript 将 PostScript 转换为 PDF 时,Ghostscript 使用 Nimbus-Roman 字体系列。
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 39
38016 2393624 2695216 1387174 4 done.
Loading NimbusRomNo9L-Medi font from %rom%Resource/Font/NimbusRomNo9L-Medi... 39
38016 2453738 2695216 1390537 4 done.
此输出表明它正在从可执行文件中嵌入的资源加载字体系列。在任何情况下,它都不是从 PostScript 文件加载它,因此它要么来自应用程序的分发版,要么来自操作系统。
无论字体平滑设置如何,在我尝试过的每个 PDF 查看器中,结果看起来都很糟糕。
我看不懂。生成的 PDF 文本 未 栅格化 - 您可以 select 它并剪切和粘贴它,仅文件大小表明它仍然是真实文本 - 所以我只能得出结论这是 Nimbus-Roman 字体的怪癖。
绝对没有理由使用那种字体,但是无论我做什么,我似乎都无法让 Ghostscript 使用来自 Windows 字体集的 Times-Roman
(或等效)字体.
我尝试了 -sFONTPATH
开关(在某些站点上也称为 sFONTDIR
- 我都试过了)无济于事,我去寻找字体映射文件来尝试破解它但没有找到一个用于 Windows - 安装目录中仅用于其他操作系统的字体映射。
如何更改此行为并阻止 Ghostscript 使用糟糕的字体?
让 Ghostscript 使用特定字体而不是替代字体的方法是在输入中嵌入字体。
这个:
/Times-Roman findfont 24.00 scalefont setfont
仅请求字体(和大小),不包括字体数据。在没有字体的情况下,Ghostscript 被迫使用替代字体。
在 Windows,Ghostscript 使用 ROM 文件系统,并且不附带支持文件。如果你想使用它们,你可以从 Git 中提取它们,然后使用 -I 开关。这将允许您更改控制 Ghostscript 已知的 CIDFonts 的 cidfmap,以及控制已知常规字体的 fontmap.GS。
但是,我看不到您使用明显位图字体所做的结果。也许您应该尝试更新版本的 Ghostscript。或者 post 一个原始的 PostScript 程序和转换后的 PDF 文件,以便可以检查它们。
[编辑从这里开始]
好的,所以基本上您在上面提出的内容存在一些问题。您的屏幕截图来自第 1 页,但 'font substitution',即 NimbusRoman-Regular 和 NimbusRoman-Bold(在当前版本的 Ghostscript 上)的加载发生在第 5 页。显然 [=第 5 页的 58=] 不会影响第 1 页的内容。如果您没有设置 -dBATCH,道德;调试问题时,请保持命令行简单。
实际的 'problem' 是 PostScript 程序对所有文本使用类型 3 位图字体,该字体在程序的 body 中定义。
简而言之,文本是一种糟糕的位图字体,因为这是创建 PostScript 的方式,它包含一种糟糕的位图字体并坚持使用它(FWIW 它似乎是以 300 dpi 呈现的)。
事实上,文档中唯一 是 可缩放的文本是使用 Times-Roman 的文本(不是替换,而是使用解释器的字体位图字体)。
这是页面顶部图形的文本; 'point'、'p'、'X'、'line'、'Y'、'u'、'W'。这已作为 EPS(最初称为 ray_space.eps)包含在文档中,这就是它使用真正可缩放字体的原因。如果放大第 5 页的顶部,您会看到可缩放字体继续看起来很平滑(图中的 body),而位图字体(例如图标题)看起来是位图的。
基本上,除了从原始 DVI 文档重新创建 PostScript 之外,您无能为力。这不是错误(或者至少不是 Ghostscript 错误)。
[和另一个编辑...]
恐怕不简单。
有 26 种名为 /Fa 到 /Fx 的字体,我不确定为什么会这样,因为每种字体都能够包含 255 个字形,但大多数不能(同时,它们不仅包含两个字形)。似乎没有充分的理由对字体进行编码。
程序根据需要使用每种字体,在需要不同字形时切换字体。例如:
1 0 bop
392 319 a Fx (An)21 b(In)n(tro)r(duction)g(to)h(Pro)t(jectiv)n
(e)h(Geometry)670 410 y(\(for)f(computer)f(vision\))
815
561 y Fw(Stan)c(Birc)o(h4eld)74 754 y Fv(1)67 b(In)n(tro)r(duction)
74 856 y Fu(W)l(e)
'Fx' 和 'Fw' 调用加载字体字典,然后由以下代码使用。坦率地说,Tex PostScript 很难理解,几乎可以认为它是为混淆而设计的。
确定哪些以 'F' 开头的 2 字节对需要删除或替换,哪些不需要(例如 ASCII 编码的图像数据)将很棘手。此外,字形在 y 轴上呈现翻转(以匹配正在使用的变换矩阵),因此您必须类似地调整 FontMatrix 以获得替代字体。
如果这些 TeX 字体词典中的字体总是包含相同的字形,则可以定义一组替代字体(/Fa 到 /Fx),它们可以是代替使用。当然,这些需要加载到 TeXDict 字典中以替换程序 header 中定义的那些。
我并不是说这是不可能的,但需要大量的研究工作来弄清楚什么是可能的,然后进行大量的编码来实现它。
我在 Windows 7 (x64) 上使用 Ghostscript v9.07 将 PostScript 文件转换为 PDF。在 PostScript 文件中,使用了 Times-Roman
和 Times-Bold
字体——这可以在 PostScript 纯文本中看到:
/Times-Roman findfont 24.00 scalefont setfont
.
.
.
/Times-Bold findfont 24.00 scalefont setfont
.
.
.
(这在 TeX 的 PostScript 输出中非常常见。)
当我使用 Ghostscript 将 PostScript 转换为 PDF 时,Ghostscript 使用 Nimbus-Roman 字体系列。
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 39
38016 2393624 2695216 1387174 4 done.
Loading NimbusRomNo9L-Medi font from %rom%Resource/Font/NimbusRomNo9L-Medi... 39
38016 2453738 2695216 1390537 4 done.
此输出表明它正在从可执行文件中嵌入的资源加载字体系列。在任何情况下,它都不是从 PostScript 文件加载它,因此它要么来自应用程序的分发版,要么来自操作系统。
无论字体平滑设置如何,在我尝试过的每个 PDF 查看器中,结果看起来都很糟糕。
我看不懂。生成的 PDF 文本 未 栅格化 - 您可以 select 它并剪切和粘贴它,仅文件大小表明它仍然是真实文本 - 所以我只能得出结论这是 Nimbus-Roman 字体的怪癖。
绝对没有理由使用那种字体,但是无论我做什么,我似乎都无法让 Ghostscript 使用来自 Windows 字体集的 Times-Roman
(或等效)字体.
我尝试了 -sFONTPATH
开关(在某些站点上也称为 sFONTDIR
- 我都试过了)无济于事,我去寻找字体映射文件来尝试破解它但没有找到一个用于 Windows - 安装目录中仅用于其他操作系统的字体映射。
如何更改此行为并阻止 Ghostscript 使用糟糕的字体?
让 Ghostscript 使用特定字体而不是替代字体的方法是在输入中嵌入字体。
这个:
/Times-Roman findfont 24.00 scalefont setfont
仅请求字体(和大小),不包括字体数据。在没有字体的情况下,Ghostscript 被迫使用替代字体。
在 Windows,Ghostscript 使用 ROM 文件系统,并且不附带支持文件。如果你想使用它们,你可以从 Git 中提取它们,然后使用 -I 开关。这将允许您更改控制 Ghostscript 已知的 CIDFonts 的 cidfmap,以及控制已知常规字体的 fontmap.GS。
但是,我看不到您使用明显位图字体所做的结果。也许您应该尝试更新版本的 Ghostscript。或者 post 一个原始的 PostScript 程序和转换后的 PDF 文件,以便可以检查它们。
[编辑从这里开始]
好的,所以基本上您在上面提出的内容存在一些问题。您的屏幕截图来自第 1 页,但 'font substitution',即 NimbusRoman-Regular 和 NimbusRoman-Bold(在当前版本的 Ghostscript 上)的加载发生在第 5 页。显然 [=第 5 页的 58=] 不会影响第 1 页的内容。如果您没有设置 -dBATCH,道德;调试问题时,请保持命令行简单。
实际的 'problem' 是 PostScript 程序对所有文本使用类型 3 位图字体,该字体在程序的 body 中定义。
简而言之,文本是一种糟糕的位图字体,因为这是创建 PostScript 的方式,它包含一种糟糕的位图字体并坚持使用它(FWIW 它似乎是以 300 dpi 呈现的)。
事实上,文档中唯一 是 可缩放的文本是使用 Times-Roman 的文本(不是替换,而是使用解释器的字体位图字体)。
这是页面顶部图形的文本; 'point'、'p'、'X'、'line'、'Y'、'u'、'W'。这已作为 EPS(最初称为 ray_space.eps)包含在文档中,这就是它使用真正可缩放字体的原因。如果放大第 5 页的顶部,您会看到可缩放字体继续看起来很平滑(图中的 body),而位图字体(例如图标题)看起来是位图的。
基本上,除了从原始 DVI 文档重新创建 PostScript 之外,您无能为力。这不是错误(或者至少不是 Ghostscript 错误)。
[和另一个编辑...]
恐怕不简单。
有 26 种名为 /Fa 到 /Fx 的字体,我不确定为什么会这样,因为每种字体都能够包含 255 个字形,但大多数不能(同时,它们不仅包含两个字形)。似乎没有充分的理由对字体进行编码。
程序根据需要使用每种字体,在需要不同字形时切换字体。例如:
1 0 bop
392 319 a Fx (An)21 b(In)n(tro)r(duction)g(to)h(Pro)t(jectiv)n
(e)h(Geometry)670 410 y(\(for)f(computer)f(vision\))
815
561 y Fw(Stan)c(Birc)o(h4eld)74 754 y Fv(1)67 b(In)n(tro)r(duction)
74 856 y Fu(W)l(e)
'Fx' 和 'Fw' 调用加载字体字典,然后由以下代码使用。坦率地说,Tex PostScript 很难理解,几乎可以认为它是为混淆而设计的。
确定哪些以 'F' 开头的 2 字节对需要删除或替换,哪些不需要(例如 ASCII 编码的图像数据)将很棘手。此外,字形在 y 轴上呈现翻转(以匹配正在使用的变换矩阵),因此您必须类似地调整 FontMatrix 以获得替代字体。
如果这些 TeX 字体词典中的字体总是包含相同的字形,则可以定义一组替代字体(/Fa 到 /Fx),它们可以是代替使用。当然,这些需要加载到 TeXDict 字典中以替换程序 header 中定义的那些。
我并不是说这是不可能的,但需要大量的研究工作来弄清楚什么是可能的,然后进行大量的编码来实现它。