作為財務、審計、數(shù)據(jù)分析的打工人,你是否經(jīng)常遇到這樣的場景:收到幾十頁的PDF報告,需要手動復制其中的表格到Excel,稍有不慎就錯位亂碼,加班到深夜……
本文用 5個真實案例 + 10段即用代碼,教你用Python實現(xiàn)PDF表格全自動提取→清洗→導出Excel,從此告別復制粘貼!文末附完整工具包。
一、PDF表格提取的三大痛點
- 格式混亂
- 中文亂碼
- 掃描件難題:圖片型PDF無法直接讀?。ㄐ鐿CR,文末附方案)
二、工具鏈:pdfplumber + pandas
2.1 環(huán)境準備
pip install pdfplumber pandas openpyxl
2.2 核心工具說明
- pdfplumber
- pandas:數(shù)據(jù)清洗、合并、導出Excel
- openpyxl
三、基礎(chǔ)案例:提取簡單表格
案例1:單頁PDF → 單Sheet Excel
目標:將如下結(jié)構(gòu)的銷售數(shù)據(jù)表提取到Excel(無需圖片,直接模擬數(shù)據(jù)):
PDF表格示例
產(chǎn)品 銷量 單價 銷售額
手機 100 2000 200000
筆記本 50 5000 250000
import pdfplumber
import pandas as pd
def pdf_to_excel(pdf_path, excel_path):
with pdfplumber.open(pdf_path) as pdf:
first_page = pdf.pages[0]
table = first_page.extract_table()
df = pd.DataFrame(table[1:], columns=table[0])
df.to_excel(excel_path, index=False)
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="產(chǎn)品 銷量 單價 銷售額", ln=True)
pdf.cell(200, 10, txt="手機 100 2000 200000", ln=True)
pdf.cell(200, 10, txt="筆記本 50 5000 250000", ln=True)
pdf.output("sales.pdf")
pdf_to_excel("sales.pdf", "sales.xlsx")
輸出Excel效果
四、進階案例:處理復雜表格
案例2:多頁PDF → 多Sheet Excel
目標:將年報中的多頁表格合并到一個Excel的不同Sheet
def multi_page_to_excel(pdf_path, excel_path):
with pdfplumber.open(pdf_path) as pdf:
with pd.ExcelWriter(excel_path, engine='openpyxl') as writer:
for i, page in enumerate(pdf.pages):
table = page.extract_table()
if table:
df = pd.DataFrame(table[1:], columns=table[0])
df.to_excel(writer, sheet_name=f"Sheet_{i+1}", index=False)
pdf = FPDF()
for _ in range(2):
pdf.add_page()
pdf.cell(200, 10, txt="產(chǎn)品 銷量 單價 銷售額", ln=True)
pdf.cell(200, 10, txt="手機 100 2000 200000", ln=True)
pdf.output("multi_page.pdf")
multi_page_to_excel("multi_page.pdf", "multi_page.xlsx")
案例3:處理合并單元格
目標:提取如下結(jié)構(gòu)的合并單元格表格:
PDF表格示例
地區(qū) 城市 銷售額
華東 上海 500
杭州 300
def handle_merged_cells(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
page = pdf.pages[0]
table = page.extract_table({
"vertical_strategy": "lines",
"horizontal_strategy": "lines"
})
df = pd.DataFrame(table)
df.iloc[1:3, 0] = df.iloc[0, 0]
return df
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="地區(qū) 城市 銷售額", ln=True)
pdf.cell(200, 10, txt="華東 上海 500", ln=True)
pdf.cell(200, 10, txt=" 杭州 300", ln=True)
pdf.output("merged.pdf")
df = handle_merged_cells("merged.pdf")
df.to_excel("merged.xlsx")
輸出Excel效果
案例4:處理掃描件PDF(OCR方案)
目標:圖片型PDF的文字識別
from pdf2image import convert_from_path
import pytesseract
import cv2
import numpy as np
def ocr_pdf_table(pdf_path):
images = convert_from_path(pdf_path, 500)
all_dfs = []
for img in images:
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
text = pytesseract.image_to_string(thresh)
# 解析文本為表格
rows = [line.split() for line in text.split('\n') if line.strip()]
df = pd.DataFrame(rows[1:], columns=rows[0])
all_dfs.append(df)
return pd.concat(all_dfs)
# 生成測試圖片型PDF(需提前截圖為PDF)
# 假設(shè)掃描件內(nèi)容與案例1相同
final_df = ocr_pdf_table("scanned.pdf")
final_df.to_excel("scanned_output.xlsx")
五、避坑指南:常見問題解決
5.1 中文亂碼問題
with pdfplumber.open(pdf_path, encoding="UTF-8") as pdf:
...
df.to_excel("output.xlsx", encoding="utf-8-sig")
5.2 表格錯位校正
table = page.extract_table({
"vertical_strategy": "text",
"horizontal_strategy": "text",
"snap_tolerance": 4
})
5.3 處理空白單元格
df.fillna("N/A", inplace=True)
df.dropna(how="all", inplace=True)
閱讀原文:原文鏈接
該文章在 2025/8/28 15:41:56 編輯過