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()

6、打開下方網(wǎng)站
http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows

這個網(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)

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



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

解決辦法

好了基本大功告成
下方附一段代碼
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字體進行替換。

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
字體目錄 【控制面板\外觀和個性化\字體】

另外還有一種解析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ù)我的代碼來分析我的思路!