从一个xml数据文件生成一组PDF文档

OutputService提供了多种方法来使用表单设计和数据创建文档,以便与表单设计合并。 以下文章介绍了用例,该用例用于从一个包含多个单个记录的大型xml中生成多个pdf。
以下是包含多个记录的xml文件的屏幕截图。

多记录xml

数据xml有2条记录。 每个记录由form1元素表示。 此xml将传递到OutputService generatePDFOutputBatch方法 我们获得pdf文档列表(每条记录一个), generatePDFOutputBatch方法的签名采用以下参数

  • 模板 — 包含模板的映射,由键标识
  • data — 包含xml数据文档的映射,由键标识
  • pdfOutputOptions — 用于配置pdf生成的选项
  • batchOptions — 用于配置批处理的选项

用例详细信息

在此用例中,我们将提供一个简单的Web界面来上传模板和data(xml)文件。 文件上传完成并将POST请求发送到AEM Servlet后。 此Servlet提取文档并调用OutputService的generatePDFOutputBatch方法。 生成的PDF文件会压缩为zip文件,以供最终用户从Web浏览器下载。

Servlet代码

以下是Servlet中的代码段。 代码从请求中提取模板(xdp)和数据文件(xml)。 模板文件将保存到文件系统。 创建了两个映射 — templateMap和dataFileMap ,它们分别包含模板和xml(data)文件。 然后,调用以生成DocumentServices服务的multipleRecords方法。

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

界面实施代码

以下代码使用OutputService的generatePDFOutputBatch生成多个PDF,并将包含PDF文件的zip文件返回给调用Servlet

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;


}

在服务器上部署

要在您的服务器上测试此功能,请按照以下说明操作:

注意

有多种方法可触发此功能。 在本例中,我们使用Web界面拖放模板和数据文件以演示该功能。

在此页面上