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的问题

    今天小编就为大家分享一篇解决pip install的时候报错timed out的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python 使用os.remove删除文件夹时报错的解决方法

    Python 使用os.remove删除文件夹时报错的解决方法

    下面小编就为大家带来一篇Python 使用os.remove删除文件夹时报错的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Python 实现两个列表里元素对应相乘的方法

    Python 实现两个列表里元素对应相乘的方法

    今天小编就为大家分享一篇Python 实现两个列表里元素对应相乘的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python如何做代码性能分析

    python如何做代码性能分析

    这篇文章主要介绍了python如何做代码性能分析,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • Python+SimpleRNN实现股票预测详解

    Python+SimpleRNN实现股票预测详解

    这篇文章主要为大家详细介绍了如何利用Python和SimpleRNN实现股票预测效果,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下
    2022-05-05
  • 使用python爬虫获取黄金价格的核心代码

    使用python爬虫获取黄金价格的核心代码

    这篇文章主要介绍了利用python爬虫获取黄金价格,需要的朋友可以参考下
    2018-06-06
  • Python采集某网站文档并保存word格式的示例

    Python采集某网站文档并保存word格式的示例

    这篇文章主要介绍了Python采集某网站文档并保存word格式的示例,我们平常需要下载文档的时候,是不是发现,要么不能下载,要么不能复制,那么我们今天来分享一下,如何用Python将这些不给下载的文档给批量下载下来,需要的朋友可以参考下
    2023-07-07
  • 一文详解如何使用Python实时输出鼠标坐标

    一文详解如何使用Python实时输出鼠标坐标

    本文详细介绍了如何使用Python中的pynput库来实时获取并输出鼠标的坐标信息,通过pynput库,可以轻松实现对鼠标坐标的跟踪,适用于需要鼠标交互的应用场景,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 常用python编程模板汇总

    常用python编程模板汇总

    这篇文章主要为大家详细介绍了常用python编程模板,总结了Python编程常用模板,感兴趣的朋友可以参考一下
    2016-02-02
  • Python脚本实现一键执行MySQL与达梦数据库的SQL

    Python脚本实现一键执行MySQL与达梦数据库的SQL

    这篇文章主要为大家详细介绍了如何使用Python 脚本 + PyInstaller 打包成可执行文件,一键搞定 MySQL 和达梦(DM)数据库的 SQL 执行,希望对大家有所帮助
    2025-08-08

最新评论