Java合并PDF文档的三种常用方式总结

 更新时间:2024年12月07日 10:32:15   作者:God_M  
这篇文章主要给大家介绍了关于Java合并PDF文档的三种常用方式,文中介绍的方式分别是Apache PDFBox、Spire.PDF(IceBlue)和iText PDF,每种方式都有其对应的pom.xml代码示例,,要的朋友可以参考下

前言

Java常用的三种合并pdf的方式

合并PDF

1.pdfbox合并pdf

apache的pdfbox

pom.xml

 <dependency>
     <groupId>org.apache.pdfbox</groupId>
     <artifactId>pdfbox</artifactId>
     <version>2.0.26</version>
 </dependency>

代码示例

// 添加待合并文件
for (ZipUtil.RelativeFile sourcePdf : fileRefers) {
   long time1 = System.currentTimeMillis();
   log.info("开始添加{}, 大小:{}MB, 路径:{}", (++index),
   FileUtils.newFile(sourcePdf.getFilePath()).length() / 1024 / 1024, sourcePdf.getFilePath());
   try (PDDocument document = PDDocument.load(FileUtils.newFile(sourcePdf.getFilePath()), MemoryUsageSetting.setupTempFileOnly());
        ) {
            // 页面大纲(1级)
            String newName = FileUtils.newFile(sourcePdf.getRelativePath()).getName();
            newName = StringUtils.trimToEmpty(newName).replace("." + FilenameUtils.getExtension(newName), "");
            PdfBoxBookmark boxData = new PdfBoxBookmark(newName, totalPage);

            PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
            if (outline != null) {
                buildBookMark(outline, boxData, totalPage);
            }
            /
            allBookList.add(boxData);

            mergePdf.addSource(sourcePdf.getFilePath());

            // 更新总页码
            totalPage += document.getNumberOfPages();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("合并pdf失败:{}",e);
            throw new BaseException("文件不存在:" + sourcePdf.getFilePath());
        }
        log.info("结束添加,添加后,总{}页:{},耗费:{}秒",totalPage,
                sourcePdf.getFilePath(), (System.currentTimeMillis() - time1) / 1000);
    }

    // 设置合并后的pdf文件路径
    mergePdf.setDestinationFileName(destFilePath);

    // 合并pdf
    try {
        mergePdf.setDocumentMergeMode(PDFMergerUtility.DocumentMergeMode.OPTIMIZE_RESOURCES_MODE);
        mergePdf.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
    } catch (IOException e) {
        e.printStackTrace();
        throw new BaseException("合并发生异常");
    }

2.spire.pdf

e-iceblue的spire.pdf

pom.xml

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf</artifactId>
    <version>9.5.6</version>
</dependency>

代码示例:

String[] files = new String[] {
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\error-file.pdf",
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\111.pdf"};

//Merge documents and return an object of PdfDocumentBase
PdfDocumentBase pdf = PdfDocument.mergeFiles(files);

//Save the result to a PDF file
pdf.save("C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF222.pdf", FileFormat.PDF);

3.itextpdf

itextpdf

pom.xml

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.4</version>
</dependency>

代码示例:

String[] pdfs = new String[] {
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0001.pdf",
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0002.pdf"};

String outputPdf = "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF333-.pdf"; // 合并后的PDF文件

try {
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPdf));
    document.open();

    for (String pdf : pdfs) {
        PdfReader reader = new PdfReader(pdf);
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            document.newPage();
            copy.addPage(copy.getImportedPage(reader, i));
        }
        reader.close();
    }

    document.close();
    System.out.println("PDFs merged successfully.");
} catch (Exception e) {
    e.printStackTrace();
}

总结

1.apache的pdfbox和itextpdf是免费的,e-iceblue的spire.pdf是收费的而且价格不菲,无授权会有水印,虽然e-iceblue有免费的spire.pdf.free但有页数限制。

2.apache的pdfbox和e-iceblue的spire.pdf对pdf文档的容错不高,如果pdf文档是通过三方软件生成或编辑过的(可能会存在一定问题,但是浏览器打开或wps打开会容错显示),在合并时会抛文档的异常。但是itextpdf会进行容错修复并合并成功。

所以个人推荐使用itextpdf。

到此这篇关于Java合并PDF文档的三种常用方式的文章就介绍到这了,更多相关Java合并PDF文档方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud微服务架构实战之微服务治理功能的实现

    SpringCloud微服务架构实战之微服务治理功能的实现

    这篇文章主要介绍了SpringCloud微服务架构实战之微服务治理,这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、服务降级和故障转移、链路跟踪、服务监控等,需要的朋友可以参考下
    2022-02-02
  • Java使用JMeter进行高并发测试

    Java使用JMeter进行高并发测试

    软件的压力测试是一种保证软件质量的行为,本文主要介绍了Java使用JMeter进行高并发测试,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringBoot如何获取客户端的IP地址

    SpringBoot如何获取客户端的IP地址

    这篇文章主要介绍了SpringBoot如何获取客户端的IP地址问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java对ArrayList排序代码示例

    java对ArrayList排序代码示例

    本文通过代码示例给大家介绍java对arraylist排序,代码简洁易懂,感兴趣的朋友一起学习吧
    2015-11-11
  • 初步解析Java中AffineTransform类的使用

    初步解析Java中AffineTransform类的使用

    这篇文章主要介绍了Java中AffineTransform类的使用,AffineTransform类经常被用来处理图片,需要的朋友可以参考下
    2015-10-10
  • SpringBoot实战之处理异常案例详解

    SpringBoot实战之处理异常案例详解

    这篇文章主要介绍了SpringBoot实战之处理异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • SpringBoot拦截器实现项目防止接口重复提交

    SpringBoot拦截器实现项目防止接口重复提交

    基于SpringBoot框架来开发业务后台项目时,接口重复提交是一个常见的问题,本文主要介绍了SpringBoot拦截器实现项目防止接口重复提交,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 详解spring mvc(注解)上传文件的简单例子

    详解spring mvc(注解)上传文件的简单例子

    本篇文章主要介绍了spring mvc(注解)上传文件的简单例子,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • MyBatis官方代码生成工具给力(解放双手)

    MyBatis官方代码生成工具给力(解放双手)

    这篇文章主要介绍了MyBatis官方代码生成工具给力(解放双手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Netty序列化深入理解与使用

    Netty序列化深入理解与使用

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象
    2022-08-08

最新评论