Java 创建、填充、读取PDF表单域
表单域,可以按用途分为多种不同的类型,常见的有文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据。
下面的示例中,将分享通过Java编程在PDF中创建、填充以及读取PDF表单域的方法。创建表单域包括文本框、复选框、单选按钮、列表框、组合框、签名域、按钮等。填充表单域时可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充;对于已经创建表单域并填写好的文档,也可以设置只读,防止修改、编辑等;读取表单域时,可获取指定(可通过索引值或表单域名称)表单域的值,或者获取文档中所有表单域的值。
示例要点概括:
1.创建表单域
2.填充表单域
3.设置表单域只读
4.读取表单域值
工具Free Spire.PDF for Java(免费版)
Jar文件获取及导入:
方法1: 通过官网下载jar文件包。下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入到java程序。
方法2:通过maven仓库安装导入。
Java代码示例(供参考)【示例1】 创建并填充PDF表单域
importjava.awt.*;importjava.awt.geom.Point2D;importjava.awt.geom.Rectangle2D;importcom.spire.pdf.FileFormat;importcom.spire.pdf.PdfDocument;importcom.spire.pdf.PdfPageBase;importcom.spire.pdf.fields.*;importcom.spire.pdf.graphics.*;publicclassAddFormFieldsToPdf{publicstaticvoidmain(String[]args)throwsException{//创建PdfDocument对象,并添加页面PdfDocumentdoc=newPdfDocument();PdfPageBasepage=doc.getPages().add();//初始化位置变量floatbaseX=100;floatbaseY=0;//创建画刷对象PdfSolidBrushbrush2=newPdfSolidBrush(newPdfRGBColor(Color.BLUE));PdfSolidBrushbrush3=newPdfSolidBrush(newPdfRGBColor(Color.black));//创建TrueType字体PdfTrueTypeFontfont=newPdfTrueTypeFont(newFont("ArialUnicodeMS",Font.PLAIN,10),true);//添加文本框Stringtext="姓名:";//添加文本page.getCanvas().drawString(text,font,brush2,newPoint2D.Float(0,baseY));//在PDF中绘制文字Rectangle2D.FloattbxBounds=newRectangle2D.Float(baseX,baseY,150,15);//创建Rectangle2D对象PdfTextBoxFieldtextBox=newPdfTextBoxField(page,"TextBox");//创建文本框对象textBox.setBounds(tbxBounds);//设置文本框的BoundstextBox.setText("刘兴");//填充文本框textBox.setFont(font);//应用文本框的字体doc.getForm().getFields().add(textBox);//添加文本框到PDF域的集合baseY+=25;//添加复选框page.getCanvas().drawString("所在院系:",font,brush2,newPoint2D.Float(0,baseY));java.awt.geom.Rectangle2D.Floatrec1=newjava.awt.geom.Rectangle2D.Float(baseX,baseY,15,15);PdfCheckBoxFieldcheckBoxField=newPdfCheckBoxField(page,"CheckBox1");//创建第一个复选框对象checkBoxField.setBounds(rec1);checkBoxField.setChecked(false);//填充复选框page.getCanvas().drawString("经管系",font,brush3,newPoint2D.Float(baseX+20,baseY));java.awt.geom.Rectangle2D.Floatrec2=newjava.awt.geom.Rectangle2D.Float(baseX+70,baseY,15,15);PdfCheckBoxFieldcheckBoxField1=newPdfCheckBoxField(page,"CheckBox2");//创建第二个复选框对象checkBoxField1.setBounds(rec2);checkBoxField1.setChecked(true);//填充复选框page.getCanvas().drawString("创新班",font,brush3,newPoint2D.Float(baseX+90,baseY));doc.getForm().getFields().add(checkBoxField);//添加复选框到PDFbaseY+=25;//添加列表框page.getCanvas().drawString("录取批次:",font,brush2,newPoint2D.Float(0,baseY));java.awt.geom.Rectangle2D.Floatrec=newjava.awt.geom.Rectangle2D.Float(baseX,baseY,150,50);PdfListBoxFieldlistBoxField=newPdfListBoxField(page,"ListBox");//创建列表框对象listBoxField.getItems().add(newPdfListFieldItem("第一批次","item1"));listBoxField.getItems().add(newPdfListFieldItem("第二批次","item2"));listBoxField.getItems().add(newPdfListFieldItem("第三批次","item3"));listBoxField.setBounds(rec);listBoxField.setFont(font);listBoxField.setSelectedIndex(0);//填充列表框doc.getForm().getFields().add(listBoxField);//添加列表框到PDFbaseY+=60;//添加单选按钮page.getCanvas().drawString("招收方式:",font,brush2,newPoint2D.Float(0,baseY));PdfRadioButtonListFieldradioButtonListField=newPdfRadioButtonListField(page,"Radio");//创建单选按钮对象PdfRadioButtonListItemradioItem1=newPdfRadioButtonListItem("Item1");//创建第一个单选按钮radioItem1.setBounds(newRectangle2D.Float(baseX,baseY,15,15));page.getCanvas().drawString("全日制",font,brush3,newPoint2D.Float(baseX+20,baseY));PdfRadioButtonListItemradioItem2=newPdfRadioButtonListItem("Item2");//创建第二个单选按钮radioItem2.setBounds(newRectangle2D.Float(baseX+70,baseY,15,15));page.getCanvas().drawString("成人教育",font,brush3,newPoint2D.Float(baseX+90,baseY));radioButtonListField.getItems().add(radioItem1);radioButtonListField.getItems().add(radioItem2);radioButtonListField.setSelectedIndex(0);//选择填充第一个单选按钮doc.getForm().getFields().add(radioButtonListField);//添加单选按钮到PDFbaseY+=25;//添加组合框page.getCanvas().drawString("最高学历:",font,brush2,newPoint2D.Float(0,baseY));Rectangle2D.FloatcmbBounds=newRectangle2D.Float(baseX,baseY,150,15);//创建cmbBounds对象PdfComboBoxFieldcomboBoxField=newPdfComboBoxField(page,"ComboBox");//创建comboBoxField对象comboBoxField.setBounds(cmbBounds);comboBoxField.getItems().add(newPdfListFieldItem("博士","item1"));comboBoxField.getItems().add(newPdfListFieldItem("硕士","itme2"));comboBoxField.getItems().add(newPdfListFieldItem("本科","item3"));comboBoxField.getItems().add(newPdfListFieldItem("大专","item4"));comboBoxField.setSelectedIndex(0);comboBoxField.setFont(font);doc.getForm().getFields().add(comboBoxField);//添加组合框到PDFbaseY+=25;//添加签名域page.getCanvas().drawString("本人签字确认\n以上信息属实:",font,brush2,newPoint2D.Float(0,baseY));PdfSignatureFieldsgnField=newPdfSignatureField(page,"sgnField");//创建sgnField对象Rectangle2D.FloatsgnBounds=newRectangle2D.Float(baseX,baseY,150,80);//创建sgnBounds对象sgnField.setBounds(sgnBounds);doc.getForm().getFields().add(sgnField);//添加sgnField到PDFbaseY+=90;//添加按钮page.getCanvas().drawString("",font,brush2,newPoint2D.Float(0,baseY));Rectangle2D.FloatbtnBounds=newRectangle2D.Float(baseX,baseY,50,15);//创建btnBounds对象PdfButtonFieldbuttonField=newPdfButtonField(page,"Button");//创建buttonField对象buttonField.setBounds(btnBounds);buttonField.setText("提交");//设置按钮显示文本buttonField.setFont(font);doc.getForm().getFields().add(buttonField);//添加按钮到PDF//保存文档doc.saveToFile("result.pdf",FileFormat.PDF);}}
创建(填充)效果:
【示例2】加载并填充已有的表单域文档
测试文档如下:
importcom.spire.pdf.FileFormat;importcom.spire.pdf.PdfDocument;importcom.spire.pdf.fields.PdfField;importcom.spire.pdf.widget.*;publicclassFillFormField_PDF{publicstaticvoidmain(String[]args){//创建PdfDocument对象,并加载PDF文档PdfDocumentdoc=newPdfDocument();doc.loadFromFile("output.pdf");//获取文档中的域PdfFormWidgetform=(PdfFormWidget)doc.getForm();//获取域控件集合PdfFormFieldWidgetCollectionformWidgetCollection=form.getFieldsWidget();//遍历域控件并填充数据for(inti=0;i<formWidgetCollection.getCount();i++){PdfFieldfield=formWidgetCollection.get(i);if(fieldinstanceofPdfTextBoxFieldWidget){PdfTextBoxFieldWidgettextBoxField=(PdfTextBoxFieldWidget)field;textBoxField.setText("吴敏");}if(fieldinstanceofPdfCheckBoxWidgetFieldWidget){PdfCheckBoxWidgetFieldWidgetcheckBoxField=(PdfCheckBoxWidgetFieldWidget)field;switch(checkBoxField.getName()){case"CheckBox1":checkBoxField.setChecked(true);break;case"CheckBox2":checkBoxField.setChecked(true);break;}}if(fieldinstanceofPdfRadioButtonListFieldWidget){PdfRadioButtonListFieldWidgetradioButtonListField=(PdfRadioButtonListFieldWidget)field;radioButtonListField.setSelectedIndex(1);}if(fieldinstanceofPdfListBoxWidgetFieldWidget){PdfListBoxWidgetFieldWidgetlistBox=(PdfListBoxWidgetFieldWidget)field;listBox.setSelectedIndex(1);}if(fieldinstanceofPdfComboBoxWidgetFieldWidget){PdfComboBoxWidgetFieldWidgetcomboBoxField=(PdfComboBoxWidgetFieldWidget)field;comboBoxField.setSelectedIndex(1);}}//保存文档doc.saveToFile("FillFormFields.pdf",FileFormat.PDF);}}
填充效果:
【示例3】限制表单域编辑(只读)
importcom.spire.pdf.PdfDocument;publicclassFieldReadonly_PDF{publicstaticvoidmain(String[]args)throwsException{{//创建PdfDocument对象,并加载包含表单域的PDF文档PdfDocumentpdf=newPdfDocument();pdf.loadFromFile("test.pdf");//将文档中的所有表单域设置为只读pdf.getForm().setReadOnly(true);//保存文档pdf.saveToFile("result.pdf");}}
生成的文档中,表单域将不可编辑,为只读状态。
【示例4】获取表单域值
1. 获取指定表单域值
importcom.spire.pdf.PdfDocument;importcom.spire.pdf.widget.PdfFormWidget;importcom.spire.pdf.widget.PdfTextBoxFieldWidget;importjava.io.FileWriter;importjava.io.IOException;publicclassGetSpecificFormfieldValue{publicstaticvoidmain(String[]args){//加载PDF文档PdfDocumentpdf=newPdfDocument();pdf.loadFromFile("test.pdf");//获取表单域PdfFormWidgetformWidget=(PdfFormWidget)pdf.getForm();//通过索引值来获取指定表单域中的值PdfTextBoxFieldWidgettextbox=(PdfTextBoxFieldWidget)formWidget.getFieldsWidget().get(0);//PdfTextBoxFieldWidgettextbox=(PdfTextBoxFieldWidget)formWidget.getFieldsWidget().get("TextBox");//通过表单域名称来获取值//将获取的值写入txt文档Stringtext=textbox.getText();try{//将文本写入.txt文件FileWriterwriter=newFileWriter("GetSpecificFormfieldValue.txt");writer.write(text);writer.flush();}catch(IOExceptione){e.printStackTrace();}pdf.close();}}
指定表单域值获取结果:
2. 获取全部表单域值
importcom.spire.pdf.PdfDocument;importcom.spire.pdf.fields.PdfField;importcom.spire.pdf.widget.*;importjava.io.FileWriter;importjava.io.IOException;publicclassGetAllFormfieldValue{publicstaticvoidmain(String[]args){//加载PDF文档PdfDocumentpdf=newPdfDocument();pdf.loadFromFile("测试.pdf");//获取表单域PdfFormWidgetformWidget=(PdfFormWidget)pdf.getForm();StringBuildersb=newStringBuilder();//遍历表单域控件集合并提取所有表单的值for(inti=0;i<formWidget.getFieldsWidget().getCount();i++){PdfFieldfield=(PdfField)formWidget.getFieldsWidget().getList().get(i);//获取文本框的值if(fieldinstanceofPdfTextBoxFieldWidget){PdfTextBoxFieldWidgettextBoxField=(PdfTextBoxFieldWidget)field;Stringtext=textBoxField.getText();sb.append("文本框内容:"+text+"\r\n");}//获取列表框的值if(fieldinstanceofPdfListBoxWidgetFieldWidget){PdfListBoxWidgetFieldWidgetlistBoxField=(PdfListBoxWidgetFieldWidget)field;//获取列表框中选中的值StringselectedValue=listBoxField.getSelectedValue();sb.append("列表框选中的内容:"+selectedValue+"\r\n");//获取列表框中的所有选项值sb.append("列表框内容:\r\n");PdfListWidgetItemCollectionitems=listBoxField.getValues();for(PdfListWidgetItemitem:(Iterable<PdfListWidgetItem>)items){sb.append(item.getValue()+"\r\n");}}//获取组合框的值if(fieldinstanceofPdfComboBoxWidgetFieldWidget){PdfComboBoxWidgetFieldWidgetcomBoxField=(PdfComboBoxWidgetFieldWidget)field;//获取组合框中选中的值StringselectedValue=comBoxField.getSelectedValue();sb.append("组合框选中的内容:"+selectedValue+"\r\n");//获取组合框中所有选项值sb.append("组合框内容:\r\n");PdfListWidgetItemCollectionitems=comBoxField.getValues();for(PdfListWidgetItemitem:(Iterable<PdfListWidgetItem>)items){sb.append(item.getValue()+"\r\n");}}//获取单选按钮值if(fieldinstanceofPdfRadioButtonListFieldWidget){PdfRadioButtonListFieldWidgetradioBtnField=(PdfRadioButtonListFieldWidget)field;StringValue=radioBtnField.getValue();sb.append("单选按钮内容:"+Value+"\r\n");}//获取复选框值if(fieldinstanceofPdfCheckBoxWidgetFieldWidget){PdfCheckBoxWidgetFieldWidgetcheckBoxField=(PdfCheckBoxWidgetFieldWidget)field;//获取复选框的选中状态booleanstate=checkBoxField.getChecked();sb.append("复选框是否被选中?"+state+"\r\n");}}try{//将文本写入.txt文件FileWriterwriter=newFileWriter("GetAllFormfieldValues.txt");writer.write(sb.toString());writer.flush();}catch(IOExceptione){e.printStackTrace();}pdf.close();}}
表单域读取结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。