我试图根据它的坐标从PDF文档中提取文本,所以我在Adobe PDF Reference(第5.3章)中遇到了两个概念:
现在我对Td& amp; Tm定位运算符,同时使用 Td ,您有 tx 和 ty ,相对于在PDF文档中明确指定的当前行的开头:
tx ty Td
,
我已经使用此方法通过 tx 和 ty 坐标提取文本。问题是我不知道如何根据其位置从PDF中提取文本,同时只提供 tx 和 ty 。
a b c d e f Tm
这是'Tm使用的'公式。 a-f值代表什么?这将是我对Tm的输入:
BT
/F1 8.88 Tf
0 0 0 rg
0.9998 0 0 1 401.52 448.08 Tm
[<0014>-11<0015>-11<0013>-11<000F>-19<0014>-11<0019>] TJ
ET
为什么每组四人都领先00?这是十六进制?我应该将它从十六进制转换为int和相应的字符吗?
这将是我对Td的输入:
BT 43.20 421.90 Td 0 Tw /C001 10.00 Tf 0.00 Tw <BlablablaTextInHexThatICanProcess>Tj ET
这更加清晰,坐标更清晰。 如何根据简单的X和Y坐标从Tm定位的PDF文本对象中提取文本? 我正在使用c ++和PoDoFo库
答案 0 :(得分:4)
不要低估这项任务的规模。文本矩阵位非常简单明了。困难的一点是文本本身。
让我们从您的查询开始 - 为什么每组四人都有一个领先的00?
好的PDF没有标准的文本编码 - 它有很多很多很多。在解码文本之前,您需要知道字体的编码是什么。
所以在你的例子中:
BT
/F1 8.88 Tf
0 0 0 rg
0.9998 0 0 1 401.52 448.08 Tm
[<0014>-11<0015>-11<0013>-11<000F>-19<0014>-11<0019>] TJ
ET
字体是/ F1位。这是与页面相关的页面(或父项)中存在的名称。您需要查找字体并找出编码的内容。
鉴于您的示例中的内容,我怀疑编码是一个标识,并且四位十六进制数字是字体内的字形ID。如果是这种情况,那么字体应该有一个ToUnicode条目,这将允许您查找字形ID并获取Unicode字符。
其他字体可能有也可能没有ToUnicode条目,如果发生这种情况,可以通过多种方式提取Unicode文本。不同的方法可能会给出不同的结果,这就是为什么PDF规范有一个标题为“文本内容的提取”的整个部分,详细说明了应该尝试这些的顺序。
希望你的PoDoFo库应该有方法来进行这种转换。如果不是,任务将非常艰难,我认为你应该考虑其他一些选择。我为我们的ABCpdf .NET库编写了文本提取代码,经过几年的调整需要花费几个月的代码。