我正在尝试从PDF文件中提取一些文本数据.要做到这一点,我需要了解页面上打印一些文本的位置,这样我就可以关联不同数据的位置.但是,我卡住了,因为我不完全理解Tm运算符设置的文本矩阵的行为.
Tm (0.0, -5.28, 5.28, 0.0, 429.7006, 803.9603)
rg (0.617, 0.098, 0.043)
Tj '\x01'
Tm (0.0, -9.0, 9.0, 0.0, 428.1406, 784.8203)
rg (0.0, 0.219, 0.512)
Tc (2.4756,)
Tj '4567'
Run Code Online (Sandbox Code Playgroud)
这是一些流内容.正如您所看到的,它有两个紧密相连的Tm调用.所有普通文本都打印在Tm(0.0,-9.0,9.0,0.0)空间中 - 看起来-5.28/5.28空间仅用于打印一些特殊字符.现在,我知道Tm的后两个参数用于将当前位置设置为新的,但看起来这些数字依赖于更多的上下文(可能是5.28和9.0的比例,不知何故).我似乎无法弄清楚这一切是如何组合在一起的,而且规范(第250页有Tm"解释")对我来说似乎非常无益.
编辑:扩展的例子,为什么这让我感到困惑:
Tm 0 -27 27 0 545.5606 817.2203
(rg, Tc, Tw, Tj, Tf omitted)
TD 0.0156 -1.2556
Tm 0 -9 9 0 441.9406 677.4803
TD 10.6733 0 # more omitted, including other TD ops with second param 0
TD -82.7267 -1.5333 # start of a new line
Tc 0
Tj (3)
Tf /F2 1
Tm 0 -5.28 5.28 0 429.7006 803.9603
Tj ()
Tf /TT2 1
Tm 0 -9 9 0 428.1406 784.8203
Tc 2.4756
Tj (4567) # these appear on the same line as before the double Tm
Run Code Online (Sandbox Code Playgroud)
在我的初始代码中,我假设Tm的e和f参数以及TD的参数位于相同的空间中,从而导致有组织的坐标.然而,这里失败了:最后一个Tj中的4567显示在与前一个3相同的行中,而y坐标从677.4803 + -1.5333 = 675.947开始,但是在最后的Tm之后,y轴坐标似乎是设定为784.8203; 建议应在3 以上绘制"4567" .
文本矩阵与当前变换矩阵组合以设置文本位置.您的文本位于(429.7006,803.9603)和(428.1406,784.8203).文字大小为5.28和9分.使用Tf运算符将字体大小设置为1并通过缩放文本矩阵设置实际字体大小是一种常用技术.您的文字也会轮换.
正确计算文本位置需要解析整个内容流并执行所有q,Q,cm,Tf,Tm和所有其他文本相关的运算符.