测量普通C中的字符串大小

时间:2013-07-30 07:33:54

标签: c pdf graphics fonts

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

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

我的问题是,从Type-1或OTF字体读取字形指标的最佳方法是什么,以便排版可以完美地完成?我特别关注 ascent descent width 指标,因为它们在PDF格式规范中被引用。


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

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


如果有人遇到这个问题,请查看a similar question I posted on Adobe forums,我也会收到一些有价值的信息。

2 个答案:

答案 0 :(得分:2)

[本文写作原始问题的答案:

  

如果只使用字体文件,字符串和字体大小,使用普通C渲染为PDF时,如何测量字符串大小?有办法吗?

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

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

section 9.4.4 "Text Space Details" from ISO 32000-1

虽然这看起来有点复杂,但在您的情况下很可能会减少到简单的数学,因为您说您手动生成整个PDF ,因此,很可能对变量有微不足道的值参与。

很遗憾,您没有提供手动生成的PDF;否则你可以更详细地告诉你在你的情况下可以减少什么方程式。

答案 1 :(得分:1)

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