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);
...