在 C++ 中测量 postscript 字体宽度
Measure postscript font width in C++
这不会那么难,但我就是做不到。 google、Whosebug 或 ubuntu 或 ghostscript 的文档都没有帮助。
我正在从 C++ 生成后记。我把文字逐字处理line-wrap。为了决定下一个单词的放置位置以及它是否适合当前行,我依靠 freetype 来测量每个字形的 "advance"。
文本是普通文本和源代码的混合,所以我有两种字体。我为普通文本选择了 Helvetica,为源代码选择了 Courier,因为两者都可以在 postscript 中轻松获得并且不需要嵌入。我的后记输出中有问题的部分并不比
复杂多少
(Helvetica) findfont 11 scalefont setfont
40 100 moveto (hello world) show
123 100 moveto (hello again) show % I care for the first number
当然还有适当的eps header等等
我没能在我的 ubuntu 16.04 系统上找到字体文件,所以我从免费字体网站下载了最好的猜测。事实证明,它们显然不同于我的后记解释器所使用的那些。至少,在使用 epstopdf
转换为 PDF 后(据我所知,它随 LaTeX 一起提供),我发现我的 Helvetica 字体太宽而我的 Courier 字体太窄,所以字间距关闭了,直到长词与后续词重叠。
我的问题:如何获得与 postscript 解释器匹配的字体宽度测量值?
- 我什至不确定这个问题是否是 well-posed,但不知何故我假设有一种且只有一种参考 Helvetica 字体,因此 postscript 输出在所有系统和打印机上看起来都一样。
- 让 freetype 加载正确的字体可能是最简单的解决方案,但我不知道如何找到这些文件。
- 下载完全匹配字体的来源也可以解决问题,尽管下载两次会很奇怪。
- 更好的是,向像 ghostscript 这样的 postscript 解释器询问基本事实会更好,但是 ghostscript 库文档很少,我没有找到任何示例。
- 我可以创建一个 postscript 文件,打印使用 [=12=] 获得的文本的宽度,转换为 pdf,然后提取文本。那将是丑陋和缓慢的,我想寻求一个合适的 C++ 解决方案。
在这些或其他方向中的任何一个方面取得进展都绝对很棒!
您使用的字体应该有一个 .afm (Adobe Font Metrics) 文件,您可以从 if 它是 PostScript 字体中读取字体规格。 'base 13' 字体在所有 PostScript 实现中的度量标准方面也应该相同。当然,如果您使用 TrueType 字体来获取指标,那么它们可能与 PostScript 字体不同。
您还没有说您使用的是什么 PostScript 解释器,可能是它没有使用标准字体,但我猜您使用的是 Ubuntu 中的 TrueType 字体,这并不完全匹配您在 'interpreter' 中使用的 PostScript。如果没记错的话,您可以查看 /etc/fonts/fonts.conf 以查看字体的存储位置。
FWIW Ghostscript 附带了与 Adobe 字体匹配的 base 13 字体的实现,PostScript 解释器应该匹配这些字体。然而,我们不提供 AFM 文件,但您可以将字体加载到 Fontographer 中,或使用 FreeType,或者通过在 PostScript 程序中使用 stringwidth(而不是 textwidth)来简单地获取提前宽度。
我不会说 Ghostscript 的文档是 'sparse'。也许很难找到您想要的东西,但是那里有很多文档。只是use.htm,基本信息,是一个265KbHTML的文件。
当然,最后一个选择是下载您在 PostScript 程序中实际使用的字体,然后您就知道它们与您最初用于创建 PostScript 的指标匹配。与 PDF 一样,强烈建议这样做,特别是对于 base 13 之外的字体,因为这是获得可靠输出的唯一方法。
这不会那么难,但我就是做不到。 google、Whosebug 或 ubuntu 或 ghostscript 的文档都没有帮助。
我正在从 C++ 生成后记。我把文字逐字处理line-wrap。为了决定下一个单词的放置位置以及它是否适合当前行,我依靠 freetype 来测量每个字形的 "advance"。
文本是普通文本和源代码的混合,所以我有两种字体。我为普通文本选择了 Helvetica,为源代码选择了 Courier,因为两者都可以在 postscript 中轻松获得并且不需要嵌入。我的后记输出中有问题的部分并不比
复杂多少(Helvetica) findfont 11 scalefont setfont
40 100 moveto (hello world) show
123 100 moveto (hello again) show % I care for the first number
当然还有适当的eps header等等
我没能在我的 ubuntu 16.04 系统上找到字体文件,所以我从免费字体网站下载了最好的猜测。事实证明,它们显然不同于我的后记解释器所使用的那些。至少,在使用 epstopdf
转换为 PDF 后(据我所知,它随 LaTeX 一起提供),我发现我的 Helvetica 字体太宽而我的 Courier 字体太窄,所以字间距关闭了,直到长词与后续词重叠。
我的问题:如何获得与 postscript 解释器匹配的字体宽度测量值?
- 我什至不确定这个问题是否是 well-posed,但不知何故我假设有一种且只有一种参考 Helvetica 字体,因此 postscript 输出在所有系统和打印机上看起来都一样。
- 让 freetype 加载正确的字体可能是最简单的解决方案,但我不知道如何找到这些文件。
- 下载完全匹配字体的来源也可以解决问题,尽管下载两次会很奇怪。
- 更好的是,向像 ghostscript 这样的 postscript 解释器询问基本事实会更好,但是 ghostscript 库文档很少,我没有找到任何示例。
- 我可以创建一个 postscript 文件,打印使用 [=12=] 获得的文本的宽度,转换为 pdf,然后提取文本。那将是丑陋和缓慢的,我想寻求一个合适的 C++ 解决方案。
在这些或其他方向中的任何一个方面取得进展都绝对很棒!
您使用的字体应该有一个 .afm (Adobe Font Metrics) 文件,您可以从 if 它是 PostScript 字体中读取字体规格。 'base 13' 字体在所有 PostScript 实现中的度量标准方面也应该相同。当然,如果您使用 TrueType 字体来获取指标,那么它们可能与 PostScript 字体不同。
您还没有说您使用的是什么 PostScript 解释器,可能是它没有使用标准字体,但我猜您使用的是 Ubuntu 中的 TrueType 字体,这并不完全匹配您在 'interpreter' 中使用的 PostScript。如果没记错的话,您可以查看 /etc/fonts/fonts.conf 以查看字体的存储位置。
FWIW Ghostscript 附带了与 Adobe 字体匹配的 base 13 字体的实现,PostScript 解释器应该匹配这些字体。然而,我们不提供 AFM 文件,但您可以将字体加载到 Fontographer 中,或使用 FreeType,或者通过在 PostScript 程序中使用 stringwidth(而不是 textwidth)来简单地获取提前宽度。
我不会说 Ghostscript 的文档是 'sparse'。也许很难找到您想要的东西,但是那里有很多文档。只是use.htm,基本信息,是一个265KbHTML的文件。
当然,最后一个选择是下载您在 PostScript 程序中实际使用的字体,然后您就知道它们与您最初用于创建 PostScript 的指标匹配。与 PDF 一样,强烈建议这样做,特别是对于 base 13 之外的字体,因为这是获得可靠输出的唯一方法。