DocumentatieAEMTutorials voor AEMTutorials voor AEM Forms

Interactieve DoR downloaden

Laatst bijgewerkt: 25 maart 2025
  • Van toepassing op:
  • Experience Manager 6.4
  • Experience Manager 6.5
  • Onderwerpen:

Gemaakt voor:

  • Ervaren
  • Ontwikkelaar

Een veelvoorkomend geval is het downloaden van een interactieve DoR met de Adaptief-formuliergegevens. Het gedownloade DoR wordt vervolgens voltooid met Adobe Acrobat of Adobe Reader.

Adaptief formulier is niet gebaseerd op XSD-schema

Als uw XDP- en Adaptief formulier niet zijn gebaseerd op een schema, voert u de volgende stappen uit om een interactief document met records te genereren.

Adaptief formulier maken

Maak een adaptief formulier en zorg ervoor dat de adaptieve namen van formuliervelden identiek zijn aan veldnamen in uw xdp-sjabloon.
Noteer de naam van het hoofdelement van uw xdp-sjabloon.
wortel-element

Clientbibliotheek

De volgende code wordt geactiveerd wanneer de knop PDF downloaden wordt geactiveerd

$(document).ready(function() {
    $(".downloadPDF").click(function() {
        window.guideBridge.getDataXML({
            success: function(guideResultObject) {
                var req = new XMLHttpRequest();
                req.open("POST", "/bin/generateinteractivedor", true);
                req.responseType = "blob";
                var postParameters = new FormData();
                postParameters.append("dataXml", guideResultObject.data);
                postParameters.append("xdpName","two.xdp")
                postParameters.append("formBasedOnSchema", "false");
                postParameters.append("xfaRootElement","form1");
                console.log(guideResultObject.data);
                req.send(postParameters);
                req.onreadystatechange = function() {
                    if (req.readyState == 4 && req.status == 200) {
                        download(this.response, "report.pdf", "application/pdf");
                    }


                }
            }
        });

    });
});

Adaptief formulier gebaseerd op XSD-schema

Als uw xdp niet is gebaseerd op XSD, voert u de volgende stappen uit om XSD(schema) te maken waarop u het adaptieve formulier baseert

Voorbeeldgegevens genereren voor de XDP

  • Open XDP in de ontwerper van AEM Forms.
  • Klikken op bestand | Formuliereigenschappen | Voorvertoning
  • Klik op Voorbeeldgegevens genereren
  • Klik op Genereren
  • Geef een betekenisvolle bestandsnaam op, bijvoorbeeld "form-data.xml"

XSD genereren op basis van de XML-gegevens

U kunt om het even welke vrije online hulpmiddelen gebruiken om XSDvan de xmlgegevens te produceren die in de vorige stap worden geproduceerd.

Adaptief formulier maken

Maak een adaptief formulier op basis van de XSD van de vorige stap. Koppel het formulier aan het gebruik van de clientbibliotheek "irs". Deze clientbibliotheek heeft de code om een POST-aanroep te maken naar de servlet die de PDF terugstuurt naar de aanroepende toepassing.
De volgende code wordt teweeggebracht wanneer de Download PDF wordt geklikt

$(document).ready(function() {
    $(".downloadPDF").click(function() {
        window.guideBridge.getDataXML({
            success: function(guideResultObject) {
                var req = new XMLHttpRequest();
                req.open("POST", "/bin/generateinteractivedor", true);
                req.responseType = "blob";
                var postParameters = new FormData();
                postParameters.append("dataXml", guideResultObject.data);
                postParameters.append("xdpName","f8918-r14e_redo-barcode_3 2.xdp")
                postParameters.append("formBasedOnSchema", "true");
                postParameters.append("dataNodeToExtract","afData/afBoundData/topmostSubform");
                console.log(guideResultObject.data);
                req.send(postParameters);
                req.onreadystatechange = function() {
                    if (req.readyState == 4 && req.status == 200) {
                        download(this.response, "report.pdf", "application/pdf");
                    }


                }
            }
        });

    });
});

Aangepaste servlet maken

Maak een aangepaste servlet die de gegevens samenvoegt met een XDP-sjabloon en de PDF retourneert. De code om dit te verwezenlijken is hieronder vermeld. De douaneserlet maakt deel uit van AEMFormsDocumentServices.core-1.0-SNAPSHOT bundel).

