使用python处理pdf表

sam*_*sam 5 python pdf pdf-scraping

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

我从事过html,xlm解析,但从未使用过pdf.
谁能告诉我如何使用python从pdf中获取表格?

San*_*nda 6

我认为你需要一个python解析器库.最着名的是PDFMiner.

根据文件:

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


Alf*_*lfe 6

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

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

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

我建议在开始之前查看您的 PDF 以及您想要解析的表格。也许它们一直都是相似的,并且可以很好地解析。

祝你好运!


Jac*_*man 6

我最近遇到了类似的问题,并写了一个库来帮助解决它: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'))
Run Code Online (Sandbox Code Playgroud)

然后你会继续搜索表格下面的行,直到搜索没有返回结果:

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
Run Code Online (Sandbox Code Playgroud)

这假设你的行高20点,第一列从标签下方20点开始,第一列从标签的左边缘跨越10到50点,第二列从左边跨越50到80点标签的边缘.

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