Skip to content

XFA 表单 (XML Forms Architecture)

XFA 表单是一种基于 XML 的交互式表单规范,内嵌于 PDF 文档中。它通过模板语法和处理规则,赋能开发者构建功能强大的交互式表单,核心在于定义用户数据字段的模板。

XFA 功能

福昕 PDF SDK 提供了一系列 API,方便开发者在应用中实现 XFA 表单的渲染、数据录入、导出与导入。

实现 XFA 回调 (Java 示例)

福昕 PDF SDK 提供了两个 Java 回调类,用于定制 XFA 表单的处理逻辑:

  • com.foxit.sdk.addon.xfa.AppProviderCallback: 应用程序级回调,通过 Library.registerXFAAppProviderCallback() 注册。
  • com.foxit.sdk.addon.xfa.DocProviderCallback: 文档级回调,在 XFADoc 构造时注册。 开发者需要实现这两个类中的所有纯虚函数。

授权说明

  • 要使用 XFA 表单功能 请确保授权许可文件中包含 XFA 模块权限。

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

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"

#include "include/pdf/interform/fs_pdfform.h"
#include "include/addon/xfa/fs_xfa.h"

using namespace foxit;
using namespace foxit::common;

using namespace pdf;
using namespace foxit::addon::xfa;

CFS_XFAAppHandler* pXFAAppHandler = new CFS_XFAAppHandler(); // implement from foxit::addon::xfa::AppProviderCallback
Library::RegisterXFAAppProviderCallback(pXFAAppHandler);
WString input_file = input_path + L"xfa_dynamic.pdf";
PDFDoc doc(input_file);
ErrorCode error_code = doc.Load();
if (error_code != foxit::e_ErrSuccess) {
	return 1;
}

CFS_XFADocHandler* pXFADocHandler = new CFS_XFADocHandler(); // implement from foxit::addon::xfa::DocProviderCallback
XFADoc xfa_doc(doc, pXFADocHandler);
xfa_doc.StartLoad(NULL);
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"

#include "include/fs_pdfform_c.h"
#include "include/fs_xfa_c.h"


FSAppProviderCallback* pXFAAppHandler = (FSAppProviderCallback*)malloc(sizeof(FSAppProviderCallback));
pXFAAppHandler ->user_data = xfa_app_provider;
pXFAAppHandler ->Release = gRelease;
pXFAAppHandler ->GetAppInfo = gGetAppInfo;
pXFAAppHandler ->Beep = gBeep;
pXFAAppHandler ->MsgBox = gMsgBox;
pXFAAppHandler ->FSResponse = gResponse;
pXFAAppHandler ->DownLoadUrl = gDownLoadUrl;
pXFAAppHandler ->PostRequestURL = gPostRequestURL;
pXFAAppHandler ->PutRequestURL = gPutRequestURL;
pXFAAppHandler ->LoadString = gLoadString;
pXFAAppHandler ->ShowFileDialog = gShowFileDialog;
FSDK_Library_RegisterXFAAppProviderCallback(pXFAAppHandler);
swprintf_s(input_file, MAX_FILE_PATH, L"%s xfa_dynamic.pdf ", input_path);
FS_PDFDOC_HANDLE doc;
FSDK_PDFDoc_Create0(input_file, &doc);
FSErrorCode error_code = FSDK_PDFDoc_Load(doc, NULL);
if (error_code != e_FSErrSuccess) {
return 1;
}

