如何使用 Java 合并两个 PDF 文件

This article was translated from English: Does it need improvement?
Translated
View the article in English

将 PDF 文档合并为单个文件是文档管理流程中常见的需求。 汇总月度报告、组装多联表格以及捆绑发票都是常见的场景。 IronPDF for Java 将该操作简化为一次方法调用:PdfDocument.merge()。 向其输入两个或多个已加载的文档,即可获得一个合并后的 PDF 文件,其中所有格式、字体和嵌入的图片均被精确保留。

本指南将详细介绍四种最实用的合并场景:合并动态生成的 PDF、合并磁盘上的现有文件、使用基于列表的方法处理更大批量文件,以及控制最终文档中的页面顺序。

快速入门:在 Java 中合并 PDF 文件

  1. 将 IronPDF 依赖项添加到您的 Maven 配置中 pom.xml
  2. 导入 com.ironsoftware.ironpdf.PdfDocument
  3. 使用 PdfDocument.fromFile() 加载源文件
  4. 调用 PdfDocument.merge(pdf1, pdf2) 以生成合并文档
  5. 将结果保存为 merged.saveAs()

```java {title="快速入门:基础 PDF 合并"} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/quickstart-merge.java import com.ironsoftware.IronPdf.PdfDocument; import java.nio.file.Paths;

// 从磁盘加载两个现有的 PDF 文档 PdfDocument pdf1 = PdfDocument.fromFile(Paths.get("document1.pdf")); PdfDocument pdf2 = PdfDocument.fromFile(Paths.get("document2.pdf"));

// 合并为单个文档; 格式和图片均予以保留 PdfDocument merged = PdfDocument.merge(pdf1, pdf2);

// 将合并后的 PDF 写入磁盘 merged.saveAs(Paths.get("merged-output.pdf"));


<div class="hsg-featured-snippet">
<h3>简易工作流程(5个步骤)</h3>

1. 将 IronPDF 添加为 Maven 或 Gradle 依赖项
2. 导入 `com.ironsoftware.ironpdf.PdfDocument`
3. 使用 `PdfDocument.fromFile(Paths.get("file.pdf"))` 加载每个 PDF
4. 调用 `PdfDocument.merge(pdf1, pdf2)`,或传递 `PdfDocument[]` 数组以处理批量操作
5. 将合并后的结果保存为 `merged.saveAs(Paths.get("output.pdf"))`
</div>

## 在 Java 中合并 PDF 文件有哪些先决条件?

在编写任何代码之前,请确认以下四项要求已满足:

1. 已安装 **Java 8 或更高版本**,并设置了 `JAVA_HOME` 环境变量。 有关特定平台的操作说明,请参阅 [Java 下载和安装指南](https://www.java.com/en/download/help/download_options.html#windows)。
2. **一款 Java 集成开发环境**(本指南使用 [JetBrains IntelliJ IDEA](https://www.jetbrains.com/idea/download/#section=windows),但 [Eclipse](https://www.eclipse.org/downloads/) 同样适用)。
3. 在您的 IDE 中配置 **Maven 或 Gradle**。如果您是 Maven [新手,JetBrains](https://www.jetbrains.com/idea/guide/tutorials/marco-codes-maven/installing-maven/) 的[ Maven 安装指南](https://www.jetbrains.com/idea/guide/tutorials/marco-codes-maven/installing-maven/)涵盖了在 IntelliJ 中的配置方法。
4. **将 IronPDF 库**添加为项目依赖项。 《[IronPDF for Java 安装指南](https://ironpdf.com/java/docs/)》详细介绍了 Maven 和 Gradle 两种安装方法。

请注意IronPDF for Java 支持 Java 8 及更高版本。 无需将现有项目升级到新版 JDK 即可开始使用。)}]
## 如何安装 IronPDF for Java? IronPDF for Java 通过 [Maven Central](https://search.maven.org) 分发,因此只需几行配置代码即可将其添加到您的项目中。 无需手动下载 JAR 文件。 打开 IntelliJ IDEA,通过**"文件"-&gt;"新建"-&gt;"项目**"创建一个新的 Maven 项目,并选择 Maven 作为构建系统。 ![IntelliJ IDEA](/static-assets/ironpdf-java/howto/how-to-merge-two-pdf-files-java-tutorial/how-to-merge-two-pdf-files-java-tutorial-1.webp) 为项目命名并点击**"完成**"。 IntelliJ 会在生成项目结构后自动打开 `pom.xml`。 ![IDE 中的](/static-assets/ironpdf-java/howto/how-to-merge-two-pdf-files-java-tutorial/how-to-merge-two-pdf-files-java-tutorial-2.webp) 请在 `pom.xml` 的 `<dependencies>` 部分内添加以下依赖项代码块。 请务必[在 Maven Central 上](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf)查看 [IronPDF 的最新版本](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf),并将版本字符串替换为当前版本。 ```xml {title=&quot;pom.xml: IronPDF 依赖项&quot;} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/pom-dependency.xml <dependency> <groupId>com.ironsoftware</groupId> <artifactId>ironpdf</artifactId> <version>2024.9.1</version> </dependency>

