跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

用 Python 创建和填充 PDF 表单域

使用 Spire.PDF for Python 可以先创建可填写的交互式 PDF 表单,再按字段名自动填充数据。文章给出了一份员工入职登记表示例,包含文本框、复选框、单选按钮和下拉框的创建方式,以及通过 PdfFormWidget 遍历字段并赋值的做法。还补充了中文显示依赖字体、SelectedIndex 从 0 开始这两个常见坑,适合做批量录入和表单自动化处理。

苹果系统发布于 2026/6/30更新于 2026/8/2327 浏览

在不少业务里,PDF 不只是'拿来看的文档',它也常被当成数据采集和流转的载体。比起'打印—填写—扫描'这套老办法,交互式 PDF 表单更适合在线收集信息,后续再由程序接着处理。

像问卷、客户登记、入职申请这类场景,只要表单结构设计得还算规整,自动创建和自动填充都能做得比较顺手。这里用 Spire.PDF for Python 走一遍流程:先创建可填写的表单域,再把字段值自动写进去。

安装依赖

这里用到的依赖是:

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

安装命令很直接:

pip install Spire.PDF

小型项目也可以直接用免费版:pip install Spire.PDF.Free

如果在 Windows 上安装卡住了,先看官方安装说明,通常问题都出在环境和字体这两类地方。

创建可填写表单域

先把几个基本概念捋清楚:

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

Spire.PDF 支持的字段类型不少,常见的基本就是下面这些:

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

多数业务表单其实就是这些控件的组合,没必要把问题想得太复杂。

表单创建流程

表单创建的步骤并不绕,核心就是先建文档,再把字段一点点放进去。字段少的时候这样看起来很朴素,但真到后面要改版,结构越清楚,维护越省事。

基本流程如下:

  • 创建 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()

表单数据自动填充

模板建好之后,下一步就是把数据写进去。手工填当然也行,但真要批量处理,还是程序直接赋值更省心,字段名一对上就能跑。

填充时的思路很简单:

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

下面这个例子沿用上面的入职表,分别对文本框、复选框、单选按钮和组合框做填充,最后生成一份已填写完成的 PDF。

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

# 1. 加载文档
doc = PdfDocument()
doc.LoadFromFile("/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, PdfComboBoxFieldWidget):
            if name == "Dept":
                field.SelectedIndex = [0]
            if name == "JobLevel":
                field.SelectedIndex = [2]

# 4. 保存文档
doc.SaveToFile("/output/员工入职表 1-1.pdf")
doc.Close()
print("填充任务已顺利完成!")

常见问题

中文显示问题

如果填充后中文变成空白或者乱码,先别怀疑代码,通常是字体没处理好。

这里还是建议老老实实用:

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

同时确认系统里确实有这个字体。没有字体,后面怎么画都不稳。

SelectedIndex 从 0 开始

列表框和组合框用的是 0-based 索引。显示出来的文本和内部值不是一回事,尤其是你要和数据库字段对接的时候,这一点很容易踩空。

小结

用 Spire.PDF for Python 做交互式 PDF 表单,思路其实很朴素:先把字段建出来,再按字段名把数据填进去。它适合结构比较固定、需要批量处理的场景,像入职表、登记表、调查表这类都很顺手。Python 代码也比较直接,维护起来不会太费劲。

目录

  1. 安装依赖
  2. 创建可填写表单域
  3. 表单创建流程
  4. 初始化文档
  5. 定义布局基准坐标
  6. 设置字体
  7. 1. 文本框:姓名
  8. 2. 复选框:入职材料清单
  9. 选项一:身份证
  10. 选项二:学历学位证书
  11. 3. 单选按钮:性别
  12. 4. 组合框:所属部门
  13. 5. 组合框:职位级别
  14. 6. 保存模板
  15. 表单数据自动填充
  16. 1. 加载文档
  17. 2. 获取表单字段集合
  18. 3. 遍历并填充字段
  19. 4. 保存文档
  20. 常见问题
  21. 中文显示问题
  22. SelectedIndex 从 0 开始
  23. 小结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MixAIHub:主流 AI 模型聚合访问平台
  • C++ STL list 容器详解:使用与模拟实现
  • C 语言指针基础:内存寻址与变量访问
  • Tesseract.js 纯 JavaScript OCR 技术指南
  • 2026 年 RAG 技术演进:DeepSeek 与 Neo4j 构建企业知识图谱
  • OpenClaw + 飞书搭建专属 AI 机器人指南
  • Python 10 行代码实现离线语音笑话机器人,缓解职场尴尬
  • LangChain 实战:工具调用与结构化输出
  • 2025 RTX 50 系显卡适配 Stable Diffusion WebUI Docker 配置建议
  • Java 后端常见面试题及参考答案
  • Java 基础算法实战:从数值运算到字符处理
  • Python 属性描述符:原理与 ORM 实战
  • 基于 OpenClaw 与飞书开放平台搭建 AI 新闻推送机器人
  • OpenClaw 配置飞书机器人教程
  • 以太坊关键漏洞被发现,开发者获赏 1272 万元
  • FPGA 入门指南:从点亮第一颗 LED 开始
  • 基于 Coze 构建 AI 应用及 Web 部署指南
  • FPGA 常见故障排查:10 个高频坑位
  • Coze 智能体使用教程:配置、知识库与工作流实战
  • 大语言模型 (LLM) 入门学习路线图

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online