xfa_doc_handler = (FSDocProviderCallback*)malloc(sizeof(FSDocProviderCallback));
xfa_doc_handler->user_data = xfa_doc_handler;
xfa_doc_handler->Release = gXFADocProviderRelease;
xfa_doc_handler->InvalidateRect = gInvalidateRect;
xfa_doc_handler->DisplayCaret = gDisplayCaret;
xfa_doc_handler->GetPopupPos = gGetPopupPos;
xfa_doc_handler->PopupMenu = gPopupMenu;
xfa_doc_handler->GetCurrentPage = gGetCurrentPage;
xfa_doc_handler->SetCurrentPage = gSetCurrentPage;
xfa_doc_handler->SetChangeMark = gSetChangeMark;
xfa_doc_handler->GetTitle = gGetTitle;
xfa_doc_handler->ExportData = gExportData;
xfa_doc_handler->ImportData = gImportData;
xfa_doc_handler->GotoURL = gGotoURL;
xfa_doc_handler->Print = gPrint;
xfa_doc_handler->GetHighlightColor = gGetHighlightColor;
xfa_doc_handler->SubmitData = gSubmitData;
xfa_doc_handler->PageViewEvent = gPageViewEvent;
xfa_doc_handler->WidgetEvent = gWidgetEvent; 
FS_XFADOC_HANDLE xfa_doc;
FSDK_XFADoc_Create(doc, xfa_doc_handler, &xfa_doc);
FS_PROGRESSIVE_HANDLE progressive;
FSDK_XFADoc_StartLoad(xfa_doc, NULL, &progressive);
...
java
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;
  }	
...
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    #replace with the python2 lib path
    site.addsitedir('../../../')
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

pXFAAppHandler = nCFS_XFAAppHandler() 
# implement from AppProviderCallback
Library.RegisterXFAAppProviderCallback(pXFAAppHandler)
input_file = input_path + "xfa_dynamic.pdf"
doc = PDFDoc(input_file)
error_code = doc.Load("")
if error_code != e_ErrSuccess:
      return 1

pXFADocHandler = CFS_XFADocHandler(); 
# implement from DocProviderCallback
xfa_doc = XFADoc(doc, pXFADocHandler)
xfa_doc.StartLoad("")
...
objc
#include "FSPDFObjC.h"
...

// implement from FSAppProviderCallback.
CFS_XFAAppHandler* pXFAAppHandler = [CFS_XFAAppHandler alloc];
[FSLibrary registerXFAAppProviderCallback:pXFAAppHandler];
FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:input_file];
FSErrorCode errorCode = [doc load:@""];
if (errorCode != FSErrSuccess) {                
    return -1;
}

// implement from FSDocProviderCallback.
CFS_XFADocHandler* pXFADocHandler = [CFS_XFADocHandler alloc];
FSXFADoc* xfa_doc = [[FSXFADoc alloc] initWithDocument:doc xfa_doc_provider_handler:pXFADocHandler];
[xfa_doc startLoad:nil];
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

let pXFAAppHandler = new CFS_XFAAppHandler();
// implement from AppProviderCallback
let app_provieder_callback = new FSDK.AppProviderCallback(pXFAAppHandler)
FSDK.Library.RegisterXFAAppProviderCallback(app_provieder_callback);
let input_file = input_path + "xfa_dynamic.pdf"
let doc = new FSDK.PDFDoc(input_file);
let error_code = doc.Load("");
if (error_code != FSDK.e_ErrSuccess) {
    return 1;
}

let pXFADocHandler = new CFS_XFADocHandler();
let doc_provider_callback = new FSDK.DocProviderCallback(pXFADocHandler);
let xfa_doc = new FSDK.XFADoc(doc, doc_provider_callback);
xfa_doc.StartLoad(null);
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.addon;
using foxit.addon.xfa;
...

// Implement from AppProviderCallback
CFS_XFAAppHandler pXFAAppHandler = new CFS_XFAAppHandler();  
Library.RegisterXFAAppProviderCallback(pXFAAppHandler);
string input_file = input_path + "xfa_dynamic.pdf";
using (PDFDoc doc = new PDFDoc(input_file))
{
    error_code = doc.Load(null);
    if (error_code != ErrorCode.e_ErrSuccess)
    {
        Console.WriteLine("The PDFDoc [{0}] Error: {1}\n", input_file, error_code);
        Library.Release();
        return;
    }
 
    // Implement from DocProviderCallback    
    CFS_XFADocHandler pXFADocHandler = new CFS_XFADocHandler(); 
    using (XFADoc xfa_doc = new XFADoc(doc, pXFADocHandler))
    {
    ...
    }
}