IntelliJ IDEA 显示包含 IronPDF 项目配置和 Java 10 编译器设置的 Maven pom.xml 文件

保存 pom.xml 后,编辑器右上角会出现一个小型的同步图标。 点击此处以触发 Maven 依赖项的下载。 根据您的网络连接速度,此过程通常需要 15 秒至几分钟,并会下载 IronPDF 及其所有必需的传递依赖项。

Maven pom.xml 文件,展示了 IronPDF Java 依赖项配置,包含 groupId、artifactId 和 version 标签

提示Gradle 用户可以在其 build.gradle 依赖项块中添加 implementation 'com.ironsoftware:ironpdf:2024.9.1' 代替。 (同一 Maven Central 构建产物适用于这两种构建系统。

如何创建和合并新的 PDF 文档?

当源内容在运行时生成(来自 HTML 模板、数据库记录或用户输入)时,工作流程是先将每个片段渲染为 PdfDocument,然后将其合并。

PdfDocument.renderHtmlAsPdf() 将 HTML 字符串在内存中转换为 PDF。 每次调用都会生成一个独立的文档对象,该对象可直接传递给 merge(),无需将任何中间文件写入磁盘。

合并前渲染 HTML 部分

下面的示例将两个独立的 HTML 字符串加载到内存中,并将其合并为一个文档。 此模式适用于报表生成器、发票Builder,以及任何通过编程方式从模板或数据库行中组装内容的系统。

```java {title="合并动态生成的 PDF"} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/merge-html-pdfs.java import com.ironsoftware.IronPdf.PdfDocument; import java.io.IOException; import java.nio.file.Paths;

public class Main { public static void main(String[] args) throws IOException { // 每个文档部分的 HTML 内容 String htmlA = "

First part of the report.

"; String htmlB = "

Second part of the report.

";

    // 将每个 HTML 字符串在内存中渲染为 PDF —— 无需写入磁盘
    PdfDocument pdfA = PdfDocument.renderHtmlAsPdf(htmlA);
    PdfDocument pdfB = PdfDocument.renderHtmlAsPdf(htmlB);

    // 将两份文档合并为一个PDF文件
    PdfDocument merged = PdfDocument.merge(pdfA, pdfB);

    // 保存合并后的结果
    merged.saveAs(Paths.get(&quot;assets/merged.pdf&quot;));
}

}


合并后的输出按参数顺序拼接页面:`pdfA` 页面出现在 `pdfB` 页面之前。 如需了解 HTML 渲染引擎的完整操作指南,请参阅 [IronPDF for Java](https://ironpdf.com/java/tutorials/html-to-pdf/) 的 [HTML 转 PDF 教程](https://ironpdf.com/java/tutorials/html-to-pdf/)。

![显示已成功合并文档的PDF阅读器——左侧为第一个PDF,右侧为带有导航控件的第二个PDF](/static-assets/ironpdf-java/howto/how-to-merge-two-pdf-files-java-tutorial/how-to-merge-two-pdf-files-java-tutorial-5.webp)

重要 `renderHtmlAsPdf()` 调用使用基于 Chromium 的渲染引擎。全面支持 CSS、网页字体和内联图片——输出效果与浏览器显示完全一致。
## 如何合并现有的 PDF 文件? 从磁盘加载 PDF 并将其合并的操作遵循相同的模式,即使用 `PdfDocument.fromFile()` 将每个文件读入内存,然后将对象传递给 `merge()`。 此方案适用于源文档已存在的任何工作流程——例如扫描的发票、导出的报告或从外部系统接收的文件。 IronPDF 会读取 PDF 结构并合并页面,且不会更改原始源文件。 ### 从磁盘加载和合并文件 ```java {title=&quot;合并磁盘上的现有 PDF 文件&quot;} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/merge-existing-files.java import com.ironsoftware.IronPdf.PdfDocument; import java.io.IOException; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws IOException { // 从磁盘加载两个现有的 PDF 文件 PdfDocument pdfA = PdfDocument.fromFile(Paths.get(&quot;assets/invoice-january.pdf&quot;)); PdfDocument pdfB = PdfDocument.fromFile(Paths.get(&quot;assets/invoice-february.pdf&quot;)); // 合并为一个文档 PdfDocument merged = PdfDocument.merge(pdfA, pdfB); // 写入合并后的输出内容 -- 原文保持不变 merged.saveAs(Paths.get(&quot;assets/invoices-q1.PDF&quot;)); } }

merge() 调用会生成一个新的 PdfDocument 对象; 既不修改 pdfA,也不修改 pdfB。 若需执行反向操作(即重新提取页面),请参阅 Java 版拆分 PDF 示例

显示合并文档的PDF阅读器,其中包含奖项功能页面和维基百科主页,展示PDF合并成功的效果

fromFile() 支持哪些文件格式?

PdfDocument.fromFile() 支持标准 .pdf 文件格式。 对于需要转换后才能合并的文档(例如 HTML 文件、图像文件或其他格式),请先使用适当的渲染方法(renderUrlAsPdf()) 生成 PdfDocument,再将该对象传递给 merge()

提示传递给 fromFile() 的路径可以是绝对路径,也可以是相对于工作目录的相对路径。 为确保跨平台兼容性,建议使用 Paths.get()(来自 java.nio.file)。}}]

