惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
WordPress大学
WordPress大学
Help Net Security
Help Net Security
Jina AI
Jina AI
Security Latest
Security Latest
Y
Y Combinator Blog
Project Zero
Project Zero
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
MyScale Blog
MyScale Blog
Cyberwarzone
Cyberwarzone
D
Docker
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
B
Blog
L
LangChain Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
The Hacker News
The Hacker News
C
Check Point Blog
L
Lohrmann on Cybersecurity
V2EX - 技术
V2EX - 技术
S
Securelist
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
云风的 BLOG
云风的 BLOG
Latest news
Latest news
人人都是产品经理
人人都是产品经理
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Register - Security
The Register - Security
Webroot Blog
Webroot Blog
Simon Willison's Weblog
Simon Willison's Weblog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
AWS News Blog
AWS News Blog
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
小众软件
小众软件
T
Tailwind CSS Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
宝玉的分享
宝玉的分享
O
OpenAI News

博客园 - E-iceblue

Python 拆分 Excel 文件:使用 Spire.XLS 实现按工作表、行、列和条件拆分 如何使用 Python 快速将 Excel 转换为 XML 文件 Python 办公自动化:Word 文档加密与权限控制实战 在 Python 中快速锁定 Excel 单元格与行列 使用 Python 在 Word 文档中添加或删除文本框 如何使 PDF 可编辑 - Python 教程详解 将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化) Python 办公自动化:如何轻松调整 Word/PDF 页面大小为 Legal 尺寸 数字签名 vs 电子签名:区别与如何在文件中插入数字签名 Python 教程:快速复制 Excel 工作表 如何对比 Excel 两列数据的不同:从基础操作到 Python 自动化 如何提取 Word 文档中的表格并导出为 Excel(Python 教程) 使用 Python 在 PowerPoint 中添加或移除背景图和背景颜色 在 Python 中自动化转化 Markdown 为 HTML 【详细教程】 Python 控制 PDF 页面大小、页边距、页面方向与缩放 Python 办公自动化:快速将 HTML 转换为 PDF 格式 在 Python 中给 PDF 设置背景图或背景色 在 Python 中转换 XML 为 PDF 文档:基础转换与转换设置 在 Python 中对比 Word 文档:自动生成修订报告【教程向】 Excel 删除空白行的 5 种方法 【手动与 Python 自动化】 删除 Excel 表格中的重复行 【4 种实用方法】 从纯文本到精美文档:TXT 转 PDF 的三种高效方案 Python 实现 PDF 表单域的自动化创建与智能填充 PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET) 为什么生成的条形码扫不出来?从静区、分辨率和色彩三个方向解析条码识别率 Excel vs CSV:在系统数据处理中该如何选择?(附格式转换代码示例) 【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现 零成本实现文档智能:本地化 OCR 提取与 AI 处理全流程实战 PPT 智能提取与分析实战:把演示文档变成结构化数据 为什么 PDF 文本能看到,却提取不到?从开发者角度解析与解决方案 PDF 文件为什么打不开?常见原因与解决思路 PDF vs PDF/A:区别、场景与常用转换方法(2026 全面解读) 使用 Java 将 PowerPoint 转换为 PDF 的完整指南 如何在 Python 中轻松添加、隐藏和删除幻灯片
在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理)
E-iceblue · 2026-04-27 · via 博客园 - E-iceblue

无论是需要将零散的业务报告汇总,还是将多份合同扫描件整合成一个文件,掌握合并 PDF 的技巧都是提升办公效率的必备技能。本文将介绍如何在 Java 中使用 Spire.PDF 库高效合并 PDF 文件。我们从基础的文件合并出发,进阶到特定页面的提取合并,并针对合并过程中涉及的加密处理、体积压缩等问题提供有效的解决方案。

环境准备

在开始代码实现之前,我们需要先搭建好开发环境。由于我们要处理复杂的 PDF 结构,Spire.PDF 作为一个稳定且功能齐全的第三方库可以极大提高效率。

你可以通过 Maven 仓库轻松引入 Spire.PDF。在你的 pom.xml 文件中添加以下配置:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>12.4.4</version>
    </dependency>
</dependencies>

也可以下载安装包,手动将 Spire.PDF 添加到项目中。此外该组件还提供免费版,适合用于小型项目。

在 Java 中合并 PDF 的两种常见情景

在处理 PDF 合并时,我们通常面临两种场景:一种是直接将几个文档头尾相接;另一种则是像拼图一样,只提取每个文档中的特定页面进行组合。下面我们针对两种不同的情况分别来讲解如何借助 Spire.PDF 来完成 PDF 组合。

快速合并多个完整 PDF 文档

如果你手头有几个完整的 PDF 文件需要按顺序连在一起,Spire.PDF 提供了一个非常高效的方法,只需一行核心代码即可完成。

import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfDocumentBase;