导出和导入 XFA 表单数据

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/interform/fs_pdfform.h"
#include "include/addon/xfa/fs_xfa.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace foxit::addon::xfa;

// Assuming FSXFADoc xfa_doc has been loaded.

xfa_doc.ExportData(L"xfa_form.xml", XFADoc::e_ExportDataTypeXML);

xfa_doc.ResetForm();
doc.SaveAs( L"xfa_dynamic_resetform.pdf");

xfa_doc.ImportData(L"xfa_form.xml");
doc.SaveAs(L"xfa_dynamic_importdata.pdf");
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_pdfform_c.h"
#include "include/fs_xfa_c.h"

// Assuming FSXFADoc xfa_doc has been loaded.

FS_BOOL return_ExportData;
FSDK_XFADoc_ExportData(xfa_doc, L"xfa_form.xml", e_FSExportDataTypeXML, &return_ExportData);

FSDK_XFADoc_ResetForm(xfa_doc);
FS_BOOL return_SaveAs;
FSDK_PDFDoc_SaveAs(doc, L"xfa_dynamic_resetform.pdf", e_FSSaveFlagsSaveFlagNormal, &return_SaveAs);

FS_BOOL return_ImportData;
FSDK_XFADoc_ImportData(xfa_doc, L"xfa_form.xml", &return_ImportData);
FS_BOOL return_SaveAs2;
FSDK_PDFDoc_SaveAs(doc, L"xfa_dynamic_importdata.pdf", e_FSSaveFlagsSaveFlagNormal, &return_SaveAs2);
...
java
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);
...
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    #replace with the python2 lib path
    site.addsitedir('../../../')
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

# Assuming FSXFADoc xfa_doc has been loaded.

xfa_doc.ExportData("xfa_form.xml", XFADoc.e_ExportDataTypeXML)

xfa_doc.ResetForm()
doc.SaveAs("xfa_dynamic_resetform.pdf")

xfa_doc.ImportData("xfa_form.xml")
doc.SaveAs("xfa_dynamic_importdata.pdf")
...
objc
#include "FSPDFObjC.h"
...

// Assuming FSXFADoc xfa_doc has been loaded.

[xfa_doc exportData:@"xfa_form.xml" export_type:FSXFADocExportDataTypeXML];
[xfa_doc resetForm];
[doc saveAs:@"xfa_dynamic_resetform.pdf" save_flags:FSPDFDocSaveFlagNormal];

[xfa_doc importData:@"xfa_form.xml"];
[doc saveAs:@"xfa_dynamic_importdata.pdf" save_flags:FSPDFDocSaveFlagNormal];
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

// Assuming FSXFADoc xfa_doc has been loaded.

xfa_doc.ExportData("xfa_form.xml", FSDK.XFADoc.e_ExportDataTypeXML)

xfa_doc.ResetForm()
doc.SaveAs("xfa_dynamic_resetform.pdf")

xfa_doc.ImportData("xfa_form.xml")
doc.SaveAs("xfa_dynamic_importdata.pdf")
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.addon;
using foxit.addon.xfa;
...

// Assuming FSXFADoc xfa_doc has been loaded.

...
xfa_doc.ExportData("xfa_form.xml", XFADoc.ExportDataType.e_ExportDataTypeXML);
 
xfa_doc.ResetForm();
doc.SaveAs("xfa_dynamic_resetform.pdf", (int)foxit.pdf.PDFDoc.SaveFlags.e_SaveFlagNormal);
 
xfa_doc.ImportData(output_path + "xfa_form.xml");
doc.SaveAs("xfa_dynamic_importdata.pdf", (int)foxit.pdf.PDFDoc.SaveFlags.e_SaveFlagNormal);
...