我正在处理一个pdf文件。该pdf中有许多表格。
根据pdf中给出的表名,我想使用python从该表中获取数据。
我从事过 html、xlm 解析,但从未使用过 pdf。
谁能告诉我如何使用 python 从 pdf 中获取表格?
我正在处理一个pdf文件。该pdf中有许多表格。
根据pdf中给出的表名,我想使用python从该表中获取数据。
我从事过 html、xlm 解析,但从未使用过 pdf。
谁能告诉我如何使用 python 从 pdf 中获取表格?
我认为您需要一个 python 解析器库。最著名的是PDFMiner。
根据文档:
PDFMiner 是一个从 PDF 文档中提取信息的工具。与其他 PDF 相关工具不同,它完全专注于获取和分析文本数据。PDFMiner 允许获取页面中文本的确切位置,以及字体或线条等其他信息。它包括一个 PDF 转换器,可以将 PDF 文件转换为其他文本格式(例如 HTML)。它有一个可扩展的 PDF 解析器,可用于文本分析以外的其他目的。
我最近遇到了类似的问题,并写了一个库来帮助解决它:pdfquery。
PDFQuery 从 PDF 创建一个元素树(使用 pdfminer,加上一些额外的糖),并允许您使用 JQuery 或 XPath 选择器从页面中获取元素,主要基于元素的文本内容或位置。所以要解析一个表格,你首先要通过搜索标签来找到它在文档中的位置:
label = pdf.pq(':contains("Name of your table")')
left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))
然后您将继续搜索表格下方的行,直到搜索未返回结果:
page = label.closest('LTPage')
while 1:
row = pdf.extract( [
('column_1', ':in_bbox("%s,%s,%s,%s")' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)),
('column_2', ':in_bbox("%s,%s,%s,%s")' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20))
], page)
if not row['column_1'] or row['column_2']:
break
print "Got row:", matches
bottom_corner -= 20
这假设您的行高 20 pts,第一行从标签下方 20 pts 开始,第一列从标签的左边缘跨越 10 到 50 点,第二列从左侧跨越 50 到 80 pts标签的边缘。
如果您有空白行或高度不同的行,这将变得更加烦人。如果表中的条目足够接近以使解析器认为它只是一行,则您可能还需要使用 merge_tags=None 选项来选择单个字符而不是单词。但希望这能让你更接近......
这是一个非常复杂的问题,通常无法解决。
原因很简单,PDF格式太灵活了。有些 PDF 只是位图(那时你必须自己做 OCR——显然不是我们这里的主题),有些是一堆字面上溢出的字母;这意味着通过解析 PDF 中的文本信息,您可以将单个字符放置在某些坐标上。在某些情况下,这些以有序的方式出现(逐行,从左到右),但在某些情况下,您会得到相当随机的分布,最常见的是和东西,还有特殊字符,不同字体的字符等. 可能会出格。
唯一合适的方法是将所有字符根据它们的坐标放置在页面模型上,然后使用启发式方法找出线条是什么。
我建议在开始之前查看您的 PDF 和您想要解析的表格。也许它们一直都是相似的并且可以很好地解析。
祝你好运!
您可以使用 Camelot 从 PDF 中提取表格数据并将其导出为您喜欢的格式。目前; 支持 CSV、Excel、JSON 和 HTML。您可以在以下位置查看文档:http ://camelot-py.readthedocs.io 。如果您可以发布指向您的 PDF 的链接,将会很有帮助。这是一个通用代码示例:
>>> import camelot
>>> tables = camelot.read_pdf('file.pdf')
>>> type(tables[0].df)
<class 'pandas.core.frame.DataFrame'>
>>> tables[0].to_csv('file.csv')
免责声明:我是图书馆的作者。