*用Python將 PDF 中的表格提取為 Excel/CSV,*支持文本型 PDF 和 掃描件/圖片型 PDF(需 OCR 識別)。程序包含以下功能:
1.自動檢測 PDF 類型(文本 or 掃描件)
2.提取表格數(shù)據(jù)并保存為 Excel/CSV
3.處理多頁 PDF
4.命令行交互 & 圖形界面(可選)
1. 安裝依賴庫
運行前,先安裝所需庫:
pip install tabula-py pandas pytesseract pdf2image opencv-python pillow
2. 完整代碼
導(dǎo)入相關(guān)模塊
import os
import pandas as pd
import tabula
from pdf2image import convert_from_path
import pytesseract
import cv2
import tempfile
import argparse
定義函數(shù)
def pdf_to_excel(pdf_path, output_path, use_ocr=False):
"""
將 PDF 中的表格轉(zhuǎn)換為 Excel 文件
:param pdf_path: PDF 文件路徑
:param output_path: 輸出 Excel/CSV 路徑
:param use_ocr: 是否強制使用 OCR(針對掃描件)
"""
try:
# 檢查輸出格式
file_ext = os.path.splitext(output_path)[1].lower()
if file_ext not in ['.xlsx', '.csv']:
raise ValueError("輸出文件格式必須是 .xlsx 或 .csv")
# 嘗試直接提取文本表格(非掃描件)
if not use_ocr:
try:
print("嘗試提取文本表格...")
dfs = tabula.read_pdf(pdf_path, pages='all', multiple_tables=True)
if not dfs:
raise RuntimeError("未檢測到表格,可能為掃描件圖片。")
# 合并所有表格頁
combined_df = pd.concat(dfs, ignore_index=True)
if file_ext == '.xlsx':
combined_df.to_excel(output_path, index=False)
else:
combined_df.to_csv(output_path, index=False)
print(f"轉(zhuǎn)換成功!結(jié)果已保存至: {output_path}")
return
except Exception as e:
print(f"文本提取失?。赡転閽呙杓瑖L試 OCR: {e}")
use_ocr = True
# OCR 處理掃描件/圖片
if use_ocr:
print("正在使用 OCR 識別掃描件...")
with tempfile.TemporaryDirectory() as temp_dir:
# 將 PDF 轉(zhuǎn)換為圖片
images = convert_from_path(pdf_path, output_folder=temp_dir)
all_text = []
for i, img in enumerate(images):
img_path = os.path.join(temp_dir, f"page_{i+1}.jpg")
img.save(img_path, 'JPEG')
# 使用 OpenCV 增強圖像(可選)
img_cv = cv2.imread(img_path)
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# OCR 識別
text = pytesseract.image_to_string(thresh, config='--psm 6')
all_text.append(text)
# 將識別結(jié)果保存為表格
text_combined = "\n".join(all_text)
lines = [line.split() for line in text_combined.split('\n') if line.strip()]
df = pd.DataFrame(lines)
if file_ext == '.xlsx':
df.to_excel(output_path, index=False, header=False)
else:
df.to_csv(output_path, index=False, header=False)
print(f"OCR 轉(zhuǎn)換完成!結(jié)果已保存至: {output_path}")
except Exception as e:
print(f"轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
# 命令行參數(shù)解析
parser = argparse.ArgumentParser(description="PDF 表格提取工具")
parser.add_argument("pdf_path", help="輸入的 PDF 文件路徑")
parser.add_argument("output_path", help="輸出的 Excel/CSV 文件路徑")
parser.add_argument("--ocr", action="store_true", help="強制使用 OCR(針對掃描件)")
args = parser.parse_args()
# 運行轉(zhuǎn)換
pdf_to_excel(args.pdf_path, args.output_path, args.ocr)
命令行運行
# 默認自動檢測 PDF 類型
python pdf_to_excel.py input.pdf output.xlsx
# 強制使用 OCR(針對掃描件)
python pdf_to_excel.py scanned.pdf output.csv --ocr
直接調(diào)用函數(shù)
pdf_to_excel("input.pdf", "output.xlsx", use_ocr=False)
重點說明:
文本型 PDF:使用 tabula-py 直接提取表格結(jié)構(gòu)。
掃描件/圖片 PDF:
通過 pdf2image 將 PDF 轉(zhuǎn)為圖片。
使用 OpenCV 對圖像預(yù)處理(二值化、去噪)。
調(diào)用 pytesseract(Tesseract OCR)識別文字并生成表格。
掃描件質(zhì)量:OCR 精度受圖片清晰度影響,建議高分辨率 PDF。
復(fù)雜表格:若表格有合并單元格,可能需要手動調(diào)整輸出結(jié)果。
中文支持:確保 Tesseract 安裝了中文語言包(chi_sim)。
如果需要進一步優(yōu)化(如自定義表格解析邏輯),可以在此基礎(chǔ)上擴展!
閱讀原文:原文鏈接
該文章在 2025/8/28 15:44:50 編輯過