使用Java合并PDF文档

简介: 使用Java合并PDF文档

本文将介绍如何使用Java中的iText库来合并多个PDF文档为一个。我们将使用iText库提供的功能来创建新的PDF文档,并将现有的PDF页面添加到其中。我们将展示如何使用Maven构建项目,并添加所需的依赖项。接下来,我们将提供一个示例代码,演示如何合并PDF文档。

添加Maven依赖

首先,我们需要在项目的pom.xml文件中添加iText库的依赖项。请确保你的项目已经使用了Maven进行管理。在dependencies标签中添加以下代码:

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13</version>
    </dependency>
</dependencies>

这将告诉Maven下载并引入iText库,以便我们可以在项目中使用它。

编写合并PDF的工具类

现在我们将编写一个工具类,其中包含合并PDF文档的方法。我们将使用iText库来实现这个功能。以下是一个名为PdfMergeUtil的工具类的代码:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class PdfMergeUtil {

    /**
     * 合并多个PDF文档为一个
     *
     * @param sourceFiles 要合并的PDF文件路径列表
     * @param outputFile  合并后的PDF文件输出路径
     * @throws IOException       如果读取文件或写入文件时发生错误
     * @throws DocumentException 如果创建PDF文档时发生错误
     */
    public static void mergePdfFiles(List<String> sourceFiles, String outputFile) throws IOException, DocumentException {
        Document document = new Document();

        PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputFile));
        document.open();

        for (String sourceFile : sourceFiles) {
            PdfReader reader = new PdfReader(sourceFile);
            int totalPages = reader.getNumberOfPages();

            for (int page = 1; page <= totalPages; page++) {
                PdfImportedPage importedPage = copy.getImportedPage(reader, page);
                copy.addPage(importedPage);
            }

            reader.close();
        }

        document.close();
    }
}

在这个工具类中,我们定义了一个名为mergePdfFiles的方法,它接受两个参数:一个包含要合并的PDF文件路径的列表和合并后的PDF文件的输出路径。

我们首先创建一个Document对象,并使用PdfCopy类来将页面添加到新的PDF文件中。然后,我们遍历输入的PDF文件列表,对每个文件进行处理。

对于每个源文件,我们使用PdfReader类来读取文件,并获取文件中的页面总数。然后,我们使用PdfCopy对象的addPage方法将每个页面导入到新的PDF文件中。

最后,我们关闭源文件的PdfReader对象和新的PDF文件的Document对象,完成合并操作。

编写测试类

为了验证我们的工具类是否正常工作,我们编写一个测试类来合并一些示例PDF文件。以下是一个示例测试类的代码:

import com.itextpdf.text.DocumentException;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class PdfMergeUtilTest {

    @Test
    void mergePdfFiles() {
        List<String> sourceFiles = new ArrayList<>();
        sourceFiles.add("path/to/source1.pdf");
        sourceFiles.add("path/to/source2.pdf");
        String outputFile = "path/to/output.pdf";

        try {
            PdfMergeUtil.mergePdfFiles(sourceFiles, outputFile);
            // 验证输出文件是否存在
            assertTrue(Files.exists(Paths.get(outputFile)));
        } catch (IOException | DocumentException e) {
            fail("合并PDF文件时发生错误:" + e.getMessage());
        }
    }
}


在这个测试类中,我们使用了JUnit 5的测试框架来编写一个名为mergePdfFiles的测试方法。在该方法中,我们创建了一个包含要合并的两个PDF文件路径的列表,并指定了输出文件路径。

然后,我们调用PdfMergeUtil工具类的mergePdfFiles方法来合并PDF文件。在测试方法中,我们使用了JUnit 5的断言来验证合并操作的结果。我们使用assertTrue断言来验证合并后的输出文件是否存在。

如果合并操作出现异常,我们使用fail断言来标记测试失败,并输出异常信息。

请确保在运行测试之前替换sourceFilesoutputFile的值为你自己的文件路径。

完整示例代码

下面是完整的示例代码,包括工具类和测试类:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class PdfMergeUtil {

    /**
     * 合并多个PDF文档为一个
     *
     * @param sourceFiles 要合并的PDF文件路径列表
     * @param outputFile  合并后的PDF文件输出路径
     * @throws IOException       如果读取文件或写入文件时发生错误
     * @throws DocumentException 如果创建PDF文档时发生错误
     */
    public static void mergePdfFiles(List<String> sourceFiles, String outputFile) throws IOException, DocumentException {
        Document document = new Document();

        PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputFile));
        document.open();

        for (String sourceFile : sourceFiles) {
            PdfReader reader = new PdfReader(sourceFile);
            int totalPages = reader.getNumberOfPages();

            for (int page = 1; page <= totalPages; page++) {
                PdfImportedPage importedPage = copy.getImportedPage(reader, page);
                copy.addPage(importedPage);
            }

            reader.close();
        }

        document.close();
    }
}

import com.itextpdf.text.DocumentException;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class PdfMergeUtilTest {

    @Test
    void mergePdfFiles() {
        List<String> sourceFiles = new ArrayList<>();
        sourceFiles.add("path/to/source1.pdf");
        sourceFiles.add("path/to/source2.pdf");
        String outputFile = "path/to/output.pdf";

        try {
            PdfMergeUtil.mergePdfFiles(sourceFiles, outputFile);
            // 验证输出文件是否存在
            assertTrue(Files.exists(Paths.get(outputFile)));
        } catch (IOException | DocumentException e) {
            fail("合并PDF文件时发生错误:" + e.getMessage());
        }
    }
}


总结

本文介绍了如何使用Java和iText库合并多个PDF文档为一个。我们通过添加Maven依赖来引入iText库,并编写了一个工具类来实现合并功能。我们还编写了一个测试类来验证合并操作的结果。

希望本文能够对你了解如何使用Java合并PDF文档有所帮助!

相关文章
|
7月前
|
XML 人工智能 Java
java实现PDF 电子签章
本文介绍了使用Java将Word文档转换为PDF并添加水印、签名和盖章的方法。通过Apache POI读取Word内容,结合OpenPDF生成PDF文件,并利用PdfPageEvent接口实现页面水印与签名功能。代码示例清晰展示了转换流程及关键实现细节。
506 0
|
10月前
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
5月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
798 0
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
1029 5
|
8月前
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
199 4
|
11月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1260 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
DeepSeek + Xmind,1分钟自动把pdf/word文档转成思维导图
DeepSeek与Xmind结合,1分钟将PDF、Word文档转换为思维导图。只需四步:上传文档至DeepSeek,请求转换为Markdown格式,保存文件并修改后缀为.md,最后导入Xmind生成思维导图。轻松驾驭复杂文档,适用于学习笔记、工作报告、项目规划等场景,大幅提升效率!
|
11月前
|
人工智能 文字识别 自然语言处理
1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!
Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。
1338 1
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!

热门文章

最新文章