假设存在这样一种情况,您必须将多个 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 类,并创建两个静态方法和:MergeMultiplePDF
mergeAndStorePDF
mergePDFs
爪哇岛
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 类中的注释,了解每一步。listPdfFileNames
mergedPdfFileName
mergePDFs
- 此静态方法接受一个参数 (),并将返回类型为字节数组。这个字节数组实际上是字节数组格式的合并 PDF 文件。阅读 Java 类中的注释,了解每一步。base64PDF
步骤 3
拖放 SFTP 列表连接器,并在 SFTP 配置中添加 SFTP 凭据。将目录路径和文件名模式添加为 .这将从属性文件中提到的路径中检索所有 PDF 文件。{*.pdf}
步骤 4
接下来,将变量初始化为空白数组。此变量将包含所有 base64 编码的 PDF 字符串。在此之后添加一个选择组件,以检查有效负载是否为空(即,SFTP 列表连接器是否选取了任何文件)。如果未检索到任何文件,则只需记录一条消息“未找到文件”。否则,请使用组件循环访问检索到的所有 PDF 文件。base64PDF
[]
For-Each
步骤 5
接下来,如上图所示阅读每个 PDF,对其进行编码,并将其作为 base64 编码的字符串存储在变量中。 使用如下所示的方法对 PDF 进行编码。base64PDF
toBase64()
dw::core::Binaries library
步骤 6
接下来,调用类的静态方法。 将 base64 编码的 PDF 字符串列表(存储在变量中)作为参数传递给该方法。 该方法将以字节数组格式返回串联的 PDF。将该字节数组编码为 base64 编码的字符串,并将其存储在变量中。mergePDFs
MergeMultiplePDF
base64PDF
mergePDFs
mergePDFs
现在,构造 MimeType 的响应有效载荷。 解码 base64 编码的合并 PDF 并将其传递到内容字段中。如上图所示进行设置。multipart/form-data
Content-Type
application/pdf
步骤 7
将 MimeType 设置为 application/pdf。这会将合并的 PDF 作为 pdf 发送作为响应。您还可以将此有效负载存储在 SFTP 输出目录中。
输入 PDF
PDF1格式
PDF2格式
输出 PDF
合并的 PDF
合并的 PDF 将包含每个 PDF 包含的所有页面的总和。