【干货来了】如何使用 MuleSoft 合并多个 PDF

假设存在这样一种情况,您必须将多个 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

f9c66229bc3b60e6f4ebc7f8995da806.png

拖放 SFTP 列表连接器,并在 SFTP 配置中添加 SFTP 凭据。将目录路径和文件名模式添加为 .这将从属性文件中提到的路径中检索所有 PDF 文件。{*.pdf}

步骤 4

420ef53702b71bcc53f4bfc0f3670271.png

接下来,将变量初始化为空白数组。此变量将包含所有 base64 编码的 PDF 字符串。在此之后添加一个选择组件,以检查有效负载是否为空(即,SFTP 列表连接器是否选取了任何文件)。如果未检索到任何文件,则只需记录一条消息“未找到文件”。否则,请使用组件循环访问检索到的所有 PDF 文件。base64PDF[]For-Each

步骤 5

13932c086e15fa11d93cb9aa84164757.png

接下来,如上图所示阅读每个 PDF,对其进行编码,并将其作为 base64 编码的字符串存储在变量中。 使用如下所示的方法对 PDF 进行编码。base64PDFtoBase64()dw::core::Binaries library

f46c54a2f5d1c95d13d808fa9c8c27fb.png

步骤 6

接下来,调用类的静态方法。 将 base64 编码的 PDF 字符串列表(存储在变量中)作为参数传递给该方法。 该方法将以字节数组格式返回串联的 PDF。将该字节数组编码为 base64 编码的字符串,并将其存储在变量中。mergePDFsMergeMultiplePDFbase64PDFmergePDFsmergePDFsfa740c4b51a5785291b2bd59d7c7df85.png

现在,构造 MimeType 的响应有效载荷。 解码 base64 编码的合并 PDF 并将其传递到内容字段中。如上图所示进行设置。multipart/form-dataContent-Typeapplication/pdf

步骤 7

将 MimeType 设置为 application/pdf。这会将合并的 PDF 作为 pdf 发送作为响应。您还可以将此有效负载存储在 SFTP 输出目录中。

847ef5f66700c17c769a3466182eb33c.png

输入 PDF

PDF1格式

dd522659ce97223e396d5d0358be8133.png


PDF2格式

1afd7322a251a3a8f883df2d217b567b.png


输出 PDF

合并的 PDF

832823a9ee34a8ba2aa0f652ec9d85f7.png

合并的 PDF 将包含每个 PDF 包含的所有页面的总和。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨曦_子画

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值