填充动态XFA pdf表单itext

时间:2014-07-01 10:45:50

标签: java pdf adobe itext xfa

我有一个基于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格式。

我们将非常感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:3)

请查看FillXFA示例。此示例的表单(purchase_order.pdf)包含动态表:

enter image description here

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

enter image description here

如您所见,添加了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();
}

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

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