使用python处理pdf格式的表

使用python处理pdf格式的表,python,pdf,pdf-scraping,Python,Pdf,Pdf Scraping,我正在处理一个pdf文件。该pdf中有许多表格。 根据pdf中给出的表名,我想使用python从该表中获取数据 我研究过html、xlm解析,但从未使用过pdf。 有人能告诉我如何使用python从pdf中获取表吗?我认为您需要一个python解析器库。最有名的是 根据文件: PDFMiner是一种从PDF文档中提取信息的工具。与其他PDF相关工具不同,它完全专注于获取和分析文本数据。PDFMiner允许用户获取页面中文本的确切位置,以及字体或线条等其他信息。它包括一个PDF转换器,可以将PDF

我正在处理一个pdf文件。该pdf中有许多表格。
根据pdf中给出的表名,我想使用python从该表中获取数据

我研究过html、xlm解析,但从未使用过pdf。

有人能告诉我如何使用python从pdf中获取表吗?

我认为您需要一个python解析器库。最有名的是

根据文件:

PDFMiner是一种从PDF文档中提取信息的工具。与其他PDF相关工具不同,它完全专注于获取和分析文本数据。PDFMiner允许用户获取页面中文本的确切位置,以及字体或线条等其他信息。它包括一个PDF转换器,可以将PDF文件转换为其他文本格式(如HTML)。它有一个可扩展的PDF解析器,可用于文本分析以外的其他目的


这是一个非常复杂的问题,通常无法解决

原因很简单,PDF格式过于灵活。有些PDF只是位图(你必须自己做OCR,显然不是我们这里的主题),有些则是一堆字母从字面上溢出到页面上;这意味着通过解析PDF中的文本信息,可以在某些坐标上获得单个字符。在某些情况下,它们是以有序的方式出现的(一行一行,从左到右),但在某些情况下,你会得到相当随机的分布,最常见的是和之类的,但特殊字符、不同字体的字符等也可能会出格

唯一正确的方法是根据所有字符在页面模型上的坐标放置它们,然后使用启发式方法找出行是什么

我建议在开始之前先看看您的PDF和其中要解析的表。也许他们一直都很相像,而且很容易相处


祝你好运

我最近遇到了一个类似的问题,并编写了一个库来帮助解决它:

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分,第一列从标签下方20分开始,第一列从标签左边缘的10到50点跨越,第二列从标签左边缘的50到80点跨越


如果您有空行或高度不同的行,这将变得更烦人。如果表中的条目足够接近,以至于解析器认为它只是一行,那么您可能还需要使用merge_tags=None选项来选择单个字符而不是单词。但希望这能让您更接近……

您可以使用Camelot从PDF中提取表格数据,并将其导出到您喜欢的格式。目前;支持CSV、Excel、JSON和HTML。您可以在以下位置查看文档:。如果你能发布一个链接到你的PDF,那将是很有帮助的。下面是一个通用代码示例:

>>> import camelot
>>> tables = camelot.read_pdf('file.pdf')
>>> type(tables[0].df)
<class 'pandas.core.frame.DataFrame'>
>>> tables[0].to_csv('file.csv')
>>导入camelot
>>>tables=camelot.read\u pdf('file.pdf')
>>>类型(表[0].df)
>>>表[0]。到_csv('file.csv'))
免责声明:我是图书馆的作者