PDF垂直文本定位疑问:为何第二段文本显示在第一段下方?
PDF文本垂直位置计算偏差的原因解析
问题背景
给定以下PDF代码:
1 0 0 -1 0 792 cm q .75 0 0 .75 72 192.75 cm BT /F4 14.666667 Tf 1 0 0 -1 0 .80265617 Tm 0 -13.2773438 Td <0030> Tj 12.2087708 0 Td <0024> Tj 8.6870575 0 Td <003C> Tj 9.7756042 0 Td <0032> Tj 11.4001007 0 Td <0035> Tj ET Q q .75 0 0 .75 72 222.75 cm BT /F4 14.666667 Tf 1 0 0 -1 4.0719757 .80265617 Tm 0 -13.2773438 Td <002C> Tj 4.0719757 0 Td <0003> Tj 4.0719757 0 Td <0057> Tj 4.0719757 0 Td <004B> Tj 8.1511078 0 Td <004C> Tj 3.2561493 0 Td <0051> Tj 8.1511078 0 Td <004E> Tj ET Q
渲染结果为:
MAJOR I think
按照PDF 1.7规范计算后,得到第一段文本渲染位置y≈786,第二段y≈816,但PDF默认页面原点在底部、y轴向上,理论上第二段应在第一段上方,实际却在下方,问题出在两处关键遗漏:
关键错误点解析
1. 坐标系已被翻转,y轴方向改变
第一个cm操作1 0 0 -1 0 792是核心变换:
- 矩阵
0 -1实现了y轴的垂直翻转 - 平移参数
0 792将原点从页面左下角移到了左上角
经过该变换后,当前坐标系的y轴是向下的:y值越大,位置越靠下,而非默认的向上。这是最容易忽略的点。
2. 矩阵乘法顺序与TRM定义混淆
PDF规范中:
- CTM的累积顺序:每次
cm操作是将新矩阵右乘到当前CTM上(即CTM = CTM × M),变换的实际效果是先执行旧CTM的变换,再执行新矩阵的变换。 - TRM的计算:文本渲染矩阵
TRM = CTM × TM(先应用文本矩阵TM,再应用当前变换矩阵CTM),而非你之前使用的TM × CTM。
修正后的计算验证
第一段文本
- 经过两次
cm变换后,最终CTM的实际效果:将原始页面坐标(x,y)转换为(0.75x+72, 786.75-0.75y),此时y轴向下。 - 结合文本矩阵和
Td平移后,文本基线的最终y坐标≈776(在翻转后的坐标系中,这个值较小,位置更靠上)。
第二段文本
- 第二次
cm的平移参数改为222.75,CTM转换后为(0.75x+72, 816.75-0.75y)。 - 文本基线最终y坐标≈806(在翻转后的坐标系中,这个值更大,位置更靠下)。
这就完全符合实际渲染结果:MAJOR在上,I think在下。
内容的提问来源于stack exchange,提问作者Kiwi
相关产品推荐
相关产品推荐

