在 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 解释器匹配的字体宽度测量值?

在这些或其他方向中的任何一个方面取得进展都绝对很棒!

您使用的字体应该有一个 .afm (Adobe Font Metrics) 文件,您可以从 if 它是 PostScript 字体中读取字体规格。 'base 13' 字体在所有 PostScript 实现中的度量标准方面也应该相同。当然,如果您使用 TrueType 字体来获取指标,那么它们可能与 PostScript 字体不同。

您还没有说您使用的是什么 PostScript 解释器,可能是它没有使用标准字体,但我猜您使用的是 Ubuntu 中的 TrueType 字体,这并不完全匹配您在 'interpreter' 中使用的 PostScript。如果没记错的话,您可以查看 /etc/fonts/fonts.conf 以查看字体的存储位置。

FWIW Ghostscript 附带了与 Adob​​e 字体匹配的 base 13 字体的实现,PostScript 解释器应该匹配这些字体。然而,我们不提供 AFM 文件,但您可以将字体加载到 Fontographer 中,或使用 FreeType,或者通过在 PostScript 程序中使用 stringwidth(而不是 textwidth)来简单地获取提前宽度。

我不会说 Ghostscript 的文档是 'sparse'。也许很难找到您想要的东西,但是那里有很多文档。只是use.htm,基本信息,是一个265KbHTML的文件。

当然,最后一个选择是下载您在 PostScript 程序中实际使用的字体,然后您就知道它们与您最初用于创建 PostScript 的指标匹配。与 PDF 一样,强烈建议这样做,特别是对于 base 13 之外的字体,因为这是获得可靠输出的唯一方法。