zoukankan      html  css  js  c++  java
  • Java 创建、填充PDF表单域

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

    要点概括:

    1.创建表单域

    2.填充表单域

    3.设置表单域只读

    工具:

    Jar文件导入

    步骤1Java程序中新建一个文件夹可命名为Lib。并将产品包中的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("本人签字确认
    以上信息属实:", 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");   
         }
      }

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

    (本文完)

    转载请注明出处!!

  • 相关阅读:
    前端知识笔记
    Vue 组件设计
    使用 puppeteer 创建一个自动化导出 PDF 的服务
    解决浏览器缓存导致页面非最新的小技巧
    浏览器文件上传浅淡
    Vue 项目代理设置的优化
    「django2」macos系统下安装及创建工程
    「android」gomobile argument unused during compilation: '-stdlib=libc++'
    「linux」大文本文件中查找指定字符串并删除所在行
    「color」颜色RGB
  • 原文地址:https://www.cnblogs.com/Yesi/p/10309396.html
Copyright © 2011-2022 走看看