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

简介: 【干货来了】如何使用 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

image.png

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

步骤 4

image.png

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

步骤 5

image.png

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

步骤 6 image.png

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

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

步骤 7

image.png

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

输入 PDF

PDF1格式

image.png

PDF2格式

image.png

输出 PDF

image.png

合并的 PDF

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


目录
相关文章
|
2月前
|
运维 JavaScript BI
SaaS ERP系统源代码,完美运行的项目源码
这是一款基于SpringBoot+Vue的SaaS ERP源码系统,覆盖采购、销售、生产、财务等全业务模块,支持自定义流程、报表与表单,具备软件著作权,可商用及二次开发,专为中小企业提供灵活、易用、云端化的企业管理解决方案。
161 2
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
1307 1
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
824 23
|
缓存 Linux
如何检查 Linux 内存使用量是否耗尽?
何检查 Linux 内存使用量是否耗尽?
853 58
|
安全 算法 Oracle
【Java用法】加密异常----Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
【Java用法】加密异常----Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
1615 0
|
SQL 关系型数据库 MySQL
"告别蜗牛速度!解锁批量插入数据新姿势,15秒狂插35万条,数据库优化就该这么玩!"
【8月更文挑战第11天】在数据密集型应用中,高效的批量插入是性能优化的关键。传统单条记录插入方式在网络开销、数据库I/O及事务处理上存在明显瓶颈。批量插入则通过减少网络请求次数和数据库I/O操作,显著提升效率。以Python+pymysql为例,通过`executemany`方法,可实现在15秒内将35万条数据快速入库,相较于传统方法,性能提升显著,是处理大规模数据的理想选择。
1735 5
|
前端开发
typora自定义主题
typora自定义主题
536 2
|
监控 定位技术 数据中心
住宅ip与数据中心ip代理的区别是什么
代理IP分为住宅IP和数据中心IP。住宅IP由ISP提供,更难被网站检测,适合需要高匿名度和广泛地理位置的业务,如广告发布和价格比较。数据中心IP源自服务器,虽速度快但易被识别,常用于数据抓取和SEO。住宅IP因其真实用户特性,较少被封锁,但成本较高。选择类型应基于具体使用场景,如小规模数据抓取可选数据中心IP。
|
JavaScript 前端开发
解决 vue 路由报错 Cannot read property 'beforeRouteEnter' of undefined
解决 vue 路由报错 Cannot read property 'beforeRouteEnter' of undefined
|
Java 关系型数据库 微服务
论后端未来发展及学习路线(详细讲解)
论后端未来发展及学习路线(详细讲解)