1

想象一下,您正在从正在开发的 C 程序中“手动”(没有库)生成 PDF 程序。您想编写一个下标任意文本的函数。在这里可以想象的最好的事情是 TeX在排版数学时如何下标\inf和符号。\sup

现在,当您为\inf符号添加下标时,不会发生任何有趣的事情,它就在那里。另一方面,为\sup符号添加下标会导致下标文本向下移动几个单位,因为字母“p”的下降幅度略低于字体基线。

那么我的问题是,从 Type-1 或 OTF 字体读取字形度量的最佳方法是什么,以便可以完美地完成排版?我正在寻找特别是在 PDF 格式规范中提到的ascentdescentwidth指标。


由于解析字体文件看起来像“做工作而不是 PostScript 解释器”,它必须执行这些计算以放置最终构成单词和段落的单个字母,如果我可以参考“最后一个文本的结尾”会很好字符串”在 PDF PostScript 流中。

考虑一下 PDF PostScript 流的这个片段:BT /F1 12 Tf 0 0 Td (Hello World!)Tj (Hello again!)Tj ET“Hello again”精确地呈现在它应该在的位置。所以 PostScript 解释器(当然)知道下一批文本Tj应该从哪里开始,但我不知道如何引用这些信息,这样我就可以避免所有混乱的字体解析。


如果有人遇到这个问题,请查看我在 Adob​​e 论坛上发布的类似问题,我也在那里获得了一些有价值的信息。

4

2 回答 2

2

[本文是作为原始问题的答案而编写的:

仅在给定字体文件、字符串和字体大小的情况下,使用纯 C 渲染为 PDF 时,如何测量字符串大小?有办法吗?

它与更新的问题并不真正匹配。]

PDF 文本渲染的机制和数学在 PDF 规范ISO 32000-1中有详尽的解释。最重要的是第 8 章图形和第 9章文本。第 9.4.4 节汇总了有关按顺序绘制的两个字符之间的水平和垂直位移的信息和计算

第 9.4.4 节

虽然这看起来有点复杂,但在您的情况下,它很可能会简化为微不足道的数学运算,因为您说您正在手动生成整个 PDF,因此,所涉及的变量很可能具有微不足道的值。

很遗憾,您没有提供您手工生成的 PDF;否则,您可以更详细地了解在您的情况下可以简化哪些方程式。

于 2013-07-30T08:28:11.643 回答
1

从字体文件中,您必须读取字体指标、每个字形的宽度 (GW)。这些宽度以 1000 单位网格的形式给出。您可以使用以下公式计算给定字体大小的字形的实际宽度:pageGlyphWidth = fontSize * GW / 1000;
然后用当前变换矩阵缩放计算值。

于 2013-07-30T08:28:21.087 回答