Java创建和填充PDF表单域方法

时间:2021-07-13 20:21:44

表单域,可以按用途分为多种不同的类型,常见的有文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据。下面的示例中,将分享通过java编程在pdf中添加以及填充表单域的方法。这里填充表单域可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充。此外,对于已经创建表单域并填写好的文档,也可以设置只读,防止修改、编辑。

要点概括:

1.创建表单域

2.填充表单域

3.设置表单域只读

工具:free spire.pdf for java v2.0.0(免费版)

jar文件导入

步骤1:在java程序中新建一个文件夹可命名为lib。并将产品包中的2个jar文件复制到新建的文件夹下。

Java创建和填充PDF表单域方法

步骤2:复制文件后,添加到引用类库:选中这两个jar文件,点击鼠标右键,选择“build path” – “add to build path”。完成引用。

Java创建和填充PDF表单域方法

java代码示例(供参考)

1.创建并填充pdf表单域

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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);   
 }
}

创建(填充)效果:

Java创建和填充PDF表单域方法

2.加载并填充已有的表单域文档

测试文档如下:

Java创建和填充PDF表单域方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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);
 }
}

填充效果:

Java创建和填充PDF表单域方法

3.限制表单域编辑(只读)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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");
  }
 }

生成的文档中,表单域将不可编辑,为只读状态