首页 > 解决方案 > PyQuery 和 PDFQuery 从 XML 或 PDF 中的下一个兄弟中提取文本

问题描述

我正在尝试使用包 PDFQuery 从 PDF 中提取信息。信息每次都不在同一个位置,所以我需要一个查询标签。首先,我编写了函数:

def clean_text_data(text):
      return text.split(':')[1]

然后我写了一个函数来提取文本:

Date = clean_text_data(pdf.pq('LTTextLineHorizontal:contains("Date")').text())

然而,问题是(出于某种原因)几乎所有数据都在下一个“LTTextHorizo​​ntal”上。

XML 如下所示:

<LTTextLineHorizontal bbox="[58.501, 377.094, 78.501, 385.094]" height="8.0" width="20.0" word_margin="0.1" x0="58.501" x1="78.501" y0="377.094" y1="385.094"><LTTextBoxHorizontal bbox="[58.501, 377.094, 78.501, 385.094]" height="8.0" index="39" width="20.0" x0="58.501" x1="78.501" y0="377.094" y1="385.094">Date: </LTTextBoxHorizontal></LTTextLineHorizontal>
<LTTextLineHorizontal bbox="[107.249, 377.334, 147.281, 385.334]" height="8.0" width="40.032" word_margin="0.1" x0="107.249" x1="147.281" y0="377.334" y1="385.334"><LTTextBoxHorizontal bbox="[107.249, 377.334, 147.281, 385.334]" height="8.0" index="40" width="40.032" x0="107.249" x1="147.281" y0="377.334" y1="385.334">02/26/2020 </LTTextBoxHorizontal></LTTextLineHorizontal>

这里的日期是 2020 年 2 月 26 日,但它在紧随其后的框中。如何创建一个函数来提取以下框?

标签: pythonxmlpdfpdfminerpyquery

解决方案


你做这样的事情:

label = pdf.pq('LTTextLineHorizontal:contains("Date")')
    left_corner = float(label.attr('x0'))
    bottom_corner = float(label.attr('y0'))

在第一部分中,我找到包含“日期”的 PDF 区域并提取其边界框的源坐标,因此 x0:y0 对应于写入“日期”的位置的左下角

    name = pdf.pq('LTTextLineHorizontal:in_bbox("%s, %s, %s, %s")' % (
        left_corner, bottom_corner - 12, left_corner + 350, bottom_corner)).text()

之后,我偏移这些坐标以创建一个新的 bbox,其中包含我正在寻找的信息,我得到了.text().

坐标以点为单位进行偏移,您可以使用 Acrobat 的标尺进行测量。

来源在这里:https ://pypi.org/project/pdfquery/#quick-start

快速入门指南有一个很好的例子。


推荐阅读