假设存在这样一种情况,您必须将多个 PDF 合并为一个 PDF,并将合并的 PDF 作为响应发送回源系统,或者将合并的 PDF 存储在文件位置。在本文中,您将学习如何执行此操作。MuleSoft 中没有这样的连接器,您可以使用它来合并 PDF。您必须使用 Java 库 org.apache.pdfbox.multipdf 来合并 PDF。它包含将多个 PDF 合并为一个所需的所有 Java 库。
实现
第 1 步
添加依赖项,如下面的 pom.xml 所示:
纯文本
1 <dependency> 2 <groupId>org.apache.pdfbox</groupId> 3 <artifactId>pdfbox</artifactId> 4 <version>2.0.1</version> 5 </dependency>
步骤 2
在 src/main/java 下创建一个 Java 类,并创建两个静态方法和:MergeMultiplePDFmergeAndStorePDFmergePDFs
爪哇岛
1 package com.mulesoft.mergePDF; 2 3 import org.apache.pdfbox.io.MemoryUsageSetting; 4 import org.apache.pdfbox.multipdf.PDFMergerUtility; 5 6 import java.io.ByteArrayInputStream; 7 import java.io.ByteArrayOutputStream; 8 import java.io.File; 9 import java.io.IOException; 10 import java.util.Base64; 11 12 public class MergeMultiplePDF { 13 14 /* 15 Merge PDF and store it in a local directory 16 listPdfFileNames= ["src/main/resources/input/PDF1.pdf", "src/main/resources/input/PDF2.pdf"] 17 mergedPdfFileName= "src/main/resources/output/mergedPDF.pdf" 18 */ 19 20 public static void mergeAndStorePDF(String[] listPdfFileNames, String mergedPdfFileName) throws IOException { 21 22 /* Create and initialize object of PDFMergerUtility */ 23 PDFMergerUtility obj = new PDFMergerUtility(); 24 /* Set Destination File in the PDFMergerUtility Object */ 25 obj.setDestinationFileName(mergedPdfFileName); 26 /* Iterate through the list of PDF filenames */ 27 for (String file : listPdfFileNames) { 28 /* Add Each PDF files in the PDFMergerUtility Object */ 29 obj.addSource(new File(file)); 30 } 31 /* Now the PDFMergerUtility Object has all the PDFs. Use mergeDocuments method to merge the PDFs */ 32 obj.mergeDocuments(null); 33 /* This will store the merged PDF in the destination path passed as argument */ 34 } 35 36 /* 37 Merge PDFs and return the merged PDF as a byte array 38 base64PDF= List of base64 encoded PDF strings 39 Eg. ["PDF1 base64 encoded string", "PDF2 base64 encoded string"] 40 */ 41 public static byte[] mergePDFs(String[] base64PDF) throws Exception { 42 43 /* Create and initialize ByteArrayOutputStream to return the merged PDF as a byte array */ 44 try (ByteArrayOutputStream destination = new ByteArrayOutputStream()) { 45 /* Create and initialize object of PDFMergerUtility */ 46 PDFMergerUtility obj = new PDFMergerUtility(); 47 /* Set Destination Stream as the ByteArrayOutputStream object in the PDFMergerUtility Object */ 48 obj.setDestinationStream(destination); 49 50 /* Iterate through the list of Base64 encoded PDF strings */ 51 for (String pdf : base64PDF) { 52 /* Initialize ByteArrayInputStream object and store each PDF as bytes */ 53 ByteArrayInputStream bais = new ByteArrayInputStream(pdf.getBytes()); 54 55 /* Add each base64 decoded PDF in the PDFMergerUtility Object */ 56 obj.addSource(Base64.getDecoder().wrap(bais)); 57 } 58 /* Now the PDFMergerUtility Object has all the PDFs. Use mergeDocuments method to merge the PDFs */ 59 obj.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); 60 /* Return the mergedPDF as a byte array using the ByteArrayOutputStream object */ 61 return destination.toByteArray(); 62 63 } catch (IOException e) { 64 throw new Exception("Error occurred while merging pdf files", e); 65 } 66 67 68 } 69 70 } 71
mergeAndStorePDF- 此静态方法接受两个参数 ( 和 ),并且没有返回类型。阅读 Java 类中的注释,了解每一步。listPdfFileNamesmergedPdfFileName
mergePDFs - 此静态方法接受一个参数 (),并将返回类型为字节数组。这个字节数组实际上是字节数组格式的合并 PDF 文件。阅读 Java 类中的注释,了解每一步。base64PDF
步骤 3
拖放 SFTP 列表连接器,并在 SFTP 配置中添加 SFTP 凭据。将目录路径和文件名模式添加为 .这将从属性文件中提到的路径中检索所有 PDF 文件。{*.pdf}
步骤 4
接下来,将变量初始化为空白数组。此变量将包含所有 base64 编码的 PDF 字符串。在此之后添加一个选择组件,以检查有效负载是否为空(即,SFTP 列表连接器是否选取了任何文件)。如果未检索到任何文件,则只需记录一条消息“未找到文件”。否则,请使用组件循环访问检索到的所有 PDF 文件。base64PDF[]For-Each
步骤 5
接下来,如上图所示阅读每个 PDF,对其进行编码,并将其作为 base64 编码的字符串存储在变量中。 使用如下所示的方法对 PDF 进行编码。base64PDFtoBase64()dw::core::Binaries library
步骤 6
接下来,调用类的静态方法。 将 base64 编码的 PDF 字符串列表(存储在变量中)作为参数传递给该方法。 该方法将以字节数组格式返回串联的 PDF。将该字节数组编码为 base64 编码的字符串,并将其存储在变量中。mergePDFsMergeMultiplePDFbase64PDFmergePDFsmergePDFs
现在,构造 MimeType 的响应有效载荷。 解码 base64 编码的合并 PDF 并将其传递到内容字段中。如上图所示进行设置。multipart/form-dataContent-Typeapplication/pdf
步骤 7
将 MimeType 设置为 application/pdf。这会将合并的 PDF 作为 pdf 发送作为响应。您还可以将此有效负载存储在 SFTP 输出目录中。
输入 PDF
PDF1格式
PDF2格式
输出 PDF
合并的 PDF
合并的 PDF 将包含每个 PDF 包含的所有页面的总和。