【问题标题】:Measuring string size in plain C在普通 C 中测量字符串大小
【发布时间】:2013-07-30 07:33:54
【问题描述】:

假设您正在开发的 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 编写的文本应该从哪里开始,但我不知道如何引用这些信息,以避免所有混乱的字体解析。


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

【问题讨论】:

  • sizeof()? 你在找什么?
  • 我没听懂你说的字体
  • 你能改进一下@David 的问题吗?
  • @PaulR 是的,就是这样。我希望它独立于平台。
  • 亲爱的大卫,欢迎来到 stackoverflow。从 cmets 的数量来看,您的问题似乎可以通过更清楚地说明您正在使用的内容、您尝试过的内容以及失败的内容来改进。试图帮助您的人会对此表示赞赏,并且可能会提高您获得有意义答案的机会。

标签: c pdf graphics fonts


【解决方案1】:

[本文是作为对原始问题的回答而写的:

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

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

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

虽然这看起来有点复杂,但在您的情况下,它很可能会简化为琐碎的数学运算,因为您说 手动生成整个 PDF,因此,变量的值很可能是琐碎的参与。

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

【讨论】:

  • 感谢您帮助我。不幸的是,在描述问题是什么时,我似乎没有让自己清楚。我现在正在阅读 Adob​​e PDF 规范两天,但我还没有找到我的问题的答案。跟踪文本状态背后的数学并不是导致问题的原因;问题是如何获取各个字形的大量字体信息,尤其是上升和下降。当我试图避免解析字体文件时,我在问这是否可以在纯 PostScript 中完成,比如(以某种方式)引用上一个文本批处理结束的位置。
  • 还有一件事;感谢您对上一篇文章的回答。你回答了我一直在问的问题,但我似乎没有问对。
  • 恐怕获取各个字形的大量字体信息避免解析字体文件在这里相互矛盾。 PDF 语法中的 PDF 仅具有非常基本的字体信息(与愚蠢的 PDF 查看器呈现 PDF 所需的一样多)。必须在字体中搜索其他所有内容,例如单独的上升和下降值。
  • 我明白了。这正是我不确定的。除了字体程序本身之外,PDF 中携带的关于字体的信息量。那么/Widths 数组是否只是为了支持基本渲染/向“愚蠢的读者”伸出援助之手?没有别的吗?
  • @David Width 数组表示:“在位置 p 绘制字符后,向前移动这么远以绘制下一个字符。” (并且这个值必须按照上面公式的描述进行调整。)它没有说明字形本身,它通常更小,参见。 ISO 32000-1 第 9.2.4 节中的图 39。
【解决方案2】:

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

【讨论】:

  • 这就是我要找的!是否必须从各种字体格式中解析这些指标?
  • 是的,您必须为要支持的每种字体格式编写解析器,并从字体文件中提取指标。
  • 好吧,让我们面对现实。如果您不介意,还有一个问题:是否可以提取 ascentdescentwidthheight以合理的方式衡量单个字形? (合理:将信息解析出来,包含在文件中。不合理:计算贝塞尔曲线,然后寻找极值点。)
  • @David 这本身就是一个有趣的问题。
  • @David 是的,所有这些信息(上升、下降)都可以直接在字体文件中作为某些字体定义结构的一部分使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2022-12-17
  • 2011-11-26
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多