首頁 > 軟體

Python實現PDF掃描件生成DOCX或EXCEL功能

2022-03-05 13:00:07

1.問題描述

應專案需求需要獲取PDF掃描檔案的內容,但尋遍整個網路能達到這種功能的產品,都要會員充值。苦於囊中羞澀也只好編寫功能程式碼來實現了。

如PDF中表格圖片圖-1效果生成圖-2

圖-1

圖-2

2.實現流程

整個步驟為:讀取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方向的縮放係數
zoom_y y方向的縮放係數
rotation_angle 旋轉角度
zoom_x和zoom_y一般取相同值,值越大,影象解析度越高
返回目標pdf的名稱和頁數,便於下一步操作

'''
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頁數
    num = pdf.pageCount
    # 逐頁讀取PDF
    for pg in range(0, num):
        page = pdf[pg]
        # 設定縮放和旋轉系數
        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頁數
name和num均可由上一個函數返回

'''
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檔案轉換為圖片...")
    # 呼叫函數一將pdf轉換為圖片,並獲得檔名和頁數
    name_, num_ = pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle)
    print("轉換成功!")
    #print("正在讀取圖片內容...")
    # 呼叫函數二逐頁讀取圖片並逐行儲存在docx檔案中
   # ReadDetail_docx(imgPath, name_, num_)
    #print("名為 {}.pdf 的pdf檔案共有{}頁,已成功轉換為docx檔案!".format(name_, num_))

# pdf儲存路徑
pdf_path = "JRT 0197-2020金融資料安全 資料安全分級指南.pdf"
# 圖片和生成的docx檔案的儲存路徑
img_path = r"G:imges\"
# 呼叫函數
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
# 作業系統介面模組
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)
    # 迴圈遍歷檔案家中圖片
    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)
        # 處理狀態是「已完成」,獲取下載地址
        while result['result']['ret_msg'] != '已完成':
            time.sleep(2)  # 暫停2秒再重新整理
            result = client.getTableRecognitionResult(request_id)
        download_url = result['result']['result_data']
        print(download_url)
        # 獲取表格資料
        excel_data = requests.get(download_url)
        # 根據圖片名字命名錶格名稱
        xlsx_name = image.split(".")[0] + ".xlsx"
        # 新建excel檔案
        xlsx = open(xlsx_name, 'wb')
        # 將資料寫入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金融資料安全 資料安全分級指南.pdf掃描檔案,將內部表格資料寫入到excel檔案。

以上就是Python實現PDF掃描件生成DOCX或EXCEL功能的詳細內容,更多關於Python 掃描件轉DOCX EXCEL的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com