You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算PDF文档中的字间距?含特殊文本数组示例解析

如何计算PDF文档中的字间距(附你的示例拆解)

嘿,这个问题问到PDF文本排版的核心细节上了——TJ指令里的数字和字间距、字距调整的区别确实容易搞混,我来给你一步步拆解清楚:

先搞懂PDF TJ指令的基本规则

你给出的[(H)6(ello)54(Wor)7(ld)] TJ是PDF里的文本显示指令,这个数组的逻辑是交替出现字符串和数字

  • 字符串就是要绘制的字符;
  • 紧跟在字符串后的数字,是字符间距调整值,单位是千分之一文本空间单位(1/1000 text space unit)。这个值会直接加到当前字符的默认宽度之后,用来调整下一个字符的起始位置——正数是增加间距,负数是缩小间距。

区分「字距调整(Kerning)」和「字间距(Word Spacing)」

你提到的6、7和54的本质区别,得先明确这两个概念:

  • 字距调整(Kerning):是针对特定字符对(比如H&e、r&l)的细微间距调整,目的是让字符间的视觉效果更和谐,所以数值通常很小(比如你的例子里6、7),属于字符级别的微调。
  • 字间距(Word Spacing):是单词之间的空格宽度,PDF里默认是针对空格字符(ASCII 32)生效的——当文本中出现空格时,它的总宽度是「空格字符的默认宽度 + 字间距参数(Tc运算符,默认0)」,再结合当前的文本缩放因子计算。

你的例子里没有空格字符,但阅读器把54识别为空格,本质是这个调整值的大小刚好模拟了空格的视觉间距——它不是真正的字间距(因为没有空格字符),只是一个超大的字符间距调整而已。

针对你的示例,一步步计算间距

先看你给出的文本矩阵20 0 0 48 20 500.0 Tm:这个矩阵的a值(第一个参数20)是水平缩放因子,意思是1个文本空间单位 = 20个用户空间单位(PDF里的实际显示单位)。

现在拆解TJ数组的计算过程:

  1. 绘制字符H,之后的调整值是6:
    • 转换为文本空间单位:6 / 1000 = 0.006
    • 实际用户空间偏移:0.006 * 20 = 0.12(这就是H和e之间的额外微调间距,属于字距调整)
  2. 绘制字符串ello,之后的调整值是54:
    • 转换为文本空间单位:54 / 1000 = 0.054
    • 实际用户空间偏移:0.054 * 20 = 1.08(这个偏移量足够大,视觉上和单词间的空格一致,所以被阅读器识别为空格)
  3. 绘制字符串Wor,之后的调整值是7:
    • 转换为文本空间单位:7 / 1000 = 0.007
    • 实际用户空间偏移:0.007 * 20 = 0.14(这是r和l之间的字距调整)
  4. 最后绘制字符串ld,没有后续调整值,结束。

总结通用计算逻辑

如果要计算TJ指令中的间距,遵循以下步骤:

  • 取出TJ数组中的每个数字n,先转换为文本空间单位:n / 1000
  • 将转换后的值乘以当前Tm矩阵的水平缩放因子(即矩阵第一个参数a),得到实际显示的偏移量
  • 注意:真正的「字间距」仅针对空格字符,需要结合空格默认宽度、Tc字间距参数和缩放因子计算;你例子里的54只是视觉上模拟空格的字符间距调整,不属于标准字间距范畴。

内容的提问来源于stack exchange,提问作者Alex

火山引擎 最新活动