使用Python从PDF中的物理坐标返回文本字符串

5
我已经花了好几个小时在Google和PDFMiner的有限文档上挣扎,虽然我感觉离成功很近,但我仍然没有得到我需要的东西。我已经阅读过http://www.unixuser.org/~euske/python/pdfminer/中的所有三个YouTube视频来更好地了解PDF,并且能够很好地输出原始文本。
我正在编写一个脚本来解析多个PDF页面。不幸的是,对于这个项目,我正在处理质量较差的PDF文件,而我看到的唯一可靠的常量是文本字符串的物理位置完全相同。尽管我已经读到了一些提示,说可以通过物理坐标提取文本字符串,但我还没有看到一个可行的示例。
有没有人能够解释一下如何使用PDFMiner完成这项工作?如果有更好的选择,我也愿意考虑其他模块,不过我需要在脚本中使用Python。
此外,我也尝试过PyPdf,但无法成功(除了基本的文本输出)。
谢谢!
2个回答

9

我一直在编写一个库,试图简化这个过程,pdfquery。要从特定页面的特定位置提取文本,您需要执行以下操作:

pdf = pdfquery.PDFQuery(file)
# load first, third, fourth pages
pdf.load(0, 2, 3) 
# find text between 100 and 300 points from left bottom corner of first page
text = pdf.pq('LTPage[page_index=0] :in_bbox("100,100,300,300")').text() 
# save tree as XML to try to figure out why the last line didn't work the way you expected :)
pdf.tree.write(filename, pretty_print=True)

如果你想在该框中查找单个字符,而不是完全在该框内的文本行,请将merge_tags=None传递给PDFQuery(默认情况下,它将连续的字符合并为一个元素,以使树形结构更加简洁,因此整行必须在框内)。如果你想要查找任何部分重叠该框的内容,请使用:overlaps_bbox而不是:in_bbox。
基本上,这是使用PyQuery选择器语法从PDFMiner布局中获取文本,因此如果你的文档对于PDFMiner来说太杂乱,那么对于这个工具来说也可能会出现问题,但至少它会更快速和易于操作。

3
我能够通过Denis Papathanasiou的代码找到pdfminer的使用方法。他在他的博客中讨论了这个代码,你可以在这里找到源代码。

特别是要看一下parse_lt_objs()方法。在最后的循环中,k应该是一个包含文本块坐标的元组(并且被丢弃了)。我没有可用的坐标提取器可以在这里发布(我对它们不感兴趣),但是听起来你不会从那里走错路。

祝你好运!


谢谢提供链接!我能够从最后一个循环中提取出一个漂亮的排序哈希表。但是我希望文档质量更好一些。似乎PDF在准确字符串提取方面很糟糕,特别是当它们在文本版本/图像版本之间多次转换时。如果你有更好的建议,我全听着呢,否则我认为这是个死胡同了。 - user1145643
很抱歉,我不知道其他的工具。PDF格式太接近画布级别的格式了,谁知道呢。如果你的问题是检测单词边界,我建议尝试自己建模--估计平均字母宽度,并查看x坐标的跳跃何时表示空格。唯一想到的另一个想法是寻找将PDF转换为标记PDF(有用)的工具。也许Adobe提供了一些东西,但它可能也无法处理你的文件。 - alexis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接