这不是很难,但我根本无法解决。 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解释器匹配的字体宽度测量值?
textwidth
获得的文本的宽度,转换为pdf,然后提取文本。那将是丑陋且缓慢的,我想寻求一个合适的C ++解决方案。在任何这些方向或其他方向上的进步都是绝对好的!
答案 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以外的字体,这是获得可靠输出的唯一方法。