Python實(shí)現(xiàn)PDF掃描件生成DOCX或EXCEL功能
1.問(wèn)題描述
應(yīng)項(xiàng)目需求需要獲取PDF掃描文件的內(nèi)容,但尋遍整個(gè)網(wǎng)絡(luò)能達(dá)到這種功能的產(chǎn)品,都要會(huì)員充值??嘤谀抑行邼仓缓镁帉懝δ艽a來(lái)實(shí)現(xiàn)了。
如PDF中表格圖片圖-1效果生成圖-2
圖-1
圖-2
2.實(shí)現(xiàn)流程
整個(gè)步驟為:讀取PDF文件->生成圖片->ORC獲取圖片內(nèi)容->寫入Excel
3.功能代碼
3.1 pdf轉(zhuǎn)為圖片
import fitz # pdf轉(zhuǎn)為圖片 from aip import AipOcr # 圖片文字識(shí)別 import time # 程序運(yùn)行時(shí)間間隔以避免出錯(cuò) import docx # 將識(shí)別結(jié)果保存為docx文件 from docx.oxml.ns import qn # 設(shè)置docx文件的字體 """ 你的 APPID AK SK """ APP_ID = 'xxxxxx' API_KEY = 'xxxxxxxx' SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxx' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) ''' 將PDF轉(zhuǎn)化為圖片 pdfPath pdf文件的路徑 imgPath 圖像要保存的路徑 zoom_x x方向的縮放系數(shù) zoom_y y方向的縮放系數(shù) rotation_angle 旋轉(zhuǎn)角度 zoom_x和zoom_y一般取相同值,值越大,圖像分辨率越高 返回目標(biāo)pdf的名稱和頁(yè)數(shù),便于下一步操作 ''' def pdf_image(pdfPath, imgPath, zoom_x=10, zoom_y=10, rotation_angle=0): # 獲取pdf文件名稱 name = pdfPath.split("\\")[-1].split('.pdf')[0] # 打開(kāi)PDF文件 pdf = fitz.open(pdfPath) # 獲取pdf頁(yè)數(shù) num = pdf.pageCount # 逐頁(yè)讀取PDF for pg in range(0, num): page = pdf[pg] # 設(shè)置縮放和旋轉(zhuǎn)系數(shù) trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle) pm = page.getPixmap(matrix=trans, alpha=False) # 開(kāi)始寫圖像 pm.writePNG(imgPath + name + "_" + str(pg) + ".png") pdf.close() return name, num ''' 將圖片讀取為docx文件 imgPath 圖像所在路徑 生成的docx也保存在圖像所在路徑中 name為pdf名稱(不含后綴) num為pdf頁(yè)數(shù) name和num均可由上一個(gè)函數(shù)返回 ''' def ReadDetail_docx(imgPath, name, num): # 建立一個(gè)空doc文檔 doc = docx.Document() # 設(shè)置全局字體 doc.styles["Normal"].font.name=u"宋體" doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體') # 讀取圖片 for n in range(0,num): i = open(imgPath+name+"_"+str(n)+".png",'rb') time.sleep(0.1) img = i.read() message = client.basicAccurate(img) content = message.get('words_result') # 將內(nèi)容寫入doc文檔 for i in range(len(content)): doc.add_paragraph(content[i].get('words')) # 保存doc文檔 doc.save(imgPath + name + '.docx') def pdf_to_docx(pdfPath, imgPath, zoom_x=10, zoom_y=10, rotation_angle=0): print("正在將pdf文件轉(zhuǎn)換為圖片...") # 調(diào)用函數(shù)一將pdf轉(zhuǎn)換為圖片,并獲得文件名和頁(yè)數(shù) name_, num_ = pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle) print("轉(zhuǎn)換成功!") #print("正在讀取圖片內(nèi)容...") # 調(diào)用函數(shù)二逐頁(yè)讀取圖片并逐行保存在docx文件中 # ReadDetail_docx(imgPath, name_, num_) #print("名為 {}.pdf 的pdf文件共有{}頁(yè),已成功轉(zhuǎn)換為docx文件!".format(name_, num_)) # pdf儲(chǔ)存路徑 pdf_path = "JRT 0197-2020金融數(shù)據(jù)安全 數(shù)據(jù)安全分級(jí)指南.pdf" # 圖片和生成的docx文件的儲(chǔ)存路徑 img_path = r"G:\imges\\" # 調(diào)用函數(shù) pdf_to_docx(pdf_path, img_path)
3.2 表格圖片文字識(shí)別到excel
import pandas as pd import numpy as np import re # 圖片識(shí)別 from aip import AipOcr # 時(shí)間模塊 import time # 網(wǎng)頁(yè)獲取 import requests # 操作系統(tǒng)接口模塊 import os image_path = '' # 獲取文件夾中所有圖片 def get_image(): images = [] # 存儲(chǔ)文件夾內(nèi)所有文件的路徑(包括子目錄內(nèi)的文件) for root, dirs, files in os.walk(image_path): path = [os.path.join(root, name) for name in files] images.extend(path) return images def Image_Excel(APP_ID, API_KEY, SECRET_KEY): # 調(diào)用百度AI接口 client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 循環(huán)遍歷文件家中圖片 images = get_image() for image in images: # 以二進(jìn)制方式打開(kāi)圖片 img_open = open(image, 'rb') # 讀取圖片 img_read = img_open.read() # 調(diào)用表格識(shí)別模塊識(shí)別圖片 table = client.tableRecognitionAsync(img_read) # 獲取請(qǐng)求ID request_id = table['result'][0]['request_id'] # 獲取表格處理結(jié)果 result = client.getTableRecognitionResult(request_id) # 處理狀態(tài)是“已完成”,獲取下載地址 while result['result']['ret_msg'] != '已完成': time.sleep(2) # 暫停2秒再刷新 result = client.getTableRecognitionResult(request_id) download_url = result['result']['result_data'] print(download_url) # 獲取表格數(shù)據(jù) excel_data = requests.get(download_url) # 根據(jù)圖片名字命名表格名稱 xlsx_name = image.split(".")[0] + ".xlsx" # 新建excel文件 xlsx = open(xlsx_name, 'wb') # 將數(shù)據(jù)寫入excel文件并保存 xlsx.write(excel_data.content) if __name__ == '__main__': image_path = r"G:\imgs\\" APP_ID = 'xxxxxxxx' API_KEY = 'xxxxxxx' SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxx' Image_Excel(APP_ID, API_KEY, SECRET_KEY)
4. 案例說(shuō)明
我這里是獲取JRT 0197-2020金融數(shù)據(jù)安全 數(shù)據(jù)安全分級(jí)指南.pdf掃描文件,將內(nèi)部表格數(shù)據(jù)寫入到excel文件。
以上就是Python實(shí)現(xiàn)PDF掃描件生成DOCX或EXCEL功能的詳細(xì)內(nèi)容,更多關(guān)于Python 掃描件轉(zhuǎn)DOCX EXCEL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pip安裝python庫(kù)時(shí)報(bào)Failed?building?wheel?for?xxx錯(cuò)誤的解決方法
最近在使用pip安裝python的時(shí)候遇到些問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于pip安裝python庫(kù)時(shí)報(bào)Failed?building?wheel?for?xxx錯(cuò)誤的解決方法,需要的朋友可以參考下2023-01-01Python enumerate內(nèi)置庫(kù)用法解析
這篇文章主要介紹了Python enumerate內(nèi)置庫(kù)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python 3調(diào)用百度OCR API實(shí)現(xiàn)剪貼板文字識(shí)別
這篇文章主要為大家詳細(xì)介紹了python 3調(diào)用百度OCR API實(shí)現(xiàn)剪貼板文字識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09