Icon Quote related to fromFile() 支持哪些文件格式?

我最喜欢的这种库是 IronPDF。它允许快速高效地操作 PDF 文件。它还具有许多有价值的功能,比如导出为 PDF/A 格式和数字签名 PDF 文档。

Milan Jovanovic related to fromFile() 支持哪些文件格式?

Milan Jovanovic

微软MVP

查看案例研究
Icon Quote related to fromFile() 支持哪些文件格式?

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to fromFile() 支持哪些文件格式?

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to fromFile() 支持哪些文件格式?

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to fromFile() 支持哪些文件格式?

David Jones

首席软件工程师,Agorus Build

查看案例研究

如何合并两个以上的 PDF 文件?

PdfDocument.merge() 支持可变长度参数列表,因此从语法上讲,合并三到四个文档与合并两个文档并无区别。 对于动态大小的集合(即 PDF 数量在运行时确定),传递一个 PdfDocument[] 数组是更简洁的方法。

可变参数与基于列表的模式

以下两种写法产生的结果完全相同。 当文件数量固定时,请选择直接调用 varargs;若需通过编程方式构建集合,请采用列表转数组模式:

```java {title="合并四个 PDF 文件——可变参数与列表方法"} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/merge-multiple-files.java import com.ironsoftware.IronPdf.PdfDocument; import java.io.IOException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List;

public class Main { public static void main(String[] args) throws IOException { // 加载四个现有的 PDF 文件 PdfDocument pdfA = PdfDocument.fromFile(Paths.get("assets/chapter-1.pdf")); PdfDocument pdfB = PdfDocument.fromFile(Paths.get("assets/chapter-2.pdf")); PdfDocument pdfC = PdfDocument.fromFile(Paths.get("assets/chapter-3.pdf")); PdfDocument pdfD = PdfDocument.fromFile(Paths.get("assets/chapter-4.pdf"));

    // 模式 1:直接调用可变参数 -- 适用于文件数量固定的情况
    PdfDocument merged = PdfDocument.merge(pdfA, pdfB, pdfC, pdfD);
    merged.saveAs(Paths.get(&quot;assets/full-document.pdf&quot;));

    // 模式 2:先构建列表——当文件数量动态变化时推荐使用
    List<pdfdocument> pdfList = new ArrayList&lt;&gt;();</pdfdocument>
    pdfList.add(pdfA);
    pdfList.add(pdfB);
    pdfList.add(pdfC);
    pdfList.add(pdfD);

    PdfDocument mergedFromList = PdfDocument.merge(
        pdfList.toArray(new PdfDocument[0])
    );
    mergedFromList.saveAs(Paths.get(&quot;assets/full-document-v2.pdf&quot;));
}

}


重要输出页面的顺序必须与参数顺序完全一致。 如果文档顺序很重要——例如书籍的章节或表单的有序部分——请在调用 `merge()`.
之前对列表进行排序。)}] ### 如何扫描目录并合并所有 PDF 文件? 当在编译时无法确定输入文件集时,从目录中读取文件路径是列表模式的自然延伸。 下面的代码片段会从文件夹中收集所有 `.pdf` 文件,按文件名排序,并按顺序合并它们。 ```java {title=&quot;扫描目录并合并所有 PDF 文件&quot;} //:path=/static-assets/pdf/content-code-examples/how-to/how-to-merge-two-pdf-files-java-tutorial/merge-directory-pdfs.java import com.ironsoftware.IronPdf.PdfDocument; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) throws IOException { Path inputDir = Paths.get(&quot;assets/monthly-reports&quot;); // 从目录中收集所有 PDF 文件,并按文件名排序 List<path> pdfPaths = Files.list(inputDir)</path> .filter(p -&gt; p.toString().endsWith(&quot;.pdf&quot;)) .sorted(Comparator.comparing(Path::getFileName)) .collect(Collectors.toList()); // 将每个文件加载到 PdfDocument 中 List<pdfdocument> documents = new ArrayList&lt;&gt;();</pdfdocument> for (Path path : pdfPaths) { documents.add(PdfDocument.fromFile(path)); } // 合并所有文档并保存结果 PdfDocument combined = PdfDocument.merge( documents.toArray(new PdfDocument[0]) ); combined.saveAs(Paths.get(&quot;assets/annual-report.pdf&quot;)); } }

