可填写 PDF 表单可用于采集用户数据。由于 PDF 已经成为商业中最常用的文件格式之一,懂得如何创建交互式可填写 PDF 表单也变得重要起来。本文将介绍如何使用 Spire.PDF for Java 通过代码创建、填写或删除 PDF 文档中的可填写表单域。
Spire.PDF for Java 在 com.spire.pdf.fields 命名空间下提供了一系列允许程序员创建和编辑各种表单的类,包括创建和编辑文本框、复选框、组合框、列表框和单选按钮等。下表列出了其中一些重要的类。
类 | 说明 |
PdfForm | 代表 PDF 文档中的交互型表单。 |
PdfField | 代表 PDF 交互型表单的域。 |
PdfTextBoxField | 代表 PDF 表单中的文本框域。 |
PdfCheckBoxField | 代表 PDF 表单中的复选框域。 |
PdfComboBoxField | 代表 PDF 表单中的组合框域。 |
PdfListBoxField | 代表 PDF 表单中的列表框域。 |
PdfListFieldItem | 代表列表框域中的一个项目。 |
PdfRadioButtonListField | 代表 PDF 表单中的单选按钮域。 |
PdfRadioButtonListItem | 代表单选按钮的一个选项。 |
PdfButtonField | 代表 PDF 表单中的按钮域。 |
PdfSignatureField | 代表 PDF 表单中的签名域。 |
安装 Spire.PDF for Java
首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。JAR 文件可以从此链接下载。如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而在应用程序中导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.1.2</version>
</dependency>
</dependencies>
在 PDF 文档中创建可填写表单域
创建 PDF 表单需要需要先创建一个与表单域对应的类的对象,然后用 setBounds() 方法设置其大小和位置,最后用 PdfFormFieldCollection.add() 方法将其添加到 PDF 文档中。下面是使用 Spire.PDF for Java 在 PDF 文档中创建各种类型的表单域的详细操作步骤:
- 创建一个 PdfDocument 类的对象。
- 用 PdfDocuemnt.getPages().add() 方法添加一个页面。
- 创建一个 PdfTextBoxField 类的对象,设置该域的范围、字体和文本等属性,然后用 PdFormfFieldCollection.add() 方法将其添加到文档中。
- 重复上一个步骤,将复选框、组合框、列表框、单选按钮、签名框和按钮添加到 PDF 文档中。
- 用 PdfDocument.saveToFile() 方法将文档保存为一个 PDF 文件。
- Java
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.actions.PdfSubmitAction;
import com.spire.pdf.fields.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.packages.sprcfn;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
public class createFillableFormFields {
public static void main(String[] args) throws Exception {
//创建PdfDocument类的对象
PdfDocument doc = new PdfDocument();
//添加一个页面
PdfPageBase page = doc.getPages().add();
//初始化X、y坐标
float baseX = 100;
float baseY = 30;
//创建两个画笔
PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.blue));
PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.black));
//创建字体
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", Font.PLAIN, 12));
//创建一个文本框
page.getCanvas().drawString("文本框:", font, brush1, new Point2D.Float(10, baseY));
Rectangle2D.Float tbxBounds = new Rectangle2D.Float(baseX, baseY, 150, 15);
PdfTextBoxField textBox = new PdfTextBoxField(page, "文本框");
textBox.setBounds(tbxBounds);
textBox.setText("Hello World");
textBox.setFont(font);
doc.getForm().getFields().add(textBox);
baseY += 30;
//添加两个复选框
page.getCanvas().drawString("复选框:", font, brush1, new Point2D.Float(10, baseY));
Rectangle2D.Float checkboxBound1 = new Rectangle2D.Float(baseX, baseY, 15, 15);
PdfCheckBoxField checkBoxField1 = new PdfCheckBoxField(page, "复选框一");
checkBoxField1.setBounds(checkboxBound1);
checkBoxField1.setChecked(false);
page.getCanvas().drawString("选项一", font, brush2, new Point2D.Float(baseX + 20, baseY));
Rectangle2D.Float checkboxBound2 = new Rectangle2D.Float(baseX + 70, baseY, 15, 15);
PdfCheckBoxField checkBoxField2 = new PdfCheckBoxField(page, "复选框二");
checkBoxField2.setBounds(checkboxBound2);
checkBoxField2.setChecked(false);
page.getCanvas().drawString("选项二", font, brush2, new Point2D.Float(baseX + 90, baseY));
doc.getForm().getFields().add(checkBoxField1);
doc.getForm().getFields().add(checkBoxField2);
baseY += 30;
//添加一个列表框
page.getCanvas().drawString("列表框:", font, brush1, new Point2D.Float(10, baseY));
Rectangle2D.Float listboxBound = new Rectangle2D.Float(baseX, baseY, 150, 50);
PdfListBoxField listBoxField = new PdfListBoxField(page, "列表框");
listBoxField.getItems().add(new PdfListFieldItem("项目一", "项目一"));
listBoxField.getItems().add(new PdfListFieldItem("项目二", "项目二"));
listBoxField.getItems().add(new PdfListFieldItem("项目三", "项目三")); ;
listBoxField.setBounds(listboxBound);
listBoxField.setFont(font);
listBoxField.setSelectedIndex(0);
doc.getForm().getFields().add(listBoxField);
baseY += 65;
//添加两个单选按钮
page.getCanvas().drawString("单选按钮:", font, brush1, new Point2D.Float(10, baseY));
PdfRadioButtonListField radioButtonListField = new PdfRadioButtonListField(page, "单选按钮");
PdfRadioButtonListItem radioItem1 = new PdfRadioButtonListItem("选项一");
Rectangle2D.Float radioBound1 = new Rectangle2D.Float(baseX, baseY, 15, 15);
radioItem1.setBounds(radioBound1);
page.getCanvas().drawString("选项一", font, brush2, new Point2D.Float(baseX + 20, baseY));
PdfRadioButtonListItem radioItem2 = new PdfRadioButtonListItem("选项二");
Rectangle2D.Float radioBound2 = new Rectangle2D.Float(baseX + 70, baseY, 15, 15);
radioItem2.setBounds(radioBound2);
page.getCanvas().drawString("选项二", font, brush2, new Point2D.Float(baseX + 90, baseY));
radioButtonListField.getItems().add(radioItem1);
radioButtonListField.getItems().add(radioItem2);
radioButtonListField.setSelectedIndex(0);
doc.getForm().getFields().add(radioButtonListField);
baseY += 30;
//添加一个组合框
page.getCanvas().drawString("组合框:", font, brush1, new Point2D.Float(10, baseY));
Rectangle2D.Float cmbBounds = new Rectangle2D.Float(baseX, baseY, 150, 15);
PdfComboBoxField comboBoxField = new PdfComboBoxField(page, "组合框");
comboBoxField.setBounds(cmbBounds);
comboBoxField.getItems().add(new PdfListFieldItem("项目一", "项目一"));
comboBoxField.getItems().add(new PdfListFieldItem("项目二", "项目二"));
comboBoxField.getItems().add(new PdfListFieldItem("项目三", "项目三"));
comboBoxField.getItems().add(new PdfListFieldItem("项目四", "项目四"));
comboBoxField.setSelectedIndex(0);
comboBoxField.setFont(font);
doc.getForm().getFields().add(comboBoxField);
baseY += 30;
//添加一个签名域
page.getCanvas().drawString("签名域:", font, brush1, new Point2D.Float(10, baseY));
PdfSignatureField sgnField = new PdfSignatureField(page, "签名域");
Rectangle2D.Float sgnBounds = new Rectangle2D.Float(baseX, baseY, 150, 80);
sgnField.setBounds(sgnBounds);
doc.getForm().getFields().add(sgnField);
baseY += 95;
//添加一个按钮
page.getCanvas().drawString("按钮:", font, brush1, new Point2D.Float(10, baseY));
Rectangle2D.Float btnBounds = new Rectangle2D.Float(baseX, baseY, 50, 15);
PdfButtonField buttonField = new PdfButtonField(page, "按钮");
buttonField.setBounds(btnBounds);
buttonField.setText("提交");
buttonField.setFont(font);
PdfSubmitAction submitAction = new PdfSubmitAction("https://www.e-iceblue.cn/getformvalues.php");
buttonField.getActions().setMouseDown(submitAction);
doc.getForm().getFields().add(buttonField);
//保存文档
doc.saveToFile("可填写表单.pdf", FileFormat.PDF);
}
}
在 PDF 文档中表单域中录入数据
填写表单需要先从 PDF 文档中获取所有表单域,确定域的类型,然后输入值或从预设列表中选择一个值完成填写。以下是使用 Spire.PDF for Java 在 PDF 文档中填写表单域的操作步骤:
- 创建一个 PdfDocument 类的对象。
- 用 PdfDocument.loadFromFile() 方法载入 PDF 文档。
- 用 PdfDocument.getForm() 方法从文档中获取表单。
- 用 PdfFormWidget.getFieldsWidget() 方法获得表单域组件的集合。
- 循环浏览域组件集合,取得特定的 PdfField 对象。
- 确定该 PdfField 对象是否是特定的域类型,如文本框。如果是文本框,则用 PdfTextBoxFieldWidget.setText() 方法设置文本框的文本。
- 重复上一个步骤,将值录入单选按钮、复选框、组合框和列表框。
- 用 PdfDocument.saveToFile() 方法保存文档。
- Java
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.fields.PdfField;
import com.spire.pdf.widget.*;
public class fillFormFields {
public static void main(String[] args) {
//创建PdfDocument类的对象
PdfDocument doc = new PdfDocument();
//载入PDF文档
doc.loadFromFile("表单.pdf");
//获取文档的表单
PdfFormWidget form = (PdfFormWidget)doc.getForm();
//获取表单组件的集合
PdfFormFieldWidgetCollection formWidgetCollection = form.getFieldsWidget();
//在表单组件中循环
for (int i = 0; i < formWidgetCollection.getCount(); i++)
{
//获取指定域
PdfField field = formWidgetCollection.get(i);
//判断该域是否为文本款
if (field instanceof PdfTextBoxFieldWidget)
{
if (field.getName().equals("名字"))
{
//设置文本框的文本
PdfTextBoxFieldWidget textBoxField = (PdfTextBoxFieldWidget)field;
textBoxField.setText("王小明");
}
}
//判断该域是否为单选按钮
if (field instanceof PdfRadioButtonListFieldWidget)
{
if (field.getName().equals("性别"))
{
//设置单选按钮的选择参数
PdfRadioButtonListFieldWidget radioButtonListField = (PdfRadioButtonListFieldWidget)field;
radioButtonListField.setSelectedIndex(0);
}
}
//判断该域是否为组合框
if (field instanceof PdfComboBoxWidgetFieldWidget)
{
if (field.getName().equals("国家"))
{
//设置组合框的选项参数
PdfComboBoxWidgetFieldWidget comboBoxField = (PdfComboBoxWidgetFieldWidget)field;
comboBoxField.setSelectedIndex(0);
}
}
//判断该域是否为复选框
if (field instanceof PdfCheckBoxWidgetFieldWidget)
{
//将复选框设置为已确认
PdfCheckBoxWidgetFieldWidget checkBoxField = (PdfCheckBoxWidgetFieldWidget)field;
switch (checkBoxField.getName())
{
case "音乐":
case "电影":
checkBoxField.setChecked(true);
break;
}
}
//判断该域是否为列表框
if (field instanceof PdfListBoxWidgetFieldWidget)
{
if (field.getName().equals("学位"))
{
//设置列表框的选项参数
PdfListBoxWidgetFieldWidget listBox = (PdfListBoxWidgetFieldWidget)field;
listBox.setSelectedIndex(1);
}
}
}
//保存文件
doc.saveToFile("填写表单域.pdf", FileFormat.PDF);
}
}
删除 PDF 文档中的指定表单域或所有表单域
PDF 文档中的表单域可以通过其索引或名称来获取,获取之后可以通过 PdfFieldCollection.remove() 方法来删除。以下是使用 Sprie.PDF for Java 从 PDF 文档中删除指定域或所有域的操作步骤:
- 创建一个 PdfDocument 类的对象。
- 用 PdfDocument.loadFromFile() 方法载入 PDF 文档。
- 用 PdfDocument.getForm() 方法从文档中获取表单。
- 用 PdfFormWidget.getFieldsWidget() 方法获取表单域组件集合。
- 循环遍历组件集合以获取特定的 PdfField 类的对象。用 PdfFieldCollection.remove() 方法将域逐个移除。
- 要删除指定的表单域,可用 PdfFormFieldWidgetCollection.get() 方法从文档中获取该表单域,然后调用 PdfFieldCollection.remove() 方法将其删除。
- 用 PdfDocument.saveToFile() 方法保存文档。
- Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.fields.PdfField;
import com.spire.pdf.widget.PdfFormFieldWidgetCollection;
import com.spire.pdf.widget.PdfFormWidget;
public class deleteFormFields {
public static void main(String[] args) {
//创建PdfDocument类的对象
PdfDocument doc = new PdfDocument();
//载入PDF文档
doc.loadFromFile("可填写表单.pdf");
//获取文档中的表单
PdfFormWidget form= (PdfFormWidget)doc.getForm();
//获取表单中的表单组件
PdfFormFieldWidgetCollection widgets = form.getFieldsWidget();
//循环遍历表单组件
for (int i = widgets.getCount() - 1; i >= 0; i--)
{
//获取指定的域
PdfField field = (PdfField)widgets.getList().get(i) ;
//删除该域
widgets.remove(field);
}
//根据域名称获取指定的域
//PdfField field = widgets.get("name");
//删除该域
//widgets.remove(field);
//保存文档
doc.saveToFile("删除表单域.pdf");
}
}
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。