将.xfdf保存为.pdf

时间:2015-05-28 14:07:10

标签: excel vba excel-vba pdf xfdf

我目前正在使用Excel填充带有表单字段的PDF文件。一切正常,但它将其导出为.xfdf。有谁知道如何将其保存为PDF格式呢?

FullFileName = FilePath & "Requisition - " & Trim(MyRecord.CompanyName) & " - " & _
Year & "-" & Month & "-" & Day & "-" & Hour & "-" & Minute & "-" & Seconds & ".xfdf"
Open FullFileName For Output As #1
    Print #1, "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
    Print #1, "<xfdf xmlns=""http://ns.adobe.com/xfdf/"" xml:space=""preserve"">"
    Print #1, "<fields>"

    Print #1, "<field name=""Submitted by""><value>" + Trim(MyRecord.RequestedBy) + "</value></field>"
    Print #1, "<field name=""Job Name""><value>" + "Auto Cards" + "</value></field>"
    Print #1, "<field name=""Shipping address""><value>" + Trim(MyRecord.StreetNumber) & " " & Trim(MyRecord.StreetName) & ", Unit " & Trim(MyRecord.Suite) & ", " & Trim(MyRecord.City) & ", " & Trim(MyRecord.Province) & ", " & Trim(MyRecord.PostalCode) + "</value></field>"
    Print #1, "<field name=""Special Instructions""><value>" + "Print" + "</value></field>"
    Print #1, "</fields>"
    Print #1, "<f href=""..\Requisition_Fillable.pdf""/>"

    Print #1, "</xfdf>"
Close #1    ' Close file.

1 个答案:

答案 0 :(得分:4)

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.xfdfRequisition_Fillable.pdf放在同一目录中并打开data.xfdf,则会看到以下消息:

enter image description here

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

enter image description here

您遇到的问题很简单:您没有任何地方的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

enter image description here

显然,只有表单(在本例中为Requisition_Fillable.pdf)与XFDF流中的数据相对应时,这才有效。例如:我的模板将使用字段"Submitted by""Shipping address"的数据。它不适用于字段"Job Name""Special Instructions",因为我的模板中不存在这些字段。在我的模板中,这些字段的名称为"Job name""Special instructions";你看到小写而不是大写吗?

如果要使用我的模板,则必须在XFDF文件或PDF模板中更改这两个字段名称。另外:我的例子是用Java编写的。当你在VB工作时,你将不得不使用iText的.NET版本,它被称为iTextSharp。有经验的VBA开发人员不应该将我的示例从Java移植到VB。只要把Java想象成伪代码就可以了。

免责声明:以上示例需要iText。我是iText集团的首席执行官,这个例子取自我的书“iText in Action - Second Edition”。