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

如何仅通过PDF操作列表计算文本字符串的坐标

PDF文本字符串坐标计算方案

结论:完全可以计算,只要全程跟踪文本对象内的状态变化,就能得到所有字符串在统一空间中的坐标,满足相对距离计算的需求。

需要跟踪的核心状态

每个BT(文本对象开始)到ET(文本对象结束)是独立的上下文,需要跟踪以下变量:

  • 当前文本矩阵(Tm):决定文本的基准位置、旋转、缩放等变换
  • 当前字体:用于获取字形的水平宽度(你已有的字形与字体水平位移列表正好派上用场)
  • 当前文本参数:字符间距(Tc)、字间距(Tw)、文本缩放(Tz)、行距(TL)

具体计算逻辑(结合你的示例)

第一个文本对象(BT → ET)

  1. BT启动文本对象,初始状态:Tm为单位矩阵,字体默认,文本参数默认(Tc=0等)
  2. 0 7.3001 -7.3001 0 124.64 301.79 Tm:设置文本矩阵,此时字符串的起始基准坐标取矩阵最后两个值(124.64, 301.79)(无需纠结旋转的具体计算,统一用这个规则即可)
  3. A Tj:"A"的起始坐标就是(124.64, 301.79)。绘制完成后,根据字体中"A"的宽度 + 当前Tc(0),更新Tm的位置部分(即把基准坐标的X值加上这个总宽度)
  4. /T1_2 1 Tf:切换到指定字体,后续计算用该字体的字形宽度
  5. E Tj:"E"的起始坐标是上一步更新后的Tm基准坐标。绘制后同样用"E"的宽度 + Tc更新位置
  6. 0.0157 Tc:更新字符间距为0.0157,后续位移计算要包含这个值
  7. 0 7.3001 -7.3001 0 124.64 518.99 Tm:重置文本矩阵,基准坐标变为(124.64, 518.99)
  8. SOME Tj:"SOME"的起始坐标是(124.64, 518.99)。绘制后计算每个字符宽度之和 + (字符数-1)*0.0157,更新Tm位置
  9. ET:结束当前文本对象,状态重置

第二个文本对象(BT → ET)

  1. BT启动,初始Tm为单位矩阵,基准坐标(0, 0)
  2. WOW Tj:"WOW"的起始坐标是(0, 0)。绘制后用三个字符的宽度之和 + 2*默认Tc(0)更新位置
  3. 1.359 0.041 Td:相对位移操作,把当前Tm的基准坐标加上(1.359, 0.041)
  4. T*:换行操作,把基准坐标的Y值减去当前行距TL(默认有对应值,比如常见的12)
  5. SECOND Tj:"SECOND"的起始坐标是更新后的Tm基准坐标。绘制后按字符宽度+Tc更新位置
  6. 0 7.6068 -7.3001 0 269.54 245.01 Tm:重置文本矩阵,基准坐标变为(269.54, 245.01)
  7. LAST Tj:"LAST"的起始坐标是(269.54, 245.01)
  8. ET:结束文本对象

特殊运算符处理

  • ':等价于先执行T*换行,再执行Tj绘制字符串,按对应步骤更新状态即可
  • ":等价于先设置Tc、Tw,再执行T*,最后执行Tj,拆解为对应步骤处理
  • TJ:参数是字符串与数字交替的数组,遇到字符串时计算起始坐标,绘制后更新位置;遇到数字时直接将当前基准坐标的X值加上该数字(相对位移)

关键提示

  • 所有坐标的计算规则必须统一(比如始终取Tm的最后两个值作为字符串起始基准),这样得到的坐标就在同一空间中,相对距离计算完全有效
  • 每个文本对象的状态独立,ET后所有文本状态会重置,下一个BT会重新初始化状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:39