Generieren eines Satzes von PDF-Dokumenten aus einer XML-Datendatei

OutputService bietet eine Reihe von Methoden zum Erstellen von Dokumenten mit einem Formularentwurf und Daten zum Zusammenführen mit dem Formularentwurf. Im folgenden Artikel wird der Anwendungsfall erläutert, mit dem mehrere PDF-Dateien aus einer großen XML-Datei mit mehreren einzelnen Datensätzen generiert werden.
Im Folgenden finden Sie den Screenshot einer XML-Datei mit mehreren Datensätzen.

multi-record-xml

Die Daten-XML enthält 2 Datensätze. Jeder Datensatz wird durch das Element form1 dargestellt. Diese XML-Datei wird an den OutputService übergeben. generatePDFOutputBatch-Methode Wir erhalten eine Liste von PDF-Dokumenten (eines pro Datensatz) Die Signatur der generatePDFOutputBatch -Methode akzeptiert die folgenden Parameter

  • templates - Zuordnung, die die Vorlage enthält, durch einen Schlüssel identifiziert
  • data - Zuordnung mit XML-Datendokumenten, identifiziert durch Schlüssel
  • pdfOutputOptions - Optionen zum Konfigurieren der PDF-Generierung
  • batchOptions - Optionen zum Konfigurieren des Batches

Anwendungsfalldetails

In diesem Anwendungsbeispiel stellen wir eine einfache Web-Oberfläche zum Hochladen der Vorlage und der Datei data(xml) bereit. Sobald der Upload der Dateien abgeschlossen ist und die POST-Anfrage an AEM Servlet gesendet wird. Dieses Servlet extrahiert die Dokumente und ruft die Methode generatePDFOutputBatch des OutputService auf. Die generierten PDFs werden in eine ZIP-Datei komprimiert und dem Endbenutzer zum Herunterladen vom Webbrowser zur Verfügung gestellt.

Servlet-Code

Im Folgenden finden Sie das Code-Snippet aus dem Servlet. Code extrahiert die Vorlage (xdp) und die Datendatei (xml) aus der Anforderung. Die Vorlagendatei wird im Dateisystem gespeichert. Zwei Karten werden erstellt - templateMap und dataFileMap , die die Vorlage und die XML(data)-Dateien enthalten. Anschließend wird die generateMultipleRecords -Methode des DocumentServices-Dienstes aufgerufen.

for (final java.util.Map.Entry < String, org.apache.sling.api.request.RequestParameter[] > pairs: params
.entrySet()) {
final String key = pairs.getKey();
final org.apache.sling.api.request.RequestParameter[] pArr = pairs.getValue();
final org.apache.sling.api.request.RequestParameter param = pArr[0];
try {
if (!param.isFormField()) {

if (param.getFileName().endsWith("xdp")) {
    final InputStream xdpStream = param.getInputStream();
    com.adobe.aemfd.docmanager.Document xdpDocument = new com.adobe.aemfd.docmanager.Document(xdpStream);

    xdpDocument.copyToFile(new File(saveLocation + File.separator + "fromui.xdp"));
    templateMap.put("key1", "file://///" + saveLocation + File.separator + "fromui.xdp");
    System.out.println("####  " + param.getFileName());

}
if (param.getFileName().endsWith("xml")) {
    final InputStream xmlStream = param.getInputStream();
    com.adobe.aemfd.docmanager.Document xmlDocument = new com.adobe.aemfd.docmanager.Document(xmlStream);
    dataFileMap.put("key1", xmlDocument);
}
}

Document zippedDocument = documentServices.generateMultiplePdfs(templateMap, dataFileMap,saveLocation);
.....
.....
....

Implementierungscode der Schnittstelle

Der folgende Code generiert mehrere PDF-Dateien mithilfe des generatePDFOutputBatch des OutputService und gibt eine ZIP-Datei mit den PDF-Dateien an das aufrufende Servlet zurück

public Document generateMultiplePdfs(HashMap < String, String > templateMap, HashMap < String, Document > dataFileMap, String saveLocation) {
    log.debug("will save generated documents to " + saveLocation);
    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.fd.output.api.BatchOptions batchOptions = new com.adobe.fd.output.api.BatchOptions();
    batchOptions.setGenerateManyFiles(true);
    com.adobe.fd.output.api.BatchResult batchResult = null;
    try {
        batchResult = outputService.generatePDFOutputBatch(templateMap, dataFileMap, pdfOptions, batchOptions);
        FileOutputStream fos = new FileOutputStream(saveLocation + File.separator + "zippedfile.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);
        FileInputStream fis = null;

        for (int i = 0; i < batchResult.getGeneratedDocs().size(); i++) {
              com.adobe.aemfd.docmanager.Document dataMergedDoc = batchResult.getGeneratedDocs().get(i);
            log.debug("Got document " + i);
            dataMergedDoc.copyToFile(new File(saveLocation + File.separator + i + ".pdf"));
            log.debug("saved file " + i);
            File fileToZip = new File(saveLocation + File.separator + i + ".pdf");
            fis = new FileInputStream(fileToZip);
            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);
            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
            fis.close();
        }
        zipOut.close();
        fos.close();
        Document zippedDocument = new Document(new File(saveLocation + File.separator + "zippedfile.zip"));
        log.debug("Got zipped file from file system");
        return zippedDocument;


    } catch (OutputServiceException | IOException e) {

        e.printStackTrace();
    }
    return null;


}

Auf Ihrem Server bereitstellen

Um diese Funktion auf Ihrem Server zu testen, befolgen Sie die folgenden Anweisungen:

HINWEIS

Es gibt mehrere Möglichkeiten, diese Funktion Trigger. In diesem Beispiel haben wir eine Web-Oberfläche verwendet, um die Vorlage und die Datendatei abzulegen, um die Funktion zu demonstrieren.

Auf dieser Seite