public class GenerateIInteractiveDor extends SlingAllMethodsServlet {
    private static final long serialVersionUID = 1 L;
    @Reference
    DocumentServices documentServices;
    @Reference
    FormsService formsService;
    private static final Logger log = LoggerFactory.getLogger(GenerateIInteractiveDor.class);

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
        doPost(request, response);
    }
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) {
        String xdpName = request.getParameter("xdpName");

        boolean formBasedOnXSD = Boolean.parseBoolean(request.getParameter("formBasedOnSchema"));

        XPathFactory xfact = XPathFactory.newInstance();
        XPath xpath = xfact.newXPath();
        String dataXml = request.getParameter("dataXml");
        log.debug("The data xml is " + dataXml);
        org.w3c.dom.Document xmlDataDoc = documentServices.w3cDocumentFromStrng(dataXml);
        Document renderedPDF = null;
        try {
            if (!formBasedOnXSD) {
                String xfaRootElement = request.getParameter("xfaRootElement");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                org.w3c.dom.Document newXMLDocument = dBuilder.newDocument();
                Element rootElement = newXMLDocument.createElement(xfaRootElement);
                String unboundData = "afData/afUnboundData/data";
                Node dataNode = (Node) xpath.evaluate(unboundData, xmlDataDoc, XPathConstants.NODE);
                NodeList dataChildNodes = dataNode.getChildNodes();
                for (int i = 0; i<dataChildNodes.getLength(); i++) {
                    Node childNode = dataChildNodes.item(i);
                    if (childNode.getNodeType() == 1) {
                        Element newElement = newXMLDocument.createElement(childNode.getNodeName());
                        newElement.setTextContent(childNode.getTextContent());
                        rootElement.appendChild(newElement);
                        log.debug("the node name is  " + childNode.getNodeName() + " and its value is " + childNode.getTextContent());
                    }
                }
                newXMLDocument.appendChild(rootElement);
                Document xmlDataDocument = documentServices.orgw3cDocumentToAEMFDDocument(newXMLDocument);
                String xdpTemplatePath = "crx:///content/dam/formsanddocuments";
                com.adobe.fd.forms.api.PDFFormRenderOptions renderOptions = new com.adobe.fd.forms.api.PDFFormRenderOptions();
                renderOptions.setAcrobatVersion(com.adobe.fd.forms.api.AcrobatVersion.Acrobat_11);
                renderOptions.setContentRoot(xdpTemplatePath);
                renderOptions.setRenderAtClient(com.adobe.fd.forms.api.RenderAtClient.NO);
                renderedPDF = formsService.renderPDFForm(xdpName, xmlDataDocument, renderOptions);

            } else {
                // form is based on xsd
                // get the actual xml data that needs to be merged with the template. This can be made more generic
                String nodeToExtract = request.getParameter("dataNodeToExtract");
                Node dataNode = (Node) xpath.evaluate(nodeToExtract, xmlDataDoc, XPathConstants.NODE);
                StringWriter writer = new StringWriter();
                Transformer transformer = TransformerFactory.newInstance().newTransformer();
                transformer.transform(new DOMSource(dataNode), new StreamResult(writer));
                String xml = writer.toString();
                System.out.println(xml);
                xmlDataDoc = documentServices.w3cDocumentFromStrng(xml);
                Document xmlDataDocument = documentServices.orgw3cDocumentToAEMFDDocument(xmlDataDoc);
                String xdpTemplatePath = "crx:///content/dam/formsanddocuments";
                com.adobe.fd.forms.api.PDFFormRenderOptions renderOptions = new com.adobe.fd.forms.api.PDFFormRenderOptions();
                renderOptions.setAcrobatVersion(com.adobe.fd.forms.api.AcrobatVersion.Acrobat_11);
                renderOptions.setContentRoot(xdpTemplatePath);
                renderOptions.setRenderAtClient(com.adobe.fd.forms.api.RenderAtClient.NO);
                renderedPDF = formsService.renderPDFForm(xdpName, xmlDataDocument, renderOptions);
            }
            InputStream fileInputStream = renderedPDF.getInputStream();
            response.setContentType("application/pdf");
            response.addHeader("Content-Disposition", "attachment; filename=" + xdpName.replace("xdp", "pdf"));
            response.setContentLength((int) fileInputStream.available());
            OutputStream responseOutputStream = response.getOutputStream();
            int bytes;
            while ((bytes = fileInputStream.read()) != -1) {
                responseOutputStream.write(bytes);
            }
            responseOutputStream.flush();
            responseOutputStream.close();

        } catch (XPathExpressionException | TransformerException | FormsServiceException | IOException | ParserConfigurationException e) {
            log.debug(e.getMessage());
        }

    }

}

In deze voorbeeldcode worden de xdp-naam en andere parameters uit het aanvraagobject geëxtraheerd. Als het formulier niet is gebaseerd op een XSD, wordt een nieuw XML-document gemaakt om samen te voegen met het xdp. Als het formulier echter is gebaseerd op XSD, wordt het relevante knooppunt rechtstreeks uit de ingediende gegevens van het adaptieve formulier geëxtraheerd en wordt er een XML-document gegenereerd dat dienovereenkomstig wordt samengevoegd met de xdp-sjabloon.

Het voorbeeld op de server implementeren

Voer de volgende stappen uit om dit op uw lokale server te testen:

  1. Download en installeer de DevelopingWithServiceUser Bundle
  2. Voeg het volgende item toe aan de Apache Sling Service User Mapper Service
    DevelopingWithServiceUser.core:getformsresourceresolver=fd-service
  3. Download en installeer de bundel van douaneDocumentServices. Dit heeft servlet om de gegevens met het malplaatje XDP samen te voegen en pdf terug te stromen
  4. De clientbibliotheek importeren
  5. Het artikel Assets (Adaptief formulier,XDP-sjablonen en XSD) importeren
  6. Voorproef Aangepaste Vorm
  7. Vul slechts enkele formuliervelden in.
  8. Klik op PDF downloaden om de PDF op te halen. Mogelijk moet u een paar seconden wachten voordat de PDF wordt gedownload.
NOTE
Wanneer u de gedownloade PDF opent met de PDF-viewer van de browser, worden de gegevens niet weergegeven in de PDF. Open de gedownloade PDF met Adobe Acrobat of Adobe Reader.
NOTE
U kunt het zelfde gebruiksgeval met proberen niet op xsd gebaseerde adaptieve vorm. Zorg ervoor dat u de juiste parameters doorgeeft aan het posteindpunt in streampdf.js in de irs clientlib.
recommendation-more-help
8de24117-1378-413c-a581-01e660b7163e