You didn't insert a code sample to show how you are currently flattening the XFA form. I assume your code looks like this:
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest)); PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true); Map fields = form.getFormFields(); Set fieldKeys = fields.keySet(); for (String fieldKey : fieldKeys) form.getField(fieldKey).setValue("X"); form.flattenFields(); pdfDoc.close();
This code will work when trying to flatten forms based on AcroForm technology. For forms based on the XML Forms Architecture (XFA) you should use the following snippet:
PdfDocument pdfdoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest)); PdfAcroForm form = PdfAcroForm.getAcroForm(pdfdoc, true); XfaForm xfa = form.getXfaForm(); xfa.fillXfaForm(new FileInputStream(xml)); xfa.write(pdfdoc); XFAFlattener xFAFlattener = new XFAFlattener();xFAFlattener.flatten(new FileInputStream("input.pdf"),new FileOutputStream(getDestFile())); pdfdoc.close();
String paths to your documents.
A dynamic XFA form usually consists of a single page PDF (the one with the "Please wait..." message) that is shown in viewers that do not understand XFA. The actual content of the document is stored as an XML file.
The process of flattening an XFA form to an ordinary PDF requires that you parse the XML and convert the XML syntax into PDF syntax.