如何计算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数组的计算过程:
- 绘制字符
H,之后的调整值是6:- 转换为文本空间单位:
6 / 1000 = 0.006 - 实际用户空间偏移:
0.006 * 20 = 0.12(这就是H和e之间的额外微调间距,属于字距调整)
- 转换为文本空间单位:
- 绘制字符串
ello,之后的调整值是54:- 转换为文本空间单位:
54 / 1000 = 0.054 - 实际用户空间偏移:
0.054 * 20 = 1.08(这个偏移量足够大,视觉上和单词间的空格一致,所以被阅读器识别为空格)
- 转换为文本空间单位:
- 绘制字符串
Wor,之后的调整值是7:- 转换为文本空间单位:
7 / 1000 = 0.007 - 实际用户空间偏移:
0.007 * 20 = 0.14(这是r和l之间的字距调整)
- 转换为文本空间单位:
- 最后绘制字符串
ld,没有后续调整值,结束。
总结通用计算逻辑
如果要计算TJ指令中的间距,遵循以下步骤:
- 取出TJ数组中的每个数字
n,先转换为文本空间单位:n / 1000 - 将转换后的值乘以当前Tm矩阵的水平缩放因子(即矩阵第一个参数
a),得到实际显示的偏移量 - 注意:真正的「字间距」仅针对空格字符,需要结合空格默认宽度、Tc字间距参数和缩放因子计算;你例子里的54只是视觉上模拟空格的字符间距调整,不属于标准字间距范畴。
内容的提问来源于stack exchange,提问作者Alex