public class MergePdfs {
    public static void main(String[] args) {
        // 获取待合并的PDF文档路径
        String[] files = new String[] {"/示例文档1.pdf", "/示例文档2.pdf", "/示例文档3.pdf"};

        // 合并这些PDF文档
        PdfDocumentBase pdf = PdfDocument.mergeFiles(files);

        // 保存合并后的PDF文件
        pdf.save("/output/合并PDF文档.pdf", FileFormat.PDF);
    }
}

合并 PDF 文件

代码步骤解析:

  • 准备数据源: 定义一个字符串数组,按顺序存放所有需要合并的源文件路径。
  • 合并 PDF: 调用 PdfDocument.mergeFiles(files) 方法。该方法会自动按数组索引顺序读取文件并合并。
  • 持久化保存: 调用 save() 方法保存合并结果,并指定输出格式为 PDF。

精确合并不同 PDF 文档的指定页面

在实际工作中,我们可能不需要整份文档。例如,只需要 A 文档的封面、B 文档的正文以及 C 文档的盖章页。这时候,我们需要通过页面插入的方式来控制合并结果。

import com.spire.pdf.PdfDocument;

public class MergeSelectedPages {
    public static void main(String[] args) {
        // 获取待合并的PDF文档路径
        String[] files = new String[] {"Sample1.pdf", "Sample2.pdf", "Sample3.pdf"};

        // 创建PdfDocument类型的数组
        PdfDocument[] pdfs = new PdfDocument[files.length];

        // 遍历并加载文档
        for (int i = 0; i < files.length; i++) {
            pdfs[i] = new PdfDocument(files[i]);
        }

        // 创建一个新的PDF文档容器
        PdfDocument pdf = new PdfDocument();

        // 将不同PDF中的指定页面插入到新PDF中
        pdf.insertPage(pdfs[0], 0);             // 插入第一个文件的第1页
        pdf.insertPageRange(pdfs[1], 1, 3);     // 插入第二个文件的第2到4页
        pdf.insertPage(pdfs[2], 0);             // 插入第三个文件的第1页

        // 保存合并后的PDF文件
        pdf.saveToFile("合并指定页面.pdf");
    }
}

合并 PDF 文件指定页面

代码步骤解析:

  • 加载源文件: 通过循环遍历数组,为每一个源文件创建一个 PdfDocument 实例。
  • 初始化容器: 创建一个新的 PdfDocument 对象 pdf,用来存放合并结果。
  • 按需提取:
    • insertPage(sourceDoc, index):用于提取单页(注意索引从 0 开始)。
    • insertPageRange(sourceDoc, start, end):用于批量提取一个范围内的页面,避免了写循环的麻烦。
  • 输出结果: 最后调用 saveToFile() 将合并后的结果保存为 PDF 文档。

进阶实战与避坑指南

学会了基础合并逻辑后,你可能会在实际运用时遇到一些棘手问题:比如文件加密了怎么办?合并后的文件太大发不出去怎么办?如何给合并后的文件统一标识?本章将逐一攻克这些难点。

合并前的安全处理

如果源文档受到密码保护,直接尝试读取会触发异常。在合并这类文件前,必须先进行解锁操作。

// 使用密码载入加密的PDF文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("加密.pdf", "password");

// 解密文档,确保后续合并操作不会因权限限制失败
pdf.decrypt();

合并过程中的文件压缩

多个 PDF 合并后,体积往往会成倍增长。为了节省存储空间和传输带宽,我们可以利用 PdfCompressor 开启内容压缩模式,这能显著减小生成文件的体积。

import com.spire.pdf.conversion.compression.PdfCompressor;

// 针对合并后的成品进行压缩
PdfCompressor compressor = new PdfCompressor("示例.pdf");

// 启用文档内容压缩,移除不必要的元数据并优化资源
compressor.getOptions().setCompressContents(true);

// 压缩并保存
compressor.compressToFile("内容压缩.pdf");

为合并后的文档添加统一水印

为了确保文档的版权或合规性,合并后的文件通常需要覆盖一层水印。我们可以遍历最终文档的所有页面,统一绘制图片水印。

// 循环遍历所有页面以插入水印
for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfPageBase page = pdf.getPages().get(i);
    
    // 获取页面尺寸用于计算水印居中坐标
    float pageWidth = (float)page.getActualSize().getWidth();
    float pageHeight = (float)page.getActualSize().getHeight();
    
    // 设置水印图片的透明度(0.0完全透明 - 1.0不透明)
    page.getCanvas().setTransparency(0.3f);
    
    // 在页面中心位置绘制水印
    page.getCanvas().drawImage(image, pageWidth/2 - imageWidth/2, pageHeight/2 - imageHeight/2, imageWidth, imageHeight);
}

结语

通过本文的介绍,我们可以看到,在 Java 中合并 PDF 不仅仅是简单的页面叠加,更涉及到权限管理、体积优化和内容二次加工等实际需求。借助 Spire.PDF 等成熟的工具库,开发者可以用极少的代码量实现复杂的文档处理逻辑,显著提升工作效率。