此模式可处理任意大小的文件夹。对于大型批次(50 个以上文件),建议分批加载并合并,以限制峰值内存使用,而非同时加载所有文件。

提示如果您的文件采用基于日期的命名方案(例如 2024-02.pdf),请使用自定义 ComparatorpdfPaths 进行排序。 (对于带零填充的月份数字,按字母顺序排序效果自然。

合并后,您可能需要进一步润色合并后的文档。 IronPDF for Java 支持添加自定义页眉和页脚应用水印,以及压缩最终输出文件,以便在交付前减小文件大小。

Java 中的 PDF 合并下一步该怎么做?

本指南介绍了使用 IronPDF for Java 的四种合并模式:在合并前将 HTML 内容渲染为 PDF、从磁盘加载并合并现有文件、使用列表处理可变长度的文档批次,以及扫描目录以自动合并所有 PDF 文件。 在所有情况下,PdfDocument.merge() 都会保留源文本的格式——字体、图片和页面布局将直接保留在输出中,无需任何额外配置。

若想进一步了解 IronPDF for Java 的功能,请参阅 Java 合并 PDF 教程以获取更多示例,或查阅如何在 Java 中对 PDF 进行数字签名,以便在合并后的输出文件中添加签名。 关于页面级操作(如重新排序、删除或提取单个页面),请参阅"删除特定页面"示例

准备在您的项目中尝试一下了吗? 立即开始免费试用——无需信用卡。 准备部署时,请查看适用于团队和企业用户的许可选项

常见问题解答

在 Java 中合并 PDF 文件的最简单方法是什么?

最简单的方法是IronPDF for Java的PdfDocument.merge(pdf1, pdf2)。 使用PdfDocument.fromFile(Paths.get("file.pdf"))加载每个文件,传递两个文件给merge(),并用merged.saveAs()保存结果。

在Java中使用IronPDF合并PDF的前提条件是什么?

您需要Java 8或更高版本,设置JAVA_HOME,一个Java IDE,如IntelliJ IDEA或Eclipse,配置Maven或Gradle,并将IronPDF依赖项添加到您的项目的pom.xmlbuild.gradle文件中。

我可以一次合并超过两个的PDF文件在Java中吗?

可以。 PdfDocument.merge()接受可变长度参数列表,因此您可以直接传递三个或更多PdfDocument对象。 对于动态集合,将List<PdfDocument>转换为数组,使用list.toArray(new PdfDocument[0]),并将其传递给merge()

在Java中合并PDF时如何控制页面顺序?

页面在输出中按传递给merge()的参数顺序出现。 如果您正在动态构建列表,请在调用merge()之前对其进行排序——例如,按文件名或文档元数据中的日期字段排序。

如何在Java中合并从HTML生成的PDF?

对每个HTML部分调用PdfDocument.renderHtmlAsPdf(htmlString)生成内存中的PdfDocument,然后将这些对象传递给PdfDocument.merge()。不写入中间文件到磁盘。

合并后我可以在Java中执行哪些额外的PDF操作?

合并后,IronPDF for Java支持添加页眉和页脚、应用自定义水印、压缩输出以减少文件大小、添加数字签名、提取或删除单个页面以及填写表单字段。

Darrius Serrant
全栈软件工程师(WebOps)

Darrius Serrant 拥有迈阿密大学的计算机科学学士学位,目前在 Iron Software 担任全栈 WebOps 市场工程师。从小就被编码吸引,他认为计算机既神秘又易于接触,使其成为创意和问题解决的理想媒介。

在 Iron Software,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

对于 Darrius 来说,他的工作令人满意,因为它被重视并产生真正的影响。

准备开始了吗?
版本: 2026.6 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据?
运行示例看着你的HTML代码变成PDF文件。