python - 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())
然而,问题是(出于某种原因)几乎所有数据都在下一个“LTTextHorizontal”上。
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 日,但它在紧随其后的框中。如何创建一个函数来提取以下框?
解决方案
你做这样的事情:
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
快速入门指南有一个很好的例子。
推荐阅读
- angular - 在另一个服务中未定义角度翻译服务
- r - dplyr:如何根据其他列中的值计算组内的折叠变化
- python - 如何找到 xor ==n 的数字对
- python - 在执行透视变形时,如何避免部分图像被剪切?
- php - 在 __clone() 中获取原始/源实例
- java - 在 Spring Data 中,我是否应该对处理所有可能的异常感到偏执?
- azure - 带有 MLOps 的 AutoML 导致我出现错误 - 消息:找不到提供的模型路径
- c# - IsCancellationRequested 始终为 false
- azure-eventhub - EventHubProducerClient 是否可以跨多个请求重用
- c# - 桌面程序的 C# 证书