文章插圖

文章插圖
本文分享一個基于 PDF 的 Python 辦公自動化的案例解決 , 也是某位財務小姐姐提出的真實需求 , 先來看看需求 。
需求描述
在某個文件夾下有多個 PDF 類型發票
需求本質是一個圖片識別問題 , 因為 PDF 里的內容是圖片類型 , 無法按常規方法直接把文本抽提出來 。解決思路是利用光學字符識別(OCR)將圖片中的文字識別出 。但同時也需要注意 , PDF 畢竟不是圖片 , 為了完成 OCR , 除了OCR自身之外還要下載 Ghostscript 和 ImageMagick 用來完成類型轉換 。已 Windows 系統為例 , 需要在電腦上安裝以下三個軟件:
Ghostscript 32 位ImageMagick 32 位tesseract-OCR 32 位
三個軟件的下載安裝沒有特殊的地方(tesseract 配置稍復雜但網絡有上諸多教程 , 這里不再贅述) , 讀者可自行搜索下載及配置 , 下面講解代碼 。首先導入需要的模塊:
fromwand.imageimportImagefromPILimportImageasPIimportpyocrimportpyocr.buildersimportioimportreimportosimportshutil具體的模塊用途可以參考下面具體代碼 。其中 wand 和 pyocr 由于是非標準庫需要自行額外安裝 。打開命令行輸入:pipinstallwandpipinstallpyocr本需求還涉及對接 Excel , 可考慮利用 openpyxl 庫的 Workbook 用以創建新的 Excel 文件:fromopenpyxlimportWorkbook【python提取某一列數據 python 提取列】需求中的 發票.pdf 放在桌面上 。可通過下面基于 os 模塊的代碼獲取桌面路徑:#獲取桌面路徑包裝成一個函數defGetDesktopPath():returnos.path.join(os.path.expanduser("~"),'Desktop')path=GetDesktopPath()+r'發票.pdf'獲取配置好的 tesseract 便于后面調用:tool=pyocr.get_available_tools()[0]通過 wand 模塊將 PDF 文件轉化為分辨率為 300 的 jpeg 圖片形式:image_pdf=Image(filename=path,resolution=300)image_jpeg=image_pdf.convert('jpeg')將圖片解析為二進制矩陣:image_lst=[]forimginimage_jpeg.sequence:img_page=Image(image=img)image_lst.append(img_page.make_blob('jpeg'))用 io 模塊的 BytesIO 方法讀取二進制內容為圖片形式:new_img=PI.open(io.BytesIO(image_lst[0]))new_img.show()接下來分別截取需要提取部位字符串的圖片了 , 盡量讓圖片中只有需要識別的部分 , 獲取識別出來容易簡單處理獲得需要的內容 。首先以總金額為例 , 截取圖片用 image.crop((left, top, right, bottom)) 四個參數需要反復調試才能確定 。經確定四個參數分別是 1600 760 1830 900 , 嘗試截取和預覽圖片:
###解析1Z開頭碼left=350top=600right=1300bottom=730image_obj1=new_img.crop((left,top,right,bottom))image_obj1.show()txt1=tool.image_to_string(image_obj1)print(txt1)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)最后是開票人的識別至此 , 我們成功的識別了總金額、納稅人識別號、開票人三個消息 , 接下來就通過非常熟悉的 openpyxl 寫入Excel , 并使用 os 模塊實現批量操作即可
workbook=Workbook()sheet=workbook.activeheader=['總金額','納稅人識別號','開票人']sheet.append(header)sheet.append([txt1,txt2,txt3])workbook.save(GetDesktopPath()+r'匯總.xlsx')最后想說的是 , 其實本文的案例可以衍生出很多實用的辦公自動化腳本 , 例如
批量計算發票金額并重命名文件夾根據發票類型批量分類根據發票批量制作報銷單··· ···
- python命令行參數有什么用 python 命令行 參數
- python后端框架有哪些 python后端框架對比
- 命令行運行python文件 Python執行命令
- python中的隨機數函數 python隨機調用函數
- python中len函數怎么用 python len函數詳解
- js select 選中值 jquery設置select選中某個值
- 0基礎學python python零基礎教程視頻教程
- 阿里云數據庫怎么用python 阿里云數據庫怎么用navicat連接
- python注釋有哪些用法 python注釋類型
- ps如何把圖片一部分給裁剪掉 ps怎么裁剪某個圖層圖片一部分
