如何确定PostScript字体的高度和深度?

时间:2011-11-28 13:15:34

标签: fonts postscript

我正在寻找估算PostScript字体高度(上升空间)和深度(下降空间)的PostScript代码。可以使用字体的边界框({​​{1}})吗?`

以下是我的问题的一些背景:字体的字形位于基线上。显然,具有下行的字形将达到基线以下,我想知道基线下降器可以到达多远,以便我可以在布局中提供足够的空间。

我见过PostScript code that renders a given string to check its dimension。我对给定字体的一般答案很感兴趣。

2 个答案:

答案 0 :(得分:8)

嗯,你已经发现了两个“快捷方式”。 FontBBox给出了叠加在一起的字体中所有字形的边界框。 false charpath flattenpath pathbbox给出了指定字符串的框。

对于Type 3(用户定义)字体,这是您可以完全期望的;但是对于更受欢迎的Type 1字体, in 字体和“metrics”文件(对于其他应用程序)都有大量的度量信息。

但这是我不太清楚的部分。所以我要阅读(在Adobe Type 1手册中)并稍后扩展这个答案。

编辑:实际上,看起来这些可能是最好的方法。

一个垂直对齐值的数组,在Type 1字体中,在/ Private字典中,名称为/ BlueValues;但不能保证字体能够尊重它们。数组中的第一个数字是基线过冲;这是像'O'这样的字母的底边,它低于基线。并且阵列中的最大值将是上升高度过冲上限高度过冲(以较高者为准)。但是可以绘制任何单个字符而不考虑这些值(因此,不能保证)。

另一方面,FontBBox本身可以反映字体中存在的任何“特殊”字符的边界框,无论它们是否可以通过编码向量访问(即,你不能show他们,但必须glyphshow他们。)

因此,最好的选择可能是获取您打算使用的所有字符的字符串的pathbbox。这将忽略可能存在但与您的目的无关的任何其他角色的贡献。并且不要忘记flattenpath从曲线中移除控制点(可能远远超出“真实”边界框)。

答案 1 :(得分:5)

luser droog的答案看起来相当完整,毫无疑问比我的更强大,但我不满意这是确定标准字体的可用垂直空间的最简单方法,它允许我创建一个可行的{{1} }。这是我想出的:

newline

使用%!ps-nonconforming /inch {72 mul} bind def /Helvetica 10 selectfont 1 inch 10 inch moveto /fontheight currentfont dup /FontBBox get dup 3 get % top exch 1 get sub % top - bottom exch /FontMatrix get 3 get mul def % adjusted by height multiplier /lineheight fontheight 1.2 mul def % add 20% for line spacing /newline {0 lineheight neg rmoveto} bind def % negate height to move downwards gsave (lineheight: ) show lineheight 20 string cvs show grestore newline gsave (that worked!) show grestore showpage 运行它的结果:

ghostscript rendering of test.ps


一天后,再次看到这一点,并意识到OP希望分别对待上升器和下降器。所以这里只是使用下降器的例子:

gs test.ps

以及%!ps-nonconforming /inch {72 mul} bind def /Helvetica 30 selectfont 1 inch 2 inch moveto /descender currentfont dup /FontBBox get 1 get % bottom (negative number!) exch /FontMatrix get 3 get mul def % adjusted by height multiplier % first draw a gray line at base of text gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore gsave (descender: ) show descender 20 string cvs show ( pixels) show grestore gsave 0 descender 1 sub rmoveto % one pixel below lowest descender 7.5 inch 0 rlineto 0 setgray stroke grestore showpage 的结果: line under lowest descender