在很多业务场景中,PDF 表单不仅仅是展示模板,更是数据采集与流转的关键载体。相比传统'打印—填写—扫描'的方式,交互式 PDF 表单可以让用户直接在线填写并提交数据,大幅提升信息收集效率。
无论是问卷调查、客户登记,还是入职申请表,只要表单结构设计合理,就可以实现数据的自动化采集与管理。本文将介绍如何使用 Spire.PDF for Python 创建可填写的 PDF 表单,并进一步实现自动填充。
一、安装依赖
本教程依赖:
- Spire.PDF for Python
- plum-dispatch v1.7.4(底层方法分发支持)
安装方式如下:
pip install Spire.PDF
该库还为小型项目提供了免费版:pip install Spire.PDF.Free
如果你在 Windows 环境下安装遇到问题,可以参考官方安装说明文档。
二、创建可填写表单域
在创建 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(, , PdfFontStyle.Regular, )
page.Canvas.DrawString(, font, brush_title, PointF(, baseY))
txt_name = PdfTextBoxField(page, )
txt_name.Bounds = RectangleF(baseX, baseY, , )
txt_name.Font = font
doc.Form.Fields.Add(txt_name)
baseY +=
page.Canvas.DrawString(, font, brush_title, PointF(, baseY))
cb_id = PdfCheckBoxField(page, )
cb_id.Bounds = RectangleF(baseX, baseY, , )
doc.Form.Fields.Add(cb_id)
page.Canvas.DrawString(, font, brush_text, PointF(baseX + , baseY))
cb_edu = PdfCheckBoxField(page, )
cb_edu.Bounds = RectangleF(baseX + , baseY, , )
doc.Form.Fields.Add(cb_edu)
page.Canvas.DrawString(, font, brush_text, PointF(baseX + , baseY))
baseY +=
page.Canvas.DrawString(, font, brush_title, PointF(, baseY))
rb_gender = PdfRadioButtonListField(page, )
item_m = PdfRadioButtonListItem()
item_m.Bounds = RectangleF(baseX, baseY, , )
page.Canvas.DrawString(, font, brush_text, PointF(baseX + , baseY))
item_f = PdfRadioButtonListItem()
item_f.Bounds = RectangleF(baseX + , baseY, , )
page.Canvas.DrawString(, font, brush_text, PointF(baseX + , baseY))
rb_gender.Items.Add(item_m)
rb_gender.Items.Add(item_f)
doc.Form.Fields.Add(rb_gender)
baseY +=
page.Canvas.DrawString(, font, brush_title, PointF(, baseY))
cmb_dept = PdfComboBoxField(page, )
cmb_dept.Bounds = RectangleF(baseX, baseY, , )
cmb_dept.Items.Add(PdfListFieldItem(, ))
cmb_dept.Items.Add(PdfListFieldItem(, ))
cmb_dept.Items.Add(PdfListFieldItem(, ))
cmb_dept.Font = font
doc.Form.Fields.Add(cmb_dept)
baseY +=
page.Canvas.DrawString(, font, brush_title, PointF(, baseY))
cmb_level = PdfComboBoxField(page, )
cmb_level.Bounds = RectangleF(baseX, baseY, , )
cmb_level.Items.Add(PdfListFieldItem(, ))
cmb_level.Items.Add(PdfListFieldItem(, ))
cmb_level.Items.Add(PdfListFieldItem(, ))
cmb_level.Font = font
doc.Form.Fields.Add(cmb_level)
doc.SaveToFile()
doc.Close()

