Python PDF 自動化教學:用 PyPDF2 實現合併、分割與批量處理報表的完整指南
如果你在工作上經常需要處理 PDF 文件——合併報表、拆分頁面、加浮水印、提取文字——那用 Python 來自動化這些操作可以幫你省下大量重複勞動的時間。我在前公司的時候,每個月要處理上百份 PDF 報表,手動操作至少要花兩天,寫了自動化腳本之後只要五分鐘。今天就用 PyPDF2 這個套件,帶你從零建立一套 PDF 自動化工具箱。
環境設定與安裝
PyPDF2 是 Python 處理 PDF 最熱門的套件之一,安裝非常簡單:
pip install pypdf2如果你需要提取 PDF 裡的文字並且要支援中文,建議一併安裝 pdfplumber,因為 PyPDF2 的中文文字提取有時候會有編碼問題:
pip install pdfplumber另外我習慣搭配 pathlib 來管理檔案路徑,它是 Python 內建的模組,不需要額外安裝。整個專案結構我建議這樣組織:
pdf-automation/
├── input/ # 放原始 PDF 檔案
├── output/ # 輸出處理後的檔案
├── watermarks/ # 浮水印模板
└── main.py # 主程式合併多個 PDF 文件
合併 PDF 是最常見的需求。假設你有十幾份月報要合併成一份年度報告,手動在 Acrobat 裡操作要點很多次,用 Python 幾行就搞定:
from pypdf2 import PdfMerger
from pathlib import Path
def merge_pdfs(input_dir, output_path):
merger = PdfMerger()
pdf_files = sorted(Path(input_dir).glob('*.pdf'))
for pdf_file in pdf_files:
merger.append(str(pdf_file))
print(f'已加入: {pdf_file.name}')
merger.write(str(output_path))
merger.close()
print(f'合併完成!共 {len(pdf_files)} 個檔案 → {output_path}')
merge_pdfs('input/', 'output/merged_report.pdf')這段程式碼會自動讀取 input/ 資料夾裡所有的 PDF 並按檔名排序合併。如果你需要指定合併順序,可以把檔名改成 01_january.pdf、02_february.pdf 這樣的格式。進階一點的話,你還可以用 merger.append(pdf, pages=(start, end)) 來只合併特定頁面。這個技巧搭配Excel 自動化一起用,就能建立一套完整的報表處理流程。
分割 PDF 頁面
分割 PDF 有兩種常見場景:一是把每一頁拆成獨立檔案,二是按照特定範圍拆分。
from pypdf2 import PdfReader, PdfWriter
def split_pdf_by_page(input_path, output_dir):
reader = PdfReader(input_path)
Path(output_dir).mkdir(exist_ok=True)
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
output_path = Path(output_dir) / f'page_{i+1:03d}.pdf'
with open(output_path, 'wb') as f:
writer.write(f)
print(f'分割完成!共 {len(reader.pages)} 頁')
def split_pdf_by_range(input_path, output_path, start, end):
reader = PdfReader(input_path)
writer = PdfWriter()
for i in range(start - 1, min(end, len(reader.pages))):
writer.add_page(reader.pages[i])
with open(output_path, 'wb') as f:
writer.write(f)
print(f'已提取第 {start} 到第 {end} 頁')實際工作中我最常用的是按範圍分割。比如一份 50 頁的合約,前 5 頁是條款、第 6-10 頁是報價單、其餘是附件,用 split_pdf_by_range 就能快速拆分出你需要的部分。
加入浮水印
為 PDF 加浮水印在商業文件處理中非常常見。做法是先準備一個只有浮水印的 PDF(可以用 Word 或 InDesign 製作),然後把它疊加到每一頁上:
def add_watermark(input_path, watermark_path, output_path):
reader = PdfReader(input_path)
watermark = PdfReader(watermark_path)
watermark_page = watermark.pages[0]
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark_page)
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
print(f'浮水印已加入: {output_path}')浮水印 PDF 的製作有個小技巧:把文字設成半透明(30-40% 不透明度),旋轉 45 度角斜放,用淺灰色。這樣加上去之後既能清楚辨識又不會影響閱讀。
提取 PDF 文字內容
提取文字在做資料分析或文件搜尋時很有用。PyPDF2 可以做基本的文字提取,但遇到掃描件或複雜排版的 PDF 效果不太好。中文文件我推薦用 pdfplumber:
import pdfplumber
def extract_text(input_path):
text_content = []
with pdfplumber.open(input_path) as pdf:
for i, page in enumerate(pdf.pages):
text = page.extract_text()
if text:
text_content.append(f'--- 第 {i+1} 頁 ---
{text}')
return '
'.join(text_content)
# 也可以提取表格
def extract_tables(input_path):
with pdfplumber.open(input_path) as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for table in tables:
print(f'第 {i+1} 頁找到表格: {len(table)} 列')提取出來的文字可以再做進一步處理——搜尋關鍵字、生成摘要、或者存入資料庫做全文檢索。
批量處理實戰範例
把上面的功能組合起來,就可以做出強大的批量處理腳本。這是我在前公司實際使用的場景:每個月從 ERP 系統匯出 30 份部門報表(PDF),需要合併成一份、加上「內部機密」浮水印、然後按部門拆分寄出。
from pathlib import Path
from pypdf2 import PdfMerger, PdfReader, PdfWriter
def monthly_report_pipeline(input_dir, output_dir):
input_path = Path(input_dir)
output_path = Path(output_dir)
output_path.mkdir(exist_ok=True)
# Step 1: 合併所有報表
merger = PdfMerger()
for pdf in sorted(input_path.glob('*.pdf')):
merger.append(str(pdf))
merged_path = output_path / 'all_reports.pdf'
merger.write(str(merged_path))
merger.close()
# Step 2: 加浮水印
add_watermark(
str(merged_path),
'watermarks/confidential.pdf',
str(output_path / 'all_reports_watermarked.pdf')
)
# Step 3: 提取文字做索引
text = extract_text(str(merged_path))
with open(output_path / 'report_index.txt', 'w', encoding='utf-8') as f:
f.write(text)
print('月報處理流程完成!')如果你需要定期執行這個腳本,可以搭配APScheduler 排程自動化設定每月自動執行。也可以用裝飾器來加入日誌記錄和錯誤處理功能,讓腳本更健壯。
進階技巧與注意事項
分享幾個實戰中踩過的坑。第一,加密的 PDF 要先解密才能處理——用 reader.decrypt('password')。第二,某些 PDF 的頁面旋轉資訊會在合併時出問題,用 page.rotate(0) 重設旋轉角度可以解決。第三,處理大型 PDF(超過 500 頁)時記憶體可能不夠,建議分批處理。
如果你的需求更複雜——比如要生成 PDF 報表——可以看看 reportlab 這個套件,它可以從零開始創建 PDF,搭配 PyPDF2 做後處理就是一套完整的 PDF 工作流程。把這套工具整合進FastAPI 後端,還能做成 API 服務讓團隊其他人透過網頁上傳 PDF 並自動處理。
Python 的 PDF 自動化是我認為投資報酬率最高的自動化項目之一。寫一次腳本,之後每個月都能省下幾個小時的重複勞動。如果你的工作涉及大量文件處理,真的值得花一個下午把這些工具學起來。
繼續閱讀
Python Requests 網頁爬蟲入門:從 HTTP 請求到資料擷取完整教學
想用 Python 自動抓取網頁資料?這篇手把手教你用 Requests + BeautifulSoup 建立你的第一支爬蟲程式。
相關文章
你可能也喜歡
探索其他領域的精選好文