惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
D
Docker
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
Project Zero
Project Zero
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
I
Intezer
腾讯CDC
M
MIT News - Artificial intelligence
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
G
Google Developers Blog
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
Recent Announcements
Recent Announcements
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
T
Threatpost
Latest news
Latest news
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
The GitHub Blog
The GitHub Blog
T
Tor Project blog
P
Proofpoint News Feed

博客园 - E-iceblue

Python 拆分 Excel 文件:使用 Spire.XLS 实现按工作表、行、列和条件拆分 如何使用 Python 快速将 Excel 转换为 XML 文件 Python 办公自动化:Word 文档加密与权限控制实战 在 Python 中快速锁定 Excel 单元格与行列 使用 Python 在 Word 文档中添加或删除文本框 如何使 PDF 可编辑 - Python 教程详解 将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化) Python 办公自动化:如何轻松调整 Word/PDF 页面大小为 Legal 尺寸 数字签名 vs 电子签名:区别与如何在文件中插入数字签名 Python 教程:快速复制 Excel 工作表 如何对比 Excel 两列数据的不同:从基础操作到 Python 自动化 如何提取 Word 文档中的表格并导出为 Excel(Python 教程) 使用 Python 在 PowerPoint 中添加或移除背景图和背景颜色 在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理) 在 Python 中自动化转化 Markdown 为 HTML 【详细教程】 Python 控制 PDF 页面大小、页边距、页面方向与缩放 Python 办公自动化:快速将 HTML 转换为 PDF 格式 在 Python 中给 PDF 设置背景图或背景色 在 Python 中转换 XML 为 PDF 文档:基础转换与转换设置 在 Python 中对比 Word 文档:自动生成修订报告【教程向】 Excel 删除空白行的 5 种方法 【手动与 Python 自动化】 删除 Excel 表格中的重复行 【4 种实用方法】 从纯文本到精美文档:TXT 转 PDF 的三种高效方案 PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET) 为什么生成的条形码扫不出来?从静区、分辨率和色彩三个方向解析条码识别率 Excel vs CSV:在系统数据处理中该如何选择?(附格式转换代码示例) 【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现 零成本实现文档智能:本地化 OCR 提取与 AI 处理全流程实战 PPT 智能提取与分析实战:把演示文档变成结构化数据 为什么 PDF 文本能看到,却提取不到?从开发者角度解析与解决方案 PDF 文件为什么打不开?常见原因与解决思路 PDF vs PDF/A:区别、场景与常用转换方法(2026 全面解读) 使用 Java 将 PowerPoint 转换为 PDF 的完整指南 如何在 Python 中轻松添加、隐藏和删除幻灯片
Python 实现 PDF 表单域的自动化创建与智能填充
E-iceblue · 2026-02-12 · via 博客园 - E-iceblue

在很多业务场景中,PDF 表单不仅仅是展示模板,更是数据采集与流转的关键载体。相比传统“打印—填写—扫描”的方式,交互式 PDF 表单可以让用户直接在线填写并提交数据,大幅提升信息收集效率。

无论是问卷调查、客户登记,还是入职申请表,只要表单结构设计合理,就可以实现数据的自动化采集与管理。本文将介绍如何使用 Spire.PDF for Python 创建可填写的 PDF 表单,并进一步实现自动填充。

一、安装 Spire.PDF for Python

本教程依赖:

  • Spire.PDF for Python
  • plum-dispatch v1.7.4(底层方法分发支持)

安装方式如下:

pip install Spire.PDF

该库还为小型项目提供了免费版:pip install Spire.PDF.Free

如果你在 Windows 环境下安装遇到问题,可以参考官方安装说明文档。

二、Python 在 PDF 中创建可填写表单域

在创建 PDF 表单之前,我们需要理解一个核心结构:

  • PdfForm —— 表示整个交互式表单
  • PdfField —— 表示单个字段
  • 各类字段对象 —— 表示不同类型的表单控件

Spire.PDF 提供了丰富的字段类型,常用的包括:

