python解析PDF文件

1、當(dāng)時用的python3.7在 pdfminer3k 與 pdfplumber 兩個庫之間存在沖突,安裝pdfplumber時會將pdfminer3k覆蓋掉,安裝的時候要先安裝pdfplumber再安裝pdfminer3k。
2、阿里云RPA只支持python3.5,后來我的環(huán)境就改成了3.5
3、首先創(chuàng)建 python3.5 的 virtualenv
4、cmd中進入創(chuàng)建的 env 中安裝pdfplumber命令:

pip install pdfplumber  -i https://pypi.doubanio.com/simple/

此時會按照相關(guān)的第三方庫:
chardet, pycryptodome, unicodecsv, sortedcontainers, pdfminer.six, six, pillow, wand, pdfplumber
本版分別為:
chardet-3.0.4 pdfminer.six-20200104 pdfplumber-0.5.19 pillow-7.1.1 pycryptodome-3.9.7 six-1.14.0 sortedcontainers-2.1.0 unicodecsv-0.14.1 wand-0.5.9

5、在運行下方代碼時會報錯:

import pdfplumber

pdf = pdfplumber.open(path)
p0 = pdf.pages[0]
im = p0.to_image()
1.png

6、打開下方網(wǎng)站

http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows
2.png

這個網(wǎng)站有ImageMagick的安裝方法

7、打開下方網(wǎng)站下載ImageMagick-7.0.10-7-Q16-x64-dll.exe

[https://imagemagick.org/script/download.php#windows](https://imagemagick.org/script/download.php#windows)
3.png

8、from pdfminer.pdfinterp import process_pdf 時會報錯

pdfminer3k  與 pdfplumber 兩個庫之間存在沖突
先安裝pdfplumber  (切記安裝順序)
from pdfminer.pdfinterp import  process_pdf 時會報錯
這時候再安裝pdfminer3k就不會報錯了
pip install pdfminer3k  -i https://pypi.doubanio.com/simple/

會報錯

from .pdftypes import PDFObjectNotFound
ImportError: cannot import name 'PDFObjectNotFound'

轉(zhuǎn)來轉(zhuǎn)去最后發(fā)現(xiàn)對于只有表格和文字的pdf 用 pdfminer3k 再配合 tabula 去讀取表格

import tabula

df_list = tabula.read_pdf(self.pdf_path, encoding='UTF-8', pages=new_all_pages,multiple_tables = True, lattice=True)

上面這個完了還有個坑

Tabula是專門用來提取PDF表格數(shù)據(jù)的,同時支持PDF導(dǎo)出為CSV、Excel格式。
官網(wǎng): [http://tabula.technology/](http://tabula.technology/)
Github: [https://github.com/chezou/tabula-py](https://github.com/chezou/tabula-py)
首先安裝tabula-py: `pip install tabula-py`   (重點在這里)
tabula-py依賴庫包括java、pandas、numpy,所以需保證運行環(huán)境中安裝了這些庫。
安裝java的鏈接可參考:[http://www.itdecent.cn/p/a66e393e1b27](http://www.itdecent.cn/p/a66e393e1b27)

java 安裝包
鏈接:https://pan.baidu.com/s/1TZ32uR1pN3zz1HWRqdX_qA
提取碼:8onf

代碼如下:

import tabula

df = tabula.read_pdf("D:/test.pdf", encoding='gbk', pages='all')
print(df)
for indexs in df.index:
    # 遍歷打印企業(yè)名稱
    print(df.loc[indexs].values[1].strip())

又遇到一個大坑
https://github.com/euske/pdfminer/tree/2103e5875ef04cfaf424b25d2fd0dc9535a90714/pdfminer/cmap
再來總結(jié)一下pdfminer遇到的坑
1、應(yīng)該安裝pdfminer3k
2、缺少字符編碼(UniGB-UCS2-H、Adobe-GB1)

從下方網(wǎng)址中下載  pdfminer包
下載好后將UniGB-UCS2-H.pickle.gz、to-unicode-Adobe-GB1.pickle.gz不要解壓直接放在 Py35Env\Lib\site-packages\pdfminer\cmap文件夾下
https://github.com/euske/pdfminer/tree/2103e5875ef04cfaf424b25d2fd0dc9535a90714

可以參考https://www.cnblogs.com/wzjbg/p/7644127.html
7.png

8.png

9.png

字符編碼的問題解決后又會拋出下方紅色字


10.png

解決辦法


11.png

好了基本大功告成
下方附一段代碼
from io import StringIO
from io import open
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf

pdf_path = 'D:\RPA_ProjectFile\Cody\Pdffile\20200420154222.pdf'

def read_pdf(pdf):
    # resource manager
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    # device
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdf)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    lines = str(content).split("\n")
    return lines


with open(pdf_path, "rb") as pdf:
    PQ = read_pdf(pdf)
    for div in range(len(PQ)):
        temp = PQ[div].strip()
        print(temp)

在使用 tabula 提取pdf文件中的表格時 提示當(dāng)前環(huán)境缺少CID-keyed font AdobeKaitiStd-Regular字體和CID-keyed font STSong-Light字體,pdfbox使用使用LiberationSans字體進行替換。


1.png
Got stderr:  org.apache.pdfbox.pdmodel.font.PDCIDFontType0 <init>
警告: Using fallback MT-Extra for CID-keyed font STSong-Light

這兩個字體可以用AdobeKaitiStd-Regular.otf和SimSun.ttf兩個字體文件。
找字體文件可以在自己的電腦上找,可以在這個C:\Windows\Fonts找到,或者用everything工具查找,沒有的話可以在網(wǎng)上找
有些字體實在找不到,也可以修改pdfbox的源碼,修改字體的替換規(guī)則,
替換的規(guī)則在org.apache.pdfbox.pdmodel.font.FontMapperImpl可以查看到

參考兩個網(wǎng)站
https://blog.csdn.net/qq_28822933/article/details/83239950
https://blog.csdn.net/qq_36956002/article/details/105094651

字體目錄 【控制面板\外觀和個性化\字體】


3.png

另外還有一種解析PDF文件的方法就是將pdf轉(zhuǎn)成html文件
https://github.com/coolwanglu/pdf2htmlEX
在cmd中以命令的方式直接將pdf轉(zhuǎn)成html,然后再去html文件中解析數(shù)據(jù),熟悉爬蟲頁面解析的可以嘗試一下所見即所得也挺簡單的。

使用pdfminer、tabula第三方庫文本和表格都能提取出來,接下來要解決的問題是在這些雜亂無章的數(shù)據(jù)中正確的提取出自己想要數(shù)據(jù),首先分析pdf頁面的規(guī)律找到自己想要的數(shù)據(jù)在哪里,往往是文本要和表格對應(yīng)起來pdfminer用來提取文本內(nèi)容,tabula來提取表格,再根據(jù)規(guī)律將文本和表格對應(yīng)起來,我這邊有一份 收貨單、送貨單、訂貨單的pdf文件解析代碼,大家可以根據(jù)我的代碼來分析我的思路!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容