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 Verwendungsfall erläutert, mit dem mehrere PDFs aus einer großen XML mit mehreren einzelnen Datensätzen generiert werden.
Im Folgenden sehen Sie den Screenshot der XML-Datei, die mehrere Datensätze enthält.

multi-record-xml

Die Daten-XML enthält 2 Datensätze. Jeder Datensatz wird durch das form1-Element dargestellt. Diese XML wird an die OutputService generatePDFOutputBatch-Methode übergeben. Es wird eine Liste der PDF-Dokumente(ein pro Datensatz) erhalten.
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-Dokumenten, identifiziert durch Schlüssel
  • pdfOutputOptions - Optionen zum Konfigurieren der PDF-Generierung
  • batchOptions - Optionen zum Konfigurieren des Stapels
HINWEIS

Dieser Verwendungsfall ist als Live-Beispiel auf dieser Website verfügbar.

Falldetails

In diesem Fall stellen wir eine einfache Weboberfläche bereit, um die Vorlage und die Datei data(xml) hochzuladen. Sobald der Hochladevorgang abgeschlossen ist und die POST an AEM Servlet gesendet wird. Dieses Servlet extrahiert die Dokumente und ruft die generatePDFOutputBatch-Methode 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 Codefragment vom Servlet. Code extrahiert die Vorlage(xdp) und die Datendatei(xml) aus der Anforderung. Die Vorlagendatei wird im Dateisystem gespeichert. Es werden zwei Maps erstellt: templateMap und dataFileMap, die die Vorlagen- bzw. XML(data)-Dateien enthalten. Anschließend wird ein Aufruf zur generateMultipleRecords-Methode des DocumentServices-Dienstes ausgeführt.

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);
.....
.....
....

Interface-Implementierungscode

Der folgende Code generiert mehrere PDFs mit 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 Weboberfläche verwendet, um die Vorlage und die Datendatei zu verschieben, um die Funktionalität zu demonstrieren.

Auf dieser Seite