3

我有一个基于 XFA 的 pdf 表单,我们需要使用 java 填充它。你能建议最好的方法吗?我能够使用 iText 为 pdf 生成 xfa xml。

public void readXfa(String srcPdfFilename, String destXMLFilename) throws IOException, ParserConfigurationException, SAXException, TransformerFactoryConfigurationError, TransformerException {

    PdfReader reader = new PdfReader(srcPdfFilename);
    XfaForm xfa = new XfaForm(reader);
    Document doc = xfa.getDomDocument();

    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tf.setOutputProperty(OutputKeys.INDENT, "yes");

    FileOutputStream os = new FileOutputStream(destXMLFilename);
    tf.transform(new DOMSource(doc), new StreamResult(os));

    reader.close();
}

我有从上面的代码生成的 Pdf 和 Xfa XML。您能否建议我如何进一步进行,因为我似乎没有想法。我试图检查 XFA 文档,但似乎不对。我没有 xml,而且 pdf 非常复杂,因为它有很多字段并且是动态 XFA pdf 表单。

您的帮助和建议将不胜感激。

4

1 回答 1

3

请看一下这个FillXFA例子。此示例有一个包含动态表的表单 ( purchase_order.pdf ):

在此处输入图像描述

现在我们添加data.xml,这是一组 XML 文件形式的数据,我们得到这样的结果:purchase_order_filled.pdf

在此处输入图像描述

如您所见,添加了 XML 文件中的数据以及一些空行(与 XML 中的空数据行相对应)。由于我们添加了许多行,我们甚至触发了一个新页面添加到 PDF 中。

这是如何完成的:

public void manipulatePdf(String src, String dest)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader,
            new FileOutputStream(dest));
    AcroFields form = stamper.getAcroFields();
    XfaForm xfa = form.getXfa();
    xfa.fillXfaForm(new FileInputStream(XML));
    stamper.close();
    reader.close();
}

这里还有另一个例子:XfaMovies. xfa_movies.pdf文档是没有任何按钮的单页 PDF。我们注入 120 部电影的数据:movies.xml。结果是 23 页的 PDF,xfa_filled_in.pdf

注意:阅读您的代码,您将获得一个包含完整 XFA 流的 XML。你不需要那个,你只需要数据。这就是我将链接添加到 XML 文件的原因:它们不包含任何 XFA 特定标签。

于 2014-07-01T11:12:55.073 回答