在C ++中测量后记字体宽度

时间:2018-11-04 18:13:10

标签: c++ fonts ghostscript postscript

这不是很难,但我根本无法解决。 google,stackoverflow或ubuntu或ghostscript的文档都没有帮助。

我正在从C ++生成脚本。我逐字放置文本以处理换行。为了确定下一个单词的位置以及它是否适合当前行,我依靠自由类型来测量每个字形的“前进”。

文本是普通文本和源代码的混合,所以我涉及两种字体。我选择Helvetica作为普通文本,而选择Courier作为源代码,因为两者都可以在脚本中轻松获得,并且不需要嵌入。我的脚本输出中有问题的部分并没有比

复杂得多
(Helvetica) findfont 11 scalefont setfont
40 100 moveto (hello world) show
123 100 moveto (hello again) show   % I care for the first number

当然,有正确的eps标头等。

我无法在ubuntu 16.04系统上找到字体文件,因此我从免费字体网站下载了最佳猜测。事实证明,它们显然不同于我的附言解释器所使用的那些。至少,在用epstopdf(据我所知LaTeX随附)转换为PDF后,我发现Helvetica字体太宽而Courier字体太窄,因此单词间距不正确,直到长单词与后续单词重叠。

我的问题:如何获得与Postscript解释器匹配的字体宽度测量值?

  • 我什至不确定问题是否提出得当,但我确实以某种方式假定只有一种参考Helvetica字体,因此在所有系统和打印机上,Postscript输出看起来都是相同的。
  • 让freetype加载正确的字体可能是最简单的解决方案,但我不知道如何找到文件。
  • 下载完全匹配的字体的源也可以解决该问题,尽管将它们两次下载很奇怪。
  • 更好的方法是,最好向诸如ghostscript之类的后记解释器询问基本事实,但ghostscript库文档很少,我没有找到任何示例。
  • 我可以创建一个后记文件,打印出用textwidth获得的文本的宽度,转换为pdf,然后提取文本。那将是丑陋且缓慢的,我想寻求一个合适的C ++解决方案。

在任何这些方向或其他方向上的进步都是绝对好的!

1 个答案:

答案 0 :(得分:1)

您使用的字体应该具有.afm(Adobe字体指标)文件,如果 是PostScript字体,则可以从中读取字体指标。同样,在所有PostScript实现中,“ base 13”字体的度量标准也应相同。当然,如果您使用 TrueType 字体来获取指标,则它们可能与PostScript字体完全不同。

您尚未说明您使用的是哪种PostScript解释器,可能是它没有使用标准字体,但是我猜您正在使用Ubuntu中的TrueType字体,它与您所使用的PostScript字体不太匹配在您的“解释器”中使用。如果有足够的内存,您可以在/etc/fonts/fonts.conf中查看字体的存储位置。

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

我不会说Ghostscript的文档是“稀疏的”。也许很难找到想要的东西,但是那里有很多文档。基本信息use.htm是一个265Kb的HTML文件。

当然,最后的选择是下载您在PostScript程序中实际使用的字体,然后您知道它们与您最初用于创建PostScript的度量标准相匹配。与PDF一样,强烈建议这样做,尤其是对于基数13以外的字体,这是获得可靠输出的唯一方法。