我正在尝试从 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'
这是一些流内容。正如您所看到的,它有两个 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
在我的初始代码中,我假设 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 和所有其他与文本相关的运算符。
关于pdf - 从 PDF Tm 运算符确定翻译/位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7432012/