Export Data
The first step to populate an Adaptive Form from a PDF file is to export the data from the given PDF file and store it in the AEM repository.
The following code was written to extract the data from the uploaded pdf and massaged to get the correct format than can be used to populate the adaptive form
public String getFormData(Document pdfForm) {
DocumentBuilderFactory factory = null;
DocumentBuilder builder = null;
org.w3c.dom.Document xmlDocument = null;
try {
Document xmlData = formsService.exportData(pdfForm, DataFormat.Auto);
xmlData.copyToFile(new File("xmlData.xml"));
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
xmlDocument = builder.parse(xmlData.getInputStream());
org.w3c.dom.Node xdpNode = xmlDocument.getDocumentElement();
log.debug("Got xdp " + xdpNode.getNodeName());
org.w3c.dom.Node datasets = getChildByTagName(xdpNode, "xfa:datasets");
log.debug("Got datasets " + datasets.getNodeName());
org.w3c.dom.Node data = getChildByTagName(datasets, "xfa:data");
log.debug("Got data " + data.getNodeName());
org.w3c.dom.Node topmostSubform = getChildByTagName(data, "topmostSubform");
if (topmostSubform != null) {
org.w3c.dom.Document newXmlDocument = builder.newDocument();
org.w3c.dom.Node importedNode = newXmlDocument.importNode(topmostSubform, true);
newXmlDocument.appendChild(importedNode);
Document aemFDXmlDocument = documentServices.orgw3cDocumentToAEMFDDocument(newXmlDocument);
aemFDXmlDocument.copyToFile(new File("aemFDXmlDocument.xml"));
// saveDocumentInCrx is an utility method of the custom DocumentServices service.
return documentServices.saveDocumentInCrx("/content/exporteddata", ".xml", aemFDXmlDocument);
}
} catch (Exception e) {
log.debug("Error: " + e.getMessage());
}
return null;
}
The following is the utility function written to extract the topmostSubForm with the appropriate namespaces
private static org.w3c.dom.Node getChildByTagName(org.w3c.dom.Node parent, String tagName) {
NodeList nodeList = parent.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
org.w3c.dom.Node node = nodeList.item(i);
if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE && node.getNodeName().equals(tagName)) {
return node;
}
}
return null;
}
The extracted data is stored under the /content/exporteddata node in the crx repository. The file path of the exported data is then returned to the calling application for populating the adaptive form.
8de24117-1378-413c-a581-01e660b7163e