类名 说明 常用属性
PdfTextBoxField 文本框,用于录入姓名、地址等 Bounds, Font, Text
PdfCheckBoxField 复选框,用于多选场景 Checked (True/False)
PdfRadioButtonListField 单选按钮组,互斥选项 Items, SelectedIndex
PdfComboBoxField 组合框(下拉列表) Items, Font
PdfButtonField 提交/重置按钮 Actions.MouseDown

在多数业务表单中,基本就是这些类型的组合。

三、表单创建的整体流程与实现思路

在了解了不同表单域类型及其用途之后,下一步就是把这些字段真正组织成一份可用的 PDF 表单。从实现角度来看,表单创建并不复杂,本质上就是先搭好文档结构,再逐步往里放入字段控件。只要流程清晰,后续扩展或调整字段都会非常轻松。

创建表单的基本步骤如下:

  • 创建 PdfDocument
  • 添加页面
  • 创建字段对象
  • 设置字段位置(Bounds)
  • 添加到 doc.Form.Fields
  • 保存文档

下面我们通过一个简单的示例,构建一份员工入职登记表模板,包含文本输入、材料清单复选、性别单选以及部门与职位级别的下拉选择控件:

from spire.pdf.common import *
from spire.pdf import *

# 初始化文档
doc = PdfDocument()
page = doc.Pages.Add()

# 定义布局基准坐标
baseX = 120.0
baseY = 40.0
brush_title = PdfSolidBrush(PdfRGBColor(Color.get_DarkBlue()))
brush_text = PdfSolidBrush(PdfRGBColor(Color.get_Black()))
# 设置字体
font = PdfTrueTypeFont("宋体", 11.0, PdfFontStyle.Regular, True)

# 1. 文本框:姓名
page.Canvas.DrawString("员工姓名:", font, brush_title, PointF(10.0, baseY))
txt_name = PdfTextBoxField(page, "EmpName")
txt_name.Bounds = RectangleF(baseX, baseY, 160.0, 16.0)
txt_name.Font = font
doc.Form.Fields.Add(txt_name)

# 2. 复选框:入职材料清单
baseY += 35.0
page.Canvas.DrawString("提交材料:", font, brush_title, PointF(10.0, baseY))
# 选项一:身份证
cb_id = PdfCheckBoxField(page, "Doc_ID")
cb_id.Bounds = RectangleF(baseX, baseY, 16.0, 16.0)
doc.Form.Fields.Add(cb_id)
page.Canvas.DrawString("身份证复印件", font, brush_text, PointF(baseX + 22.0, baseY))

# 选项二:学历学位证书
cb_edu = PdfCheckBoxField(page, "Doc_Edu")
cb_edu.Bounds = RectangleF(baseX + 100.0, baseY, 16.0, 16.0)
doc.Form.Fields.Add(cb_edu)
page.Canvas.DrawString("学历学位证书", font, brush_text, PointF(baseX + 122.0, baseY))

# 3. 单选按钮:性别
baseY += 35.0
page.Canvas.DrawString("性别:", font, brush_title, PointF(10.0, baseY))
rb_gender = PdfRadioButtonListField(page, "Gender")
item_m = PdfRadioButtonListItem("男")
item_m.Bounds = RectangleF(baseX, baseY, 16.0, 16.0)
page.Canvas.DrawString("男", font, brush_text, PointF(baseX + 22.0, baseY))
item_f = PdfRadioButtonListItem("女")
item_f.Bounds = RectangleF(baseX + 60.0, baseY, 16.0, 16.0)
page.Canvas.DrawString("女", font, brush_text, PointF(baseX + 82.0, baseY))
rb_gender.Items.Add(item_m)
rb_gender.Items.Add(item_f)
doc.Form.Fields.Add(rb_gender)

# 4. 组合框:所属部门
baseY += 35.0
page.Canvas.DrawString("入职部门:", font, brush_title, PointF(10.0, baseY))
cmb_dept = PdfComboBoxField(page, "Dept")
cmb_dept.Bounds = RectangleF(baseX, baseY, 160.0, 16.0)
cmb_dept.Items.Add(PdfListFieldItem("研发部", "RD"))
cmb_dept.Items.Add(PdfListFieldItem("市场部", "MKT"))
cmb_dept.Items.Add(PdfListFieldItem("行政部", "ADMIN"))
cmb_dept.Font = font
doc.Form.Fields.Add(cmb_dept)

