表单域, 可以按用途分为多种不同的类型, 常见的有文本框, 多行文本框, 密码框, 隐藏域, 复选框, 单选框和下拉选择框等, 目的是用于采集用户的输入或选择的数据. 下面的示例中, 将分享通过 Java 编程在 PDF 中添加以及填充表单域的方法. 这里填充表单域可分为 2 种情况, 一种是在创建表单域时填充, 一种是加载已经创建好表单域的文档进行填充. 此外, 对于已经创建表单域并填写好的文档, 也可以设置只读, 防止修改, 编辑.
要点概括:
1. 创建表单域
2. 填充表单域
3. 设置表单域只读
工具: Free Spire.PDF for Java v2.0.0(免费版)
Jar 文件导入
步骤 1: 在 Java 程序中新建一个文件夹可命名为 Lib. 并将产品包中的 2 个 jar 文件复制到新建的文件夹下.
步骤 2: 复制文件后, 添加到引用类库: 选中这两个 jar 文件, 点击鼠标右键, 选择 "Build Path" - "Add to Build Path". 完成引用.
Java 代码示例(供参考)
1. 创建并填充 PDF 表单域
- import java.awt.*;
- import java.awt.geom.Point2D;
- import java.awt.geom.Rectangle2D;
- import com.spire.PDF.FileFormat;
- import com.spire.PDF.PdfDocument;
- import com.spire.PDF.PdfPageBase;
- import com.spire.PDF.fields.*;
- import com.spire.PDF.graphics.*;
- public class AddFormFieldsToPdf {
- public static void main(String[] args) throws Exception {
- // 创建 PdfDocument 对象, 并添加页面
- PdfDocument doc = new PdfDocument();
- PdfPageBase page = doc.getPages().add();
- // 初始化位置变量
- float baseX = 100;
- float baseY = 0;
- // 创建画刷对象
- PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
- PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.black));
- // 创建 TrueType 字体
- PdfTrueTypeFont font= new PdfTrueTypeFont(new Font("Arial Unicode MS",Font.PLAIN,10),true);
- // 添加文本框
- String text = "姓名:";// 添加文本
- page.getCanvas().drawString(text, font, brush1, new Point2D.Float(0, baseY));// 在 PDF 中绘制文字
- Rectangle2D.Float tbxBounds = new Rectangle2D.Float(baseX, baseY , 150, 15);// 创建 Rectangle2D 对象
- PdfTextBoxField textBox = new PdfTextBoxField(page, "TextBox");// 创建文本框对象
- textBox.setBounds(tbxBounds);// 设置文本框的 Bounds
- textBox.setText("刘兴");// 填充文本框
- textBox.setFont(font);// 应用文本框的字体
- doc.getForm().getFields().add(textBox);// 添加文本框到 PDF 域的集合
- baseY +=25;
- // 添加复选框
- page.getCanvas().drawString("所在院系:", font, brush1, new Point2D.Float(0, baseY));
- java.awt.geom.Rectangle2D.Float rec1 = new java.awt.geom.Rectangle2D.Float(baseX, baseY, 15, 15);
- PdfCheckBoxField checkBoxField = new PdfCheckBoxField(page, "CheckBox1");// 创建第一个复选框对象
- checkBoxField.setBounds(rec1);
- checkBoxField.setChecked(false);// 填充复选框
- page.getCanvas().drawString("经管系", font, brush2, new Point2D.Float(baseX + 20, baseY));
- java.awt.geom.Rectangle2D.Float rec2 = new java.awt.geom.Rectangle2D.Float(baseX + 70, baseY, 15, 15);
- PdfCheckBoxField checkBoxField1 = new PdfCheckBoxField(page, "CheckBox2");// 创建第二个复选框对象
- checkBoxField1.setBounds(rec2);
- checkBoxField1.setChecked(true);// 填充复选框
- page.getCanvas().drawString("创新班", font, brush2, new Point2D.Float(baseX+90, baseY));
- doc.getForm().getFields().add(checkBoxField);// 添加复选框到 PDF
- baseY += 25;
- // 添加列表框
- page.getCanvas().drawString("录取批次:", font, brush1, new Point2D.Float(0, baseY));
- java.awt.geom.Rectangle2D.Float rec = new java.awt.geom.Rectangle2D.Float(baseX, baseY, 150, 50);
- PdfListBoxField listBoxField = new PdfListBoxField(page, "ListBox");// 创建列表框对象
- listBoxField.getItems().add(new PdfListFieldItem("第一批次", "item1"));
- listBoxField.getItems().add(new PdfListFieldItem("第二批次", "item2"));
- listBoxField.getItems().add(new PdfListFieldItem("第三批次", "item3"));;
- listBoxField.setBounds(rec);
- listBoxField.setFont(font);
- listBoxField.setSelectedIndex(0);// 填充列表框
- doc.getForm().getFields().add(listBoxField);// 添加列表框到 PDF
- baseY += 60;
- // 添加单选按钮
- page.getCanvas().drawString("招收方式:", font, brush1, new Point2D.Float(0, baseY));
- PdfRadioButtonListField radioButtonListField = new PdfRadioButtonListField(page, "Radio");// 创建单选按钮对象
- PdfRadioButtonListItem radioItem1 = new PdfRadioButtonListItem("Item1");// 创建第一个单选按钮
- radioItem1.setBounds(new Rectangle2D.Float(baseX, baseY, 15, 15));
- page.getCanvas().drawString("全日制", font, brush2, new Point2D.Float(baseX + 20, baseY));
- PdfRadioButtonListItem radioItem2 = new PdfRadioButtonListItem("Item2");// 创建第二个单选按钮
- radioItem2.setBounds(new Rectangle2D.Float(baseX + 70, baseY, 15, 15));
- 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);// 添加单选按钮到 PDF
- baseY += 25;
- // 添加组合框
- page.getCanvas().drawString("最高学历:", font, brush1, new Point2D.Float(0, baseY));
- Rectangle2D.Float cmbBounds = new Rectangle2D.Float(baseX, baseY, 150, 15);// 创建 cmbBounds 对象
- PdfComboBoxField comboBoxField = new PdfComboBoxField(page, "ComboBox");// 创建 comboBoxField 对象
- comboBoxField.setBounds(cmbBounds);
- comboBoxField.getItems().add(new PdfListFieldItem("博士", "item1"));
- comboBoxField.getItems().add(new PdfListFieldItem("硕士", "itme2"));
- comboBoxField.getItems().add(new PdfListFieldItem("本科", "item3"));
- comboBoxField.getItems().add(new PdfListFieldItem("大专", "item4"));
- comboBoxField.setSelectedIndex(0);
- comboBoxField.setFont(font);
- doc.getForm().getFields().add(comboBoxField);// 添加组合框到 PDF
- baseY += 25;
- // 添加签名域
- page.getCanvas().drawString("本人签字确认 \ n 以上信息属实:", font, brush1, new Point2D.Float(0, baseY));
- PdfSignatureField sgnField= new PdfSignatureField(page,"sgnField");// 创建 sgnField 对象
- Rectangle2D.Float sgnBounds = new Rectangle2D.Float(baseX, baseY, 150, 80);// 创建 sgnBounds 对象
- sgnField.setBounds(sgnBounds);
- doc.getForm().getFields().add(sgnField);// 添加 sgnField 到 PDF
- baseY += 90;
- // 添加按钮
- page.getCanvas().drawString("", font, brush1, new Point2D.Float(0, baseY));
- Rectangle2D.Float btnBounds = new Rectangle2D.Float(baseX, baseY, 50, 15);// 创建 btnBounds 对象
- PdfButtonField buttonField = new PdfButtonField(page, "Button");// 创建 buttonField 对象
- buttonField.setBounds(btnBounds);
- buttonField.setText("提交");// 设置按钮显示文本
- buttonField.setFont(font);
- doc.getForm().getFields().add(buttonField);// 添加按钮到 PDF
- // 保存文档
- doc.saveToFile("result.pdf", FileFormat.PDF);
- }
- }
创建 (填充) 效果:
2. 加载并填充已有的表单域文档
测试文档如下:
- import com.spire.PDF.FileFormat;
- import com.spire.PDF.PdfDocument;
- import com.spire.PDF.fields.PdfField;
- import com.spire.PDF.widget.*;
- public class FillFormField_PDF{
- public static void main(String[] args){
- // 创建 PdfDocument 对象, 并加载 PDF 文档
- PdfDocument doc = new PdfDocument();
- doc.loadFromFile("output.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) {
- PdfTextBoxFieldWidget textBoxField = (PdfTextBoxFieldWidget) field;
- textBoxField.setText("吴 敏");
- }
- if (field instanceof PdfCheckBoxWidgetFieldWidget) {
- PdfCheckBoxWidgetFieldWidget checkBoxField = (PdfCheckBoxWidgetFieldWidget) field;
- switch(checkBoxField.getName()){
- case "CheckBox1":
- checkBoxField.setChecked(true);
- break;
- case "CheckBox2":
- checkBoxField.setChecked(true);
- break;
- }
- }
- if (field instanceof PdfRadioButtonListFieldWidget) {
- PdfRadioButtonListFieldWidget radioButtonListField = (PdfRadioButtonListFieldWidget) field;
- radioButtonListField.setSelectedIndex(1);
- }
- if (field instanceof PdfListBoxWidgetFieldWidget) {
- PdfListBoxWidgetFieldWidget listBox = (PdfListBoxWidgetFieldWidget) field;
- listBox.setSelectedIndex(1);
- }
- if (field instanceof PdfComboBoxWidgetFieldWidget) {
- PdfComboBoxWidgetFieldWidget comboBoxField = (PdfComboBoxWidgetFieldWidget) field;
- comboBoxField.setSelectedIndex(1);
- }
- }
- // 保存文档
- doc.saveToFile("FillFormFields.pdf", FileFormat.PDF);
- }
- }
填充效果:
3. 限制表单域编辑(只读)
- import com.spire.PDF.PdfDocument;
- public class FieldReadonly_PDF {
- public static void main(String[] args) throws Exception {
- {
- // 创建 PdfDocument 对象, 并加载包含表单域的 PDF 文档
- PdfDocument PDF = new PdfDocument();
- PDF.loadFromFile("test.pdf");
- // 将文档中的所有表单域设置为只读
- PDF.getForm().setReadOnly(true);
- // 保存文档
- PDF.saveToFile("result.pdf");
- }
- }
生成的文档中, 表单域将不可编辑, 为只读状态.
(本文完)
来源: https://www.cnblogs.com/Yesi/p/10309396.html