Python實現(xiàn)PDF掃描件生成DOCX或EXCEL功能
1.問題描述
應項目需求需要獲取PDF掃描文件的內容,但尋遍整個網絡能達到這種功能的產品,都要會員充值。苦于囊中羞澀也只好編寫功能代碼來實現(xiàn)了。
如PDF中表格圖片圖-1效果生成圖-2

圖-1

圖-2
2.實現(xiàn)流程
整個步驟為:讀取PDF文件->生成圖片->ORC獲取圖片內容->寫入Excel

3.功能代碼
3.1 pdf轉為圖片
import fitz # pdf轉為圖片
from aip import AipOcr # 圖片文字識別
import time # 程序運行時間間隔以避免出錯
import docx # 將識別結果保存為docx文件
from docx.oxml.ns import qn # 設置docx文件的字體
""" 你的 APPID AK SK """
APP_ID = 'xxxxxx'
API_KEY = 'xxxxxxxx'
SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxx'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
'''
將PDF轉化為圖片
pdfPath pdf文件的路徑
imgPath 圖像要保存的路徑
zoom_x x方向的縮放系數(shù)
zoom_y y方向的縮放系數(shù)
rotation_angle 旋轉角度
zoom_x和zoom_y一般取相同值,值越大,圖像分辨率越高
返回目標pdf的名稱和頁數(shù),便于下一步操作
'''
def pdf_image(pdfPath, imgPath, zoom_x=10, zoom_y=10, rotation_angle=0):
# 獲取pdf文件名稱
name = pdfPath.split("\\")[-1].split('.pdf')[0]
# 打開PDF文件
pdf = fitz.open(pdfPath)
# 獲取pdf頁數(shù)
num = pdf.pageCount
# 逐頁讀取PDF
for pg in range(0, num):
page = pdf[pg]
# 設置縮放和旋轉系數(shù)
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 開始寫圖像
pm.writePNG(imgPath + name + "_" + str(pg) + ".png")
pdf.close()
return name, num
'''
將圖片讀取為docx文件
imgPath 圖像所在路徑
生成的docx也保存在圖像所在路徑中
name為pdf名稱(不含后綴)
num為pdf頁數(shù)
name和num均可由上一個函數(shù)返回
'''
def ReadDetail_docx(imgPath, name, num):
# 建立一個空doc文檔
doc = docx.Document()
# 設置全局字體
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')
# 將內容寫入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文件轉換為圖片...")
# 調用函數(shù)一將pdf轉換為圖片,并獲得文件名和頁數(shù)
name_, num_ = pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle)
print("轉換成功!")
#print("正在讀取圖片內容...")
# 調用函數(shù)二逐頁讀取圖片并逐行保存在docx文件中
# ReadDetail_docx(imgPath, name_, num_)
#print("名為 {}.pdf 的pdf文件共有{}頁,已成功轉換為docx文件!".format(name_, num_))
# pdf儲存路徑
pdf_path = "JRT 0197-2020金融數(shù)據(jù)安全 數(shù)據(jù)安全分級指南.pdf"
# 圖片和生成的docx文件的儲存路徑
img_path = r"G:\imges\\"
# 調用函數(shù)
pdf_to_docx(pdf_path, img_path)
3.2 表格圖片文字識別到excel
import pandas as pd
import numpy as np
import re
# 圖片識別
from aip import AipOcr
# 時間模塊
import time
# 網頁獲取
import requests
# 操作系統(tǒng)接口模塊
import os
image_path = ''
# 獲取文件夾中所有圖片
def get_image():
images = [] # 存儲文件夾內所有文件的路徑(包括子目錄內的文件)
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):
# 調用百度AI接口
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 循環(huán)遍歷文件家中圖片
images = get_image()
for image in images:
# 以二進制方式打開圖片
img_open = open(image, 'rb')
# 讀取圖片
img_read = img_open.read()
# 調用表格識別模塊識別圖片
table = client.tableRecognitionAsync(img_read)
# 獲取請求ID
request_id = table['result'][0]['request_id']
# 獲取表格處理結果
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. 案例說明
我這里是獲取JRT 0197-2020金融數(shù)據(jù)安全 數(shù)據(jù)安全分級指南.pdf掃描文件,將內部表格數(shù)據(jù)寫入到excel文件。


以上就是Python實現(xiàn)PDF掃描件生成DOCX或EXCEL功能的詳細內容,更多關于Python 掃描件轉DOCX EXCEL的資料請關注腳本之家其它相關文章!
相關文章
pip安裝python庫時報Failed?building?wheel?for?xxx錯誤的解決方法
最近在使用pip安裝python的時候遇到些問題,所以下面這篇文章主要給大家介紹了關于pip安裝python庫時報Failed?building?wheel?for?xxx錯誤的解決方法,需要的朋友可以參考下2023-01-01
python 3調用百度OCR API實現(xiàn)剪貼板文字識別
這篇文章主要為大家詳細介紹了python 3調用百度OCR API實現(xiàn)剪貼板文字識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09

