Python批量处理PDF表单与合并的实战指南
更新时间:2026年07月13日 08:32:53 作者:张老师技术栈
处理 PDF 表单(PDF Form)是办公自动化中一个比较高级的需求——批量填写合同模板、生成大量报表、提取表单数据,这篇用两个完整案例讲清楚,需要的朋友可以参考下
处理 PDF 表单(PDF Form)是办公自动化中一个比较高级的需求——批量填写合同模板、生成大量报表、提取表单数据。这篇用两个完整案例讲清楚。
一、案例一:批量填写 PDF 表单
假设你有一份 PDF 合同模板,里面有表单字段(姓名、金额、日期等),需要根据 Excel 数据批量填写并生成合同。
1. 准备工作
pip install pdfplumber PyPDF2
2. 查看 PDF 表单字段
import pdfplumber
def inspect_form_fields(pdf_path):
"""查看 PDF 中的表单字段信息"""
with pdfplumber.open(pdf_path) as pdf:
for i, page in enumerate(pdf.pages):
# 获取注释(包括表单字段)
annotations = page.annots
if annotations:
print(f"第 {i+1} 页表单字段:")
for ann in annotations:
print(f" - {ann.get('name', '未命名')}: "
f"类型={ann.get('subtype', '')}")
3. 批量填写
from PyPDF2 import PdfReader, PdfWriter
import pandas as pd
def fill_pdf_form(template_path, output_path, data_dict):
"""
填写 PDF 表单
template_path: 模板 PDF
output_path: 输出 PDF
data_dict: 字段名→值的字典
"""
reader = PdfReader(template_path)
writer = PdfWriter()
page = reader.pages[0]
# 更新表单字段
writer.add_page(page)
# 设置表单字段值
writer.update_page_form_field_values(
writer.pages[0], data_dict
)
# 保存
with open(output_path, "wb") as f:
writer.write(f)
def batch_fill_forms(template_path, excel_path, output_dir):
"""根据 Excel 数据批量生成 PDF 合同"""
import os
os.makedirs(output_dir, exist_ok=True)
df = pd.read_excel(excel_path)
for _, row in df.iterrows():
# 构建字段数据
data = {
"name": row["客户名称"],
"amount": str(row["金额"]),
"date": str(row["签订日期"]),
"contract_no": row["合同编号"],
}
output = os.path.join(
output_dir,
f"合同_{row['客户名称']}.pdf"
)
fill_pdf_form(template_path, output, data)
print(f"已生成: {output}")
二、案例二:提取 PDF 表单数据
1. 提取已填写的表单
def extract_form_data(pdf_path):
"""提取 PDF 表单中的填写数据"""
reader = PdfReader(pdf_path)
fields = reader.get_form_text_fields()
print("表单字段提取结果:")
for field_name, value in fields.items():
print(f" {field_name}: {value}")
return fields
def batch_extract(pdf_dir, output_excel):
"""批量提取多个 PDF 表单到 Excel"""
import os
all_data = []
for f in os.listdir(pdf_dir):
if f.endswith(".pdf"):
fields = extract_form_data(
os.path.join(pdf_dir, f)
)
fields["来源文件"] = f
all_data.append(fields)
if all_data:
df = pd.DataFrame(all_data)
df.to_excel(output_excel, index=False)
print(f"共提取 {len(all_data)} 份表单: {output_excel}")
2. 提取不可填写的表格数据
def extract_table_from_scanned(pdf_path):
"""
从扫描件或不可填写的 PDF 中提取表格
适用于文字型 PDF 中的表格数据
"""
import pdfplumber
import pandas as pd
with pdfplumber.open(pdf_path) as pdf:
all_tables = []
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for table in tables:
if table and len(table) > 1:
# 第一行为表头
df = pd.DataFrame(
table[1:],
columns=table[0]
)
all_tables.append(df)
print(f"第{i+1}页找到表格: {len(table)}行")
if all_tables:
result = pd.concat(
all_tables, ignore_index=True
)
return result
return None
3. 完整工作流
def daily_pdf_pipeline():
"""每日 PDF 处理流水线"""
print("开始 PDF 处理...")
# 1. 提取表单数据
form_data = extract_form_data("日报表.pdf")
print(f"提取到 {len(form_data)} 个字段")
# 2. 提取表格数据
table_df = extract_table_from_scanned("明细.pdf")
if table_df is not None:
table_df.to_excel("提取数据.xlsx", index=False)
print(f"导出 {len(table_df)} 行数据")
# 3. 生成汇总报告
# ...
print("处理完成!")
三、注意事项
1. PDF 表单需要是 AcroForm 格式,不是扫描件 2. 拍照/扫描件需要先 OCR 识别 3. 批量处理前先测试一个样本 4. 中文字体在 PDF 中需要嵌入,否则显示方框
到此这篇关于Python批量处理PDF表单与合并的实战指南的文章就介绍到这了,更多相关Python处理PDF表单与合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决pip install的时候报错timed out的问题
今天小编就为大家分享一篇解决pip install的时候报错timed out的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-06-06
Python 使用os.remove删除文件夹时报错的解决方法
下面小编就为大家带来一篇Python 使用os.remove删除文件夹时报错的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-01-01


最新评论