表单操作(Java)

表单 (AcroForm)

PDF目前支持两种类型的form,用于以交互方式收集用户信息:AcroForms 和 XFA forms。Acroforms是基于PDF框架的原始的可填写表单。Foxit PDF SDK提供了以编程方式查看和编辑表单域的APIs。在PDF文档中,表单域通常用于收集数据。Form类提供了APIs用来获取表单域或表单控件,导入/导出表单数据,以及其他功能,例如:

  • 获取表单域,使用Form.getFieldCountForm.getField接口。
  • 获取PDF页面中的表单控件,使用Form.getControlCountForm.getControl接口。
  • 从XML文件导入表单数据,使用Form.importFromXML接口;导出表单数据到XML文件,使用Form.exportToXML接口。
  • 获取form filler对象,使用Form.getFormFiller接口。

从FDF/XFDF文件中导入表单数据,或者导出数据到FDF/XFDF文件,请参考pdf.PDFDoc.importFromFDF 和 pdf.PDFDoc.exportToFDF 接口。

Example:

如何加载PDF中的表单

import com.foxit.sdk.pdf.interform.Form;
...

// Assuming PDFDoc doc has been loaded.
...

Boolean hasForm = doc.hasForm();
if(hasForm)
   Form form = new Form(doc);
...

如何获取表单域个数以及设置其属性

import com.foxit.sdk.pdf.interform.Form;
import com.foxit.sdk.pdf.interform.Control;
import com.foxit.sdk.pdf.interform.Field;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
String filter = "";
            
int nControlCount = form.getFieldCount(filter);
for (int i=0; i<nControlCount; i++)
{
    Field field = form.getField(i, filter);
    String fdName = field.getName();
    String fdValue = field.getValue();
    String DefaultValue = field.getDefaultValue();
}
...

如何将PDF中的表单数据导出到XML文件

import com.foxit.sdk.pdf.interform.Form;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
form.exportToXML("form.xml");
...

如何通过XML文件导入表单数据到PDF

import com.foxit.sdk.pdf.interform.Form;
...
Form form = new Form(doc);
form.importFromXML("form.xml");
...

XFA 表单

XFA (XML Forms Architecture) forms 是基于XML的表单,封装在PDF内。XFA提供了基于模板的语法和一系列处理规则,允许用户构建交互式表单。最简单的来说,基于模板的语法定义了用户数据的字段。

Foxit PDF SDK提供了APIs用来渲染XFA表单、填表、导出和导入表单数据。

备注:

  • Foxit PDF SDK 提供两个回调类com.foxit.sdk.addon.xfa.AppProviderCallbackcom.foxit.sdk.addon.xfa.DocProviderCallback,分别将回调对象通过Library.registerXFAAppProviderCallbackXFADoc的构造函数注册到SDK中。这两个类中的所有函数都是虚函数,需要用户自己实现
  • 使用XFA form功能,请确保授权key文件中包含 ‘XFA’权限

Example:

如何加载XFADoc并且显示XFA交互式表单

import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.WStringArray;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.addon.xfa.*;
import com.foxit.sdk.addon.xfa.XFADoc.*;
import com.foxit.sdk.common.fxcrt.*;
import com.foxit.sdk.common.WStringArray;
...

try {
       // Create com.foxit.sdk.addon.xfa.AppProviderCallback handler.
       XFAAppHandler xfa_app = new XFAAppHandler(); 
    // Register it in application.
       Library.registerXFAAppProviderCallback(xfa_app); 

       String input_file = input_path + "xfa_dynamic.pdf";
       PDFDoc doc = new PDFDoc(input_file);
       int error_code = doc.load(null);
       if (error_code != e_ErrSuccess)
           return;
            
       // Create com.foxit.sdk.addon.xfa.DocProviderCallback handler.
       XFADocHandler xfa_dochandler = new XFADocHandler(); 
       // Load xfa document from pdf document.
       XFADoc xfa_doc = new XFADoc(doc, xfa_dochandler); 
    xfa_doc.startLoad(null);
            
} catch (PDFException e) {
System.out.println(e.getMessage());
    return;
  }    
...

如何导出和导入XFA表单数据

import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.WStringArray;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.addon.xfa.*;
import com.foxit.sdk.addon.xfa.XFADoc.*;
import com.foxit.sdk.common.fxcrt.*;
import com.foxit.sdk.common.WStringArray;
...

// Assuming XFADoc xfa_doc has been loaded.

String output_xml = "xfa_form.xml";
xfa_doc.exportData(output_xml, XFADoc.e_ExportDataTypeXML);

xfa_doc.resetForm();
doc.saveAs("xfa_dynamic_resetform.pdf", PDFDoc.e_SaveFlagNormal);

xfa_doc.importData(output_xml);
doc.saveAs("xfa_dynamic_importdata.pdf", PDFDoc.e_SaveFlagNormal);

...

表单设计 (Form Design)

可填写的PDF表单 (AcroForm) 特别适用于各种应用程序表单设计,比如税收和其他政府部门表单。表单设计提供了APIs用来向PDF文件中添加表单域或者从PDF文档中移除表单域。从零开始设计一个表单允许开发人员创建他们需要的内容和布局的表单。

Example:

如何向PDF添加一个文本表单域

import com.foxit.sdk.pdf.interform.Form;
import com.foxit.sdk.pdf.interform.Control;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.common.fxcrt.RectF;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
Control control = form.addControl(page, "Text Field0", Field.e_TypeTextField, new RectF(50, 600, 90, 640));
control.getField().setValue("3");

// Update text field's appearance.
control.getWidget().resetAppearanceStream();
...

如何从PDF中移除一个文本表单域

import com.foxit.sdk.pdf.interform.Form;
import com.foxit.sdk.pdf.interform.Control;
import com.foxit.sdk.pdf.interform.Field;
...

// Assuming PDFDoc doc has been loaded.
...

Form form = new Form(doc);
            
int nControlCount = form.getFieldCount("Text Field0");
if (nControlCount > 0)
{
   Field field = form.getField(0, "Text Field0");
   form.removeField(field);
}
...
更新于 2020年4月22日

这篇文章有用吗?

相关文章