XFDF 是 FDF 的 XML 风格。FDF 代表表单数据格式。它是一种在没有 PDF 实际内容的情况下存储数据的文件格式。FDF 使用 PDF 语法来存储这些数据。XFDF 使用 XML。
您无法将 FDF 或 XFDF 文件“转换”为 PDF,因为缺少太多信息。您可以将 (X)FDF 文件导入到具有相应 AcroForm 字段的 PDF 中。
请看一下ImportXFDF示例。对于那个例子,我写了一个简单的 XFDF 文件:data.xfdf:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields>
<field name="Submitted by"><value>Santaaimonce</value></field>
<field name="Job name"><value>Developer</value></field>
<field name="Shipping address"><value>Alphabet Street
Minneapolis
Minnesota</value></field>
<field name="Special instructions"><value>Use iText to fill out interactive form using data stored in XFDF file.
If you are a C# developer, use iTextSharp.</value></field>
</fields>
<f href="Requisition_Fillable.pdf"/>
</xfdf>
此信息不足以创建 PDF,但如您所见,有一个对模板 PDF 文件的引用:Requisition_Fillable.pdf。
如果您将data.xfdf
andRequisition_Fillable.pdf
放在同一目录中并打开data.xfdf
,您将看到以下消息:

Adobe Reader 打开 XFDF 文件,找到对 PDF 模板的引用,打开模板,现在询问您是否要导入数据。如果您单击选项按钮并允许导入,您将获得以下结果:

您遇到的问题很简单:您在任何地方都没有 Requisition_Fillable.pdf 文件。您可能还希望避免人们能够更改填写的数据。
您可以通过以编程方式合并 XFDF 文件及其模板来解决此问题:
protected void fillXfdf(String SRC, String XFDF, String DEST) throws IOException, DocumentException {
// We receive the XML bytes
XfdfReader xfdf = new XfdfReader(new FileInputStream(XFDF));
// We get the corresponding form
PdfReader reader = new PdfReader(SRC);
// We create an OutputStream for the new PDF
FileOutputStream baos = new FileOutputStream(DEST);
// Now we create the PDF
PdfStamper stamper = new PdfStamper(reader, baos);
// We alter the fields of the existing PDF
AcroFields fields = stamper.getAcroFields();
fields.setFields(xfdf);
// take away all interactivity
stamper.setFormFlattening(true);
// close the stamper
stamper.close();
reader.close();
}
请注意以下行:
stamper.setFormFlattening(true);
这将使表单变平:字段将不再是字段,它们将与任何其他内容一样。你最终得到一个普通的 PDF:xfdf_merged.pdf

显然,这仅在表单(在这种情况下Requisition_Fillable.pdf
)与 XFDF 流中的数据相对应时才有效。例如:我的模板将使用您的字段数据"Submitted by"
和"Shipping address"
. 它不适用于字段"Job Name"
和"Special Instructions"
,因为这些字段在我的模板中不存在。在我的模板中,这些字段被命名为"Job name"
and "Special instructions"
; 你看到小写而不是大写吗?
如果您想使用我的模板,则必须在 XFDF 文件或 PDF 模板中更改这两个字段名称。另外:我的示例是用 Java 编写的。当您在 VB 中工作时,您必须使用称为 iTextSharp 的 .NET 版本的 iText。经验丰富的 VBA 开发人员将我的示例从 Java 移植到 VB 应该没有任何问题。只需将 Java 视为伪代码即可。
免责声明:以上示例需要 iText。我是 iText Group 的 CEO,这个例子取自我的书“iText in Action - Second Edition”。