今天遇到一個批量讀取pdf文件中表格數據的需求,樣式大體是以下這樣:
python讀取PDF無非就是三種方式(我所了解的),pdfminer
、pdf2htmlEX
和 Tabula
。綜合考慮后,選擇了最后一種。下面對三種方式分別介紹:
pdfminer
該方式從網上搜索的結果是,可以提取pdf文本數據,但是提取后表格信息就亂了。所以本人沒有親自實驗,就果斷放棄了實驗該方法。如果只是提取pdf里面的文本內容,該方式可能是比較合適的。
pdf2htmlEX
該方式是通過把pdf格式轉換成html格式,然后再提取信息的方法。
Github: https://github.com/coolwanglu/pdf2htmlEX
需先下載pdf2htmlEX可執行程序,下載地址:https://github.com/coolwanglu/pdf2htmlEX/wiki/Download。
#-*- conding: utf-8 -*-
import subprocess
subprocess.call('"D:\Program Files (x86)\pdf2htmlEX-win32-0.14.6-upx-with-poppler-data\pdf2htmlEX.exe" --dest-dir E:\\test\extract\\2017gq\\out E:\\test\extract\\2017gq\\a53277ce525547088780c4b94accb7b5.pdf', shell=True)
執行以上代碼,會在指定目錄 E:\test\extract\2017gq\out 下生成對應html文件,瀏覽器中查看效果:
可以看到整體轉換的效果非常不錯,但是轉換后的標簽沒有特點,使數據的提取變得非常困難。多番嘗試后,感覺該方法不夠通用,沒法解決我的需求。也許對於單純的pdf轉html,該方式可能是最好的選擇。
Tabula
Tabula是專門用來提取PDF表格數據的,同時支持PDF導出為CSV、Excel格式。
官網: http://tabula.technology/
Github: https://github.com/chezou/tabula-py
首先安裝tabula-py: pip install tabula-py
tabula-py依賴庫包括java、pandas、numpy,所以需保證運行環境中安裝了這些庫。
#-*- conding: utf-8 -*-
import tabula
df = tabula.read_pdf("E:\\test\\extract\\2017gq\\a53277ce525547088780c4b94accb7b5.pdf", encoding='gbk', pages='all')
print(df)
for indexs in df.index:
# 遍歷打印企業名稱
print(df.loc[indexs].values[1].strip())
執行以上代碼,成功打印出表格中的所有企業名稱,查看打印的 df 的結構,如下圖:
總結
以上三種方式中,最后一種方式完美的解決了我的從PDF表格中提取數據的需求,希望能拋磚引玉,大家在使用時選擇最適合自己的方法,如有介紹不當之處,望留言中指正,謝過。