Skip to content

XFA Form (XML Forms Architecture)

An XFA form is an XML-based interactive form specification embedded in a PDF document. Through template syntax and processing rules, it enables developers to build powerful interactive forms centered on defining templates for user data fields.

XFA Capabilities

Foxit PDF SDK provides APIs to render XFA forms, capture data, and export and import form data in applications.

Implement XFA Callbacks (Java Example)

Foxit PDF SDK provides two Java callback classes to customize XFA form processing:

  • com.foxit.sdk.addon.xfa.AppProviderCallback: Application-level callback, registered with Library.registerXFAAppProviderCallback().
  • com.foxit.sdk.addon.xfa.DocProviderCallback: Document-level callback, registered when constructing XFADoc. Developers must implement all pure virtual methods in both classes.

Licensing

  • To use XFA forms, ensure your license includes the XFA module permission.

Load XFADoc and Display an Interactive XFA Form

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("@fuxinsoft/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))
    {
    ...
    }
}
go
import (
. “foxit.com/fsdk”
) 

pXFAAppHandler:= XFAAppHandler{}
pXFAAppHandler _ := NewDirectorAppProviderCallback(pXFAAppHandler)

# implement from AppProviderCallback
Library.RegisterXFAAppProviderCallback(pXFAAppHandler_)
input_file := input_path + "xfa_dynamic.pdf"
doc := NewPDFDoc(input_file)
defer DeletePDFDoc(doc)
error_code := doc.Load("")
if error_code != fdsk.E_ErrSuccess {
      return 1
}

pXFADocHandler := XFADocHandler{}
 pXFADocHandler_ := NewDirectorDocProviderCallback(pXFADocHandler) 
# implement from DocProviderCallback
xfa_doc = NewXFADoc(doc, pXFADocHandler_)
defer DeleteXFADoc(xfa_doc)
xfa_doc.StartLoad("")
...

Export and Import XFA Form Data

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("@fuxinsoft/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);
...
go
import (
. “foxit.com/fsdk”
) 

# Assuming FSXFADoc xfa_doc has been loaded.

xfa_doc.ExportData("xfa_form.xml", XFADocE_ExportDataTypeXML)

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

xfa_doc.ImportData("xfa_form.xml")
doc.SaveAs("xfa_dynamic_importdata.pdf")
...