# 5. 组合框:职位级别
baseY += 35.0
page.Canvas.DrawString("职位级别:", font, brush_title, PointF(10.0, baseY))
cmb_level = PdfComboBoxField(page, "JobLevel")
cmb_level.Bounds = RectangleF(baseX, baseY, 160.0, 16.0)
cmb_level.Items.Add(PdfListFieldItem("初级 (P1-P2)", "Junior"))
cmb_level.Items.Add(PdfListFieldItem("中级 (P3-P5)", "Senior"))
cmb_level.Items.Add(PdfListFieldItem("高级 (P6+)", "Expert"))
cmb_level.Font = font
doc.Form.Fields.Add(cmb_level)

# 6. 保存模板
doc.SaveToFile("/output/入职表.pdf")
doc.Close()

Spire.PDF for Python 创建的 PDF 表单域预览:

Spire.PDF 创建的表单域

四、Python 填充 PDF 表单的实现思路与流程

在完成 PDF 表单模板的创建之后,下一步就是通过程序自动写入数据,例如员工信息、系统导出的业务数据等。相比手动填写,程序化填充不仅效率更高,也更适合批量处理和自动化场景。下面从整体流程入手,说明 Python 填充 PDF 表单域的核心思路。

填充流程的核心逻辑是:

  1. 加载 PDF
  2. 获取表单对象
  3. 获取字段集合
  4. 根据字段类型和名称进行赋值

在前一节中,我们已经通过代码创建了一个包含多种表单控件的 PDF 入职表。接下来,我们将基于这个已创建的表单,演示如何使用 Python 自动为各类表单域赋值,实现入职信息的批量或程序化填写。

下面的示例代码以该入职表为例,分别对文本框、复选框、单选按钮和组合框等字段进行填充,并最终生成一份已填写完成的 PDF 入职表。

from spire.pdf.common import *
from spire.pdf import *

# 1. 加载文档
doc = PdfDocument()
doc.LoadFromFile("E:/Administrator/Python1/output/入职表.pdf")

# 2. 获取表单字段集合
form = doc.Form

try:
    formWidget = PdfFormWidget(form)
    fields = formWidget.FieldsWidget
except:
    fields = form.FieldsWidget

# 3. 遍历并填充字段
if fields is not None and fields.Count > 0:
    for i in range(fields.Count):
        field = fields.get_Item(i)
        name = field.Name

        # 文本框
        if isinstance(field, PdfTextBoxFieldWidget):
            if name == "EmpName":
                field.Text = "张岚"

        # 复选框
        if isinstance(field, PdfCheckBoxWidgetFieldWidget):
            if name == "Doc_ID" or name == "Doc_Edu":
                field.Checked = True

        # 单选按钮
        if isinstance(field, PdfRadioButtonListFieldWidget):
            if name == "Gender":
                field.SelectedIndex = 1

        # 组合框
        if isinstance(field, PdfComboBoxWidgetFieldWidget):
            if name == "Dept":
                field.SelectedIndex = [0]
            if name == "JobLevel":
                field.SelectedIndex = [2]

# 4. 保存文档
doc.SaveToFile("/output/员工入职表.pdf")
doc.Close()

print("填充任务已顺利完成!")

填充完成后的 PDF 文件预览:

填充完成后的 PDF 文件

五、常见问题

1. 中文显示问题

如果填充后中文显示为空白或乱码,基本就是字体问题。

一定要使用:

PdfTrueTypeFont("宋体", 12.0, PdfFontStyle.Regular, True)

并确保系统存在对应字体文件。

2. SelectedIndex 从 0 开始

列表框和组合框都采用 0-based 索引
逻辑值不等于显示文本,尤其在对接数据库时要特别注意。

六、总结

通过 Spire.PDF for Python,我们可以轻松实现:

  • 创建交互式 PDF 表单
  • 自动填充表单字段
  • 控制不同类型字段的选中状态

Python 代码更加简洁,逻辑更直观,非常适合数据驱动型业务自动化场景。