Java 创建填充PDF表单域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 创建填充PDF表单域相关的知识,希望对你有一定的参考价值。

表单域,可以按用途分为多种不同的类型,常见的有文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据。下面的示例中,将分享通过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("本人签字确认
以上信息属实:", 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");   
 }

}欢迎工作一到五年的Java工程师朋友们加入Java群: 741514154
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,mysql,Zookeeper,Tomcat,Docker,Dubbo,nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

以上是关于Java 创建填充PDF表单域的主要内容,如果未能解决你的问题,请参考以下文章

Java创建填充pdf表单域

Java 创建填充PDF表单域

我用pypdf2填充了一个pdf的表单域值,但是输出的pdf不显示这个值,要点一下才显示,怎么回事

java中将表单转换为PDF

从主表单域自动填充子表单域

MVC创建表单加载时如何用一些数据填充文本区域?