
文章插圖
本文分享一個(gè)基于 PDF 的 Python 辦公自動(dòng)化的案例解決,也是某位財(cái)務(wù)小姐姐提出的真實(shí)需求,先來(lái)看看需求 。
需求描述在某個(gè)文件夾下有多個(gè) PDF 類(lèi)型發(fā)票
每一張發(fā)票 PDF 是純圖片類(lèi)型,里面的文字信息無(wú)法手動(dòng)復(fù)制(事實(shí)上大多數(shù)發(fā)票可以復(fù)制部分文字,但我們?nèi)右詧D片形式來(lái)講解),大致如下圖所示:
需要滿足的需求是:獲取 總金額、納稅人識(shí)別號(hào)、開(kāi)票人,即如下三個(gè)方框位置:
最后結(jié)合批量操作,在獲取上述信息后將其存儲(chǔ)入 Excel 中!
思路與代碼實(shí)現(xiàn)需求本質(zhì)是一個(gè)圖片識(shí)別問(wèn)題,因?yàn)?PDF 里的內(nèi)容是圖片類(lèi)型,無(wú)法按常規(guī)方法直接把文本抽提出來(lái) 。解決思路是利用光學(xué)字符識(shí)別(OCR)將圖片中的文字識(shí)別出 。但同時(shí)也需要注意,PDF 畢竟不是圖片,為了完成 OCR,除了OCR自身之外還要下載 Ghostscript 和 ImageMagick 用來(lái)完成類(lèi)型轉(zhuǎn)換 。已 Windows 系統(tǒng)為例,需要在電腦上安裝以下三個(gè)軟件:
Ghostscript 32 位ImageMagick 32 位tesseract-OCR 32 位三個(gè)軟件的下載安裝沒(méi)有特殊的地方(tesseract 配置稍復(fù)雜但網(wǎng)絡(luò)有上諸多教程,這里不再贅述),讀者可自行搜索下載及配置,下面講解代碼 。首先導(dǎo)入需要的模塊:
fromwand.imageimportImagefromPILimportImageasPIimportpyocrimportpyocr.buildersimportioimportreimportosimportshutil具體的模塊用途可以參考下面具體代碼 。其中 wand 和 pyocr 由于是非標(biāo)準(zhǔn)庫(kù)需要自行額外安裝 。打開(kāi)命令行輸入:
pipinstallwandpipinstallpyocr本需求還涉及對(duì)接 Excel,可考慮利用 openpyxl 庫(kù)的 Workbook 用以創(chuàng)建新的 Excel 文件:
fromopenpyxlimportWorkbook需求中的 發(fā)票.pdf 放在桌面上 ??赏ㄟ^(guò)下面基于 os 模塊的代碼獲取桌面路徑:
#獲取桌面路徑包裝成一個(gè)函數(shù)defGetDesktopPath():returnos.path.join(os.path.expanduser("~"),'Desktop')path=GetDesktopPath()+r'發(fā)票.pdf'獲取配置好的 tesseract 便于后面調(diào)用:
tool=pyocr.get_available_tools()[0]通過(guò) wand 模塊將 PDF 文件轉(zhuǎn)化為分辨率為 300 的 jpeg 圖片形式:
image_pdf=Image(filename=path,resolution=300)image_jpeg=image_pdf.convert('jpeg')將圖片解析為二進(jìn)制矩陣:
image_lst=[]forimginimage_jpeg.sequence:img_page=Image(image=img)image_lst.append(img_page.make_blob('jpeg'))用 io 模塊的 BytesIO 方法讀取二進(jìn)制內(nèi)容為圖片形式:
new_img=PI.open(io.BytesIO(image_lst[0]))new_img.show()接下來(lái)分別截取需要提取部位字符串的圖片了,盡量讓圖片中只有需要識(shí)別的部分,獲取識(shí)別出來(lái)容易簡(jiǎn)單處理獲得需要的內(nèi)容 。
首先以總金額為例,截取圖片用 image.crop((left, top, right, bottom)) 四個(gè)參數(shù)需要反復(fù)調(diào)試才能確定 。經(jīng)確定四個(gè)參數(shù)分別是 1600 760 1830 900,嘗試截取和預(yù)覽圖片:
###解析1Z開(kāi)頭碼left=350top=600right=1300bottom=730image_obj1=new_img.crop((left,top,right,bottom))image_obj1.show()截取成功后可以交給 OCR 了,代碼為 tool.image_to_string()
txt1=tool.image_to_string(image_obj1)print(txt1)同樣,通過(guò)方位的調(diào)試就可以準(zhǔn)確切割到需要的部分進(jìn)行識(shí)別:
left=560top=1260right=900bottom=1320image_obj2=new_img.crop((left,top,right,bottom))#image_obj2.show()txt2=tool.image_to_string(image_obj2)#print(txt2)最后是開(kāi)票人的識(shí)別
left = 1420top = 1420right = 1700bottom = 1500image_obj3 = new_img.crop((left, top, right, bottom))# image_obj3.show()txt3 = tool.image_to_string(image_obj3)# print(txt3)
需要確認(rèn)識(shí)別的內(nèi)容是否正確,如果識(shí)別正確率欠佳可以考慮通過(guò)圖片處理技術(shù)消除噪聲,也可以去官網(wǎng)下載更高精度的訓(xùn)練包提高識(shí)別的正確性
至此,我們成功的識(shí)別了總金額、納稅人識(shí)別號(hào)、開(kāi)票人三個(gè)消息,接下來(lái)就通過(guò)非常熟悉的 openpyxl 寫(xiě)入Excel,并使用 os 模塊實(shí)現(xiàn)批量操作即可
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- excel建立數(shù)據(jù)源和使用 excel數(shù)據(jù)源怎么設(shè)置
- 蠔油出現(xiàn)什么情況不能吃了
- 坐飛機(jī)用買(mǎi)40元航空意外險(xiǎn)嗎
- 蠔油保質(zhì)期幾年
- 茄子怎么保存
- 石榴石被稱為女人石,真的能養(yǎng)顏美容?能治療婦科??? 石榴石的功效與作用
- 怎樣快速剝板栗殼
- 活的青蟹家里怎么儲(chǔ)存
- 香蕉怎樣保存時(shí)間長(zhǎng)
- “王者榮耀崩了”登熱搜,回應(yīng):已處理,逐步恢復(fù) 王者榮耀崩了
