为了账号安全,请及时绑定邮箱和手机立即绑定

Java 创建、填充PDF表单域

标签:
Java

表单域,可以按用途分为多种不同的类型,常见的有文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据。

下面的示例中,将分享通过Java编程在PDF中添加以及填充表单域的方法。包括:文本框、复选框、单选按钮、列表框、组合框、签名域、按钮等。这里填充表单域可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充。此外,对于已经创建表单域并填写好的文档,也可以设置只读,防止修改、编辑。

要点概括:

1.创建表单域

2.填充表单域

3.设置表单域只读

工具:Free Spire.PDF for Java v2.2.2 (免费版)

Jar文件导入

步骤1在Java程序中新建一个文件夹可命名为Lib。并将产品包中的jar文件(如下图)复制到新建的文件夹下。

https://img1.sycdn.imooc.com//5c909f670001e42605540171.jpg

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

https://img1.sycdn.imooc.com//5c90ba5700018ef703070144.jpg

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));
            ava.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);
            }
           }

创建(填充)效果:

https://img1.sycdn.imooc.com//5c90a434000163dd05540456.jpg

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

测试文档如下:

https://img1.sycdn.imooc.com//5c90a4460001cd5105540451.jpg

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);   
         }
        }

填充效果:

https://img1.sycdn.imooc.com//5c90a6630001d2f606170511.jpg

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"); 
     }  
    }

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

(本文完)


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
9
获赞与收藏
48

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消