How to fill out a pdf file programmatically? (Dynamic XFA)

Tags: XFAfill formXMLformsiText 7pdfXfa

I have a dynamic XFA Form that I can fill out manually using Adobe Acrobat on my computer. Using iTextSharp I can read what the XFA XML data is and see the structure of the data. I am essentially trying to mimic that with iText using the following code:

PdfReader pdfReader = new PdfReader(sourceFilePath);
using (MemoryStream ms = new MemoryStream()) {
    using (PdfStamper stamper = new PdfStamper(pdfReader, ms)) {
        XfaForm xfaForm = new XfaForm(pdfReader);
        XmlDocument doc = new XmlDocument();
        doc.Load(replacementXmlFilePath);
        xfaForm.DomDocument = doc;
        xfaForm.Changed = true;
        XfaForm.SetXfa(xfaForm, stamper.Reader, stamper.Writer);
    }
    var bytes = ms.ToArray();
    File.WriteAllBytes(destinationtFilePath, bytes);
}
For some reason this code doesn't work.

Posted on StackOverflow on May 11, 2013 by jon333

This question was answered by the person who posted the question:

I found the issue. The replacement DomDocument needs to be the entire merged XML of the new document, not just the data or datasets portion.

I upvoted this answer, because it's not incorrect, but now that I think it's better to use the example from the book:

public void manipulatePdf2(String src, String xml, String dest) throws IOException {
    PdfReader reader = new PdfReader(src);
    PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest));
    PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
    XfaForm xfa = form.getXfaForm();
    xfa.fillXfaForm(new FileInputStream(xml));
    xfa.write(pdfDoc);
    pdfDoc.close();
}

As you can see, it's not necessary to replace the whole XFA XML. If you use the fillXfaForm() method, the data is sufficient.

Click this link if you want to see how to answer this question in iText 5.