python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片
轉載請注明:陳熹 chenx6542@foxmail.com (簡書號:半為花間酒)
若公眾號內轉載請聯系公眾號:早起Python
本例可以學到的知識點:
使用 pdfplumber 提取 PDF 中的文字和表格
使用 fitz 提取 PDF 中的圖片
之前我們已經詳細介紹了批量 PDF 文件的處理,包括合并、拆分、水印、加密等, 批量PDF文件的處理
在文章中詳細剖析了每一行的原理。這里要說明的是,針對 PDF 的模塊較多,且有些模塊功能并不完善,代碼也沒有類似 OFFICE 三件套操作那般簡潔
今天學習的 PDF 圖片提取亦如是。因此更多時候以理解為主,不需要完全掌握代碼書寫,會用會改即可
今天講解的練習數據是一份年度報告,里面有大量的文字、表格、圖片構成
一、模塊安裝
需要安裝兩個模塊,第一個是 pdfplumber
在 Windows 中調出命令行:
pip install pdfplumber
第二個是 fitz, 它是 pymupdf 中的一個模塊
在 Windows 中調出命令行:
pip install pymupdf
二、 PDF 文字提取
代碼思路:
利用 pdfplumber 打開一個 PDF 文件
獲取指定的頁,或者遍歷每一頁
利用 .extract_text() 方法提取當前頁的文字
用上述代碼嘗試提取示例數據中第 12 頁的文字:
import pdfplumber
file_path = r'C:\xxxx\practice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[11]
print(page.extract_text())
提取的內容可以通過導入 python-docx 并借助 wordfile.add_paragraph() 寫入 Word 文件
三、PDF 表格提取
提取單個表格和提取單頁文字的代碼非常類似,用的是 .extract_table()
需要注意,.extract_table() 默認提取指定頁面的第一個表格,如果當前頁面有多個表格都需要提取,則要直接使用 .extract_tables()
例如示例文件中第 13 頁有 2 個表格,我們分別利用 .extract_table() 和 .extract_tables() 觀察輸出情況
import pdfplumber
file_path = r'C:\xxxx\practice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[12]
print(page.extract_table())
是一個嵌套列表,熟悉這種格式的人會理解想到可以用 pandas 或者遍歷該嵌套列表后借助 openpyxl 的 sheet.append(list) 寫入 Excel 文件中
import pdfplumber
file_path = r'C:\xxxx\practice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[12]
print(page.extract_tables())
.extract_tables() 提取當前頁所有表格會產生了一個三級嵌套列表,第一層的列表就代表每一個表格
四、PDF 圖片提取
對于圖片提取,現在沒有任何一個模塊可以做到百分之百的提取。這邊只介紹基于 fitz 模塊的代碼,基本思路是通過正則查找圖片并將其輸出
import fitz
import re
import os
file_path = r'C:\xxx\practice.PDF'
dir_path = r'C:\xxx' # 存放圖片的文件夾
def pdf2pic(path, pic_path):
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"
pdf = fitz.open(path)
lenXREF = pdf._getXrefLength()
imgcount = 0
for i in range(1, lenXREF):
text = pdf._getXrefString(i)
isXObject = re.search(checkXO, text)
isImage = re.search(checkIM, text)
if not isXObject or not isImage:
continue
imgcount += 1
pix = fitz.Pixmap(pdf, i)
new_name = f"img_{imgcount}.png"
if pix.n < 5:
pix.writePNG(os.path.join(pic_path, new_name))
else:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(os.path.join(pic_path, new_name))
pix0 = None
pix = None
pdf2pic(file_path, dir_path)
成功提取了圖片,但 PDF 中的圖片遠不止這些。歡迎有興趣的讀者交流
總結
以上是生活随笔為你收集整理的python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法--Hash算法及其应用场所
- 下一篇: php 获取js对象的属性值,js获取对