2012-03-20 44 views
4

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

我曾在html,xlm解析,但从来没有pdf。
任何人都可以告诉我如何使用python从pdf获取表?

回答

5

我认为你需要一个Python解析器库。最有名的是PDFMiner

根据文档:

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

3

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

原因很简单,PDF格式太灵活了。有些PDF只是位图(你必须自己做OCR--显然这里不是我们的话题),有些是一堆字面上字面意思的字母;这意味着通过解析PDF中的文本信息,您可以获得放置在某些坐标上的单个字符。在某些情况下,这些按照顺序排列(从左到右依次排列),但在某些情况下,您会得到相当随机的分布,最常见的是和东西,但也有特殊字符,不同字体的字符等可以走出路线。

唯一适当的方法是根据页面模型上的坐标放置所有字符,然后使用启发式来查明线条是什么。

我建议看看你的PDF和你想在开始之前解析的表格。也许他们一直都很好,可以很好地解析。

祝你好运!

5

我最近有一个类似的问题,并写了一个库来帮助解决它: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点,第一个从标签下面20点开始,第一列跨越标签左边缘10到50点,第二列跨越50到标签左边80分。

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