簡體   English   中英

使用python處理pdf表

[英]Working on tables in pdf using python

我正在處理pdf文件。 該pdf中有許多表格。
根據pdf中提供的表名,我想使用python從該表中獲取數據。

我從事過html,xlm解析,但從未使用過pdf。
誰能告訴我如何使用python從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點,第一行從標簽下方開始20點,第一列從標簽的左邊緣起10到50點,第二列從左側的50到80點標簽的邊緣。

如果您有空白行或高度不同的行,這將變得更加煩人。 如果表中的條目足夠接近以至於使解析器認為它只是一行,那么您可能還需要使用merge_tags = None選項來選擇單個字符而不是單詞。 但是希望這可以使您更接近...

我認為您需要一個python解析器庫。 最著名的是PDFMiner

根據文檔:

PDFMiner是用於從PDF文檔提取信息的工具。 與其他PDF相關工具不同,它完全專注於獲取和分析文本數據。 PDFMiner允許人們獲取頁面中文本的確切位置,以及字體或線條等其他信息。 它包括一個PDF轉換器,可以將PDF文件轉換為其他文本格式(例如HTML)。 它具有可擴展的PDF解析器,可用於文本分析以外的其他目的。

這是一個非常復雜的問題,通常無法解決。

原因僅僅是因為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')

免責聲明:我是圖書館的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM