根据位置c ++从PDF文档中提取文本

时间:2013-05-09 13:13:17

标签: c++ pdf podofo

我试图根据它的坐标从PDF文档中提取文本,所以我在Adobe PDF Reference(第5.3章)中遇到了两个概念:

  1. 文字定位运算符
  2. 显示运营商的文字
  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库

1 个答案:

答案 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库编写了文本提取代码,经过几年的调整需要花费几个月的代码。