Visa DoR textbundet
Ett vanligt användningssätt är att visa ett PDF-dokument med de data som användaren har angett.
Vi har använt Adobe PDF Embed API för att uppnå den här användningen.
Följande steg utfördes för att slutföra integreringen
Skapa en anpassad komponent för att visa PDF textbundet
En anpassad komponent (embed-pdf) skapades för att bädda in den PDF-fil som returneras av POSTEN.
Klientbibliotek
Följande kod körs när användaren klickar på kryssruteknappen viewPDF
. Vi skickar adaptiva formulärdata, mallnamn till slutpunkten för att generera PDF-filen. Den genererade PDF-filen visas sedan för formuläranvändaren med hjälp av JavaScript-biblioteket för inbäddning.
$(document).ready(function() {
$(".viewPDF").click(function() {
console.log("view pdfclicked");
window.guideBridge.getDataXML({
success: function(result) {
var obj = new FormData();
obj.append("data", result.data);
obj.append("template", document.querySelector("[data-template]").getAttribute("data-template"));
const fetchPromise = fetch(document.querySelector("[data-endpoint]").getAttribute("data-endpoint"), {
method: "POST",
body: obj,
contentType: false,
processData: false,
})
.then(response => {
var adobeDCView = new AdobeDC.View({
clientId: document.querySelector("[data-apikey]").getAttribute("data-apikey"),
divId: "adobe-dc-view"
});
console.log("In preview file");
adobeDCView.previewFile(
{
content: {
promise: response.arrayBuffer()
},
metaData: {
fileName: document.querySelector("[data-filename]").getAttribute("data-filename")
}
}
);
console.log("done")
})
}
});
});
});
Generera exempeldata för XDP
- Öppna XDP i AEM Forms Designer.
- Klicka på Arkiv | Formuläregenskaper | Förhandsgranska
- Klicka på Generera förhandsgranskningsdata
- Klicka på Generera
- Ange beskrivande filnamn som"form-data.xml"
Generera XSD från XML-data
Du kan använda vilket som helst av de kostnadsfria onlineverktygen för att generera XSD från de XML-data som genererades i föregående steg.
Överför mallen
Se till att du överför xdp-mallen till AEM Forms med knappen Skapa
Skapa anpassat formulär
Skapa anpassningsbara formulär baserat på XSD från föregående steg.
Lägg till en ny flik i adaptiven. Lägg till en kryssrutekomponent och bädda in en pdf-komponent på den här fliken
Se till att du namnger kryssrutevyn PDF.
Konfigurera komponenten embed-pdf enligt skärmbilden nedan
Bädda in API-nyckel för PDF - Det här är nyckeln som du kan använda för att bädda in PDF-filen. Den här nyckeln fungerar bara med localhost. Du kan skapa din egen nyckel och associera den med en annan domän.
Slutpunkten som returnerar PDF-filen - Det här är den anpassade servern som sammanfogar data med xdp-mallen och returnerar PDF-filen.
Mallnamn - Detta är sökvägen till xdp. Vanligtvis lagras den under mappen för formulärsanddokument.
PDF-filnamn - Det här är strängen som kommer att visas i den inbäddade PDF-komponenten.
Skapa anpassad servett
En anpassad servlet skapades för att sammanfoga data med XDP-mallen och returnera PDF-filen. Koden för att uppnå detta listas nedan. Den anpassade servern ingår i det inbäddade PDF-paketet
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import javax.servlet.Servlet;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.output.api.OutputService;
package com.embedpdf.core.servlets;
@Component(service = {
Servlet.class
}, property = {
"sling.servlet.methods=post",
"sling.servlet.paths=/bin/getPDFToEmbed"
})
public class StreamPDFToEmbed extends SlingAllMethodsServlet {
@Reference
OutputService outputService;
private static final long serialVersionUID = 1 L;
private static final Logger log = LoggerFactory.getLogger(StreamPDFToEmbed.class);
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
String xdpName = request.getParameter("template");
String formData = request.getParameter("data");
log.debug("in doPOST of Stream PDF Form Data is >>> " + formData + " template is >>> " + xdpName);
try {
XPathFactory xfact = XPathFactory.newInstance();
XPath xpath = xfact.newXPath();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document xmlDataDoc = builder.parse(new InputSource(new StringReader(formData)));
// get the data to merge with template
Node afBoundData = (Node) xpath.evaluate("afData/afBoundData", xmlDataDoc, XPathConstants.NODE);
NodeList afBoundDataChildren = afBoundData.getChildNodes();
String afDataNodeName = afBoundDataChildren.item(0).getNodeName();
Node nodeWithDataToMerge = (Node) xpath.evaluate("afData/afBoundData/" + afDataNodeName, xmlDataDoc, XPathConstants.NODE);
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(nodeWithDataToMerge), new StreamResult(writer));
String xml = writer.toString();
InputStream targetStream = new ByteArrayInputStream(xml.getBytes());
Document xmlDataDocument = new Document(targetStream);
// get the template
Document xdpTemplate = new Document(xdpName);
log.debug("got the xdp Template " + xdpTemplate.length());
// use output service the merge data with template
com.adobe.fd.output.api.PDFOutputOptions pdfOptions = new com.adobe.fd.output.api.PDFOutputOptions();
pdfOptions.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_11);
com.adobe.aemfd.docmanager.Document documentToReturn = outputService.generatePDFOutput(xdpTemplate, xmlDataDocument, pdfOptions);
// stream pdf to the client
InputStream fileInputStream = documentToReturn.getInputStream();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=AemFormsRocks.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 (Exception e) {
System.out.println("Error " + e.getMessage());
}
}
}
Distribuera exemplet på servern
Så här testar du detta på den lokala servern:
- Hämta och installera det inbäddade PDF-paketet.
Detta har serverleten för att sammanfoga data med XDP-mallen och strömma tillbaka PDF-filen. - Lägg till sökvägen /bin/getPDFToEmbed i avsnittet Undantagna sökvägar i Adobe Granite CSRF-filtret med hjälp av AEM ConfigMgr. I din produktionsmiljö bör du använda CSRF-skyddsramverket
- Importera klientbiblioteket och den anpassade komponenten
- Importera det adaptiva formuläret och mallen
- Förhandsgranska anpassat formulär
- Fylla i vissa formulärfält
- Fliken Visa PDF. Markera kryssrutan Visa PDF. En PDF-fil ska visas i formuläret ifyllt med data från det adaptiva formuläret