如何仅通过PDF操作列表计算文本字符串的坐标
PDF文本字符串坐标计算方案
结论:完全可以计算,只要全程跟踪文本对象内的状态变化,就能得到所有字符串在统一空间中的坐标,满足相对距离计算的需求。
需要跟踪的核心状态
每个BT(文本对象开始)到ET(文本对象结束)是独立的上下文,需要跟踪以下变量:
- 当前文本矩阵(
Tm):决定文本的基准位置、旋转、缩放等变换 - 当前字体:用于获取字形的水平宽度(你已有的字形与字体水平位移列表正好派上用场)
- 当前文本参数:字符间距(
Tc)、字间距(Tw)、文本缩放(Tz)、行距(TL)
具体计算逻辑(结合你的示例)
第一个文本对象(BT → ET)
BT启动文本对象,初始状态:Tm为单位矩阵,字体默认,文本参数默认(Tc=0等)0 7.3001 -7.3001 0 124.64 301.79 Tm:设置文本矩阵,此时字符串的起始基准坐标取矩阵最后两个值(124.64, 301.79)(无需纠结旋转的具体计算,统一用这个规则即可)A Tj:"A"的起始坐标就是(124.64, 301.79)。绘制完成后,根据字体中"A"的宽度 + 当前Tc(0),更新Tm的位置部分(即把基准坐标的X值加上这个总宽度)/T1_2 1 Tf:切换到指定字体,后续计算用该字体的字形宽度E Tj:"E"的起始坐标是上一步更新后的Tm基准坐标。绘制后同样用"E"的宽度 +Tc更新位置0.0157 Tc:更新字符间距为0.0157,后续位移计算要包含这个值0 7.3001 -7.3001 0 124.64 518.99 Tm:重置文本矩阵,基准坐标变为(124.64, 518.99)SOME Tj:"SOME"的起始坐标是(124.64, 518.99)。绘制后计算每个字符宽度之和 + (字符数-1)*0.0157,更新Tm位置ET:结束当前文本对象,状态重置
第二个文本对象(BT → ET)
BT启动,初始Tm为单位矩阵,基准坐标(0, 0)WOW Tj:"WOW"的起始坐标是(0, 0)。绘制后用三个字符的宽度之和 + 2*默认Tc(0)更新位置1.359 0.041 Td:相对位移操作,把当前Tm的基准坐标加上(1.359, 0.041)T*:换行操作,把基准坐标的Y值减去当前行距TL(默认有对应值,比如常见的12)SECOND Tj:"SECOND"的起始坐标是更新后的Tm基准坐标。绘制后按字符宽度+Tc更新位置0 7.6068 -7.3001 0 269.54 245.01 Tm:重置文本矩阵,基准坐标变为(269.54, 245.01)LAST Tj:"LAST"的起始坐标是(269.54, 245.01)ET:结束文本对象
特殊运算符处理
':等价于先执行T*换行,再执行Tj绘制字符串,按对应步骤更新状态即可":等价于先设置Tc、Tw,再执行T*,最后执行Tj,拆解为对应步骤处理TJ:参数是字符串与数字交替的数组,遇到字符串时计算起始坐标,绘制后更新位置;遇到数字时直接将当前基准坐标的X值加上该数字(相对位移)
关键提示
- 所有坐标的计算规则必须统一(比如始终取
Tm的最后两个值作为字符串起始基准),这样得到的坐标就在同一空间中,相对距离计算完全有效 - 每个文本对象的状态独立,
ET后所有文本状态会重置,下一个BT会重新初始化状态
内容的提问来源于stack exchange,提问作者JohnDiGriz
相关产品推荐
相关产品推荐

