在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理)

📅 2026/7/2 3:10:09
在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理)
环境准备在开始代码实现之前我们需要先搭建好开发环境。由于我们要处理复杂的 PDF 结构Spire.PDF 作为一个稳定且功能齐全的第三方库可以极大提高效率。你可以通过 Maven 仓库轻松引入 Spire.PDF。在你的pom.xml文件中添加以下配置repositories repository idcom.e-iceblue/id namee-iceblue/name urlhttps://repo.e-iceblue.cn/repository/maven-public//url /repository /repositories dependencies dependency groupIde-iceblue/groupId artifactIdspire.pdf/artifactId version12.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调用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); } }代码步骤解析加载源文件通过循环遍历数组为每一个源文件创建一个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);