You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:05:23