以PDF表单批量填写与数据提取为核心,通过Python的PyPDF2和pdfplumber库实现自动化处理。案例一根据Excel数据批量生成合同;案例二提取已填写表单字段及扫描件中的表格数据,并整合为完整工作流。
处理PDF表单(PDF Form)是办公自动化中一项具备一定技术门槛的操作,但也是真正能够提升效率、减少重复劳动的关键技能。批量填写合同模板、生成大量报表、提取表单数据,这些需求在职场中十分常见。本文通过两个完整案例,帮助大家全面掌握PDF表单的批量处理与数据提取方法。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
一个典型的应用场景是:手头有一份PDF合同模板,其中预设了姓名、金额、日期等表单字段,需要根据Excel数据批量生成合同。具体操作步骤如下。
首先安装两个必要的Python库:
pip install pdfplumber PyPDF2
如果不清楚模板中包含哪些字段,可以先编写一个脚本进行扫描:
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', '')}")明确字段信息后,即可进行批量填写。核心逻辑封装在以下函数中,它接收模板路径、输出路径和字段数据字典,自动完成填写并保存。
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表单填写后,下一步往往涉及数据提取。这里分两种情况:提取已填写的表单字段数据,以及从扫描件或不可填写的PDF中提取表格内容。
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}")如果PDF中没有可编辑的表单字段,但内容以表格形式呈现,可以使用pdfplumber进行提取。
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将以上环节串联起来,即可构建一条完整的PDF表单处理流水线。
def daily_pdf_pipeline():
"""每日PDF处理流水线"""
print("开始PDF处理...")
form_data = extract_form_data("日报表.pdf")
print(f"提取到{len(form_data)}个字段")
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)}行数据")
print("处理完成!")在实际操作中需留意以下几点:
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述