如何在C# .NET中合并PDF文件?
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-1.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图片 1 - 使用 IronPDF 合并 PDF
将多个 PDF 文件合并为一个文档是商业应用中的常见需求。 无论是生成合并财务报表、打包法律合同以备存档,还是组合多联发票,通过编程方式合并 PDF 文件都能节省时间并省去手动操作步骤。 IronPDF 提供了一个直观的 API,仅需几行 C# 代码即可完成此操作,无需任何外部工具或命令行实用程序。
本指南涵盖了所有实际场景:双文件合并、多文件列表合并、使用 MemoryStream 进行内存处理,以及合并后操作,例如密码保护和压缩。
立即注册免费试用,为您的 .NET 应用程序添加 PDF 合并功能。
如何开始使用 IronPDF?
在编写任何合并代码之前,请先从 NuGet 安装 IronPDF。 该软件包支持 .NET Framework 4.6.2 及以上版本以及 .NET 5/6/7/8/9/10,因此可在控制台应用程序、ASP.NET Core 服务、Azure Functions 和 Windows Forms 项目中运行,且无需任何额外的运行时依赖项。
打开 NuGet 包管理器控制台并运行:
Install-Package IronPdf
Install-Package IronPdf
或使用 .NET CLI:
dotnet add package IronPdf
dotnet add package IronPdf
有关包括许可证密钥申请在内的分步设置指南,请参阅 IronPDF 安装概述。 安装包并应用许可证密钥后,本指南中的所有示例均可直接运行,无需修改。
如何通过编程合并 PDF 文档?
PdfDocument.Merge 方法提供了将两个 PDF 文件合并为一个 PDF 的最直接方法。 使用 PdfDocument.FromFile 加载每个源文档,将这两个对象传递给 Merge,并保存结果。
输入发票一
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-2.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图片 2 - 输入发票 One
输入发票二
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-3.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图片 3 - 输入发票二。
using IronPdf;
// Load two input PDF files from disk
PdfDocument pdfA = PdfDocument.FromFile("invoice_one.pdf");
PdfDocument pdfB = PdfDocument.FromFile("invoice_two.pdf");
// Merge PDF documents into a single PDF
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Save the merged document
merged.SaveAs("combined_invoices.pdf");
using IronPdf;
// Load two input PDF files from disk
PdfDocument pdfA = PdfDocument.FromFile("invoice_one.pdf");
PdfDocument pdfB = PdfDocument.FromFile("invoice_two.pdf");
// Merge PDF documents into a single PDF
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Save the merged document
merged.SaveAs("combined_invoices.pdf");
Imports IronPdf
' Load two input PDF files from disk
Dim pdfA As PdfDocument = PdfDocument.FromFile("invoice_one.pdf")
Dim pdfB As PdfDocument = PdfDocument.FromFile("invoice_two.pdf")
' Merge PDF documents into a single PDF
Dim merged As PdfDocument = PdfDocument.Merge(pdfA, pdfB)
' Save the merged document
merged.SaveAs("combined_invoices.pdf")
输出
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-4.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图像 4 - 合并 PDF 文档
Merge 方法接受两个 PdfDocument 实例,并返回一个新文档,其中包含来自两个源的所有页面,并按顺序排列。 生成的文件将保留每个输入源的原始格式、图片、字体及嵌入内容。 合并文档后,您可以将其保存到磁盘、通过 Web 端点返回,或在交付给用户前添加页眉和页脚。
请注意,PdfDocument.FromFile 既适用于文件路径也适用于 URI 字符串,因此存储在云 Blob 存储中的文档可以直接通过 URL 加载。 合并操作是非破坏性的:调用后,两个源对象保持不变。
如何一次性合并多个 PDF 文件?
当您需要合并两个以上的文档时,请将 List<PdfDocument>(或任何 IEnumerable<PdfDocument>)传递给重载的 Merge 方法。 这种方法可轻松扩展,无论文件数量是三个还是数百个,都无需更改您的代码结构。
using IronPdf;
// Build a list of quarterly reports
List<PdfDocument> pdfsToMerge = new()
{
PdfDocument.FromFile("report_q1.pdf"),
PdfDocument.FromFile("report_q2.pdf"),
PdfDocument.FromFile("report_q3.pdf"),
PdfDocument.FromFile("report_q4.pdf")
};
// Combine into one annual report
PdfDocument merged = PdfDocument.Merge(pdfsToMerge);
// Save the final document
merged.SaveAs("annual_report.pdf");
using IronPdf;
// Build a list of quarterly reports
List<PdfDocument> pdfsToMerge = new()
{
PdfDocument.FromFile("report_q1.pdf"),
PdfDocument.FromFile("report_q2.pdf"),
PdfDocument.FromFile("report_q3.pdf"),
PdfDocument.FromFile("report_q4.pdf")
};
// Combine into one annual report
PdfDocument merged = PdfDocument.Merge(pdfsToMerge);
// Save the final document
merged.SaveAs("annual_report.pdf");
Imports IronPdf
' Build a list of quarterly reports
Dim pdfsToMerge As New List(Of PdfDocument) From {
PdfDocument.FromFile("report_q1.pdf"),
PdfDocument.FromFile("report_q2.pdf"),
PdfDocument.FromFile("report_q3.pdf"),
PdfDocument.FromFile("report_q4.pdf")
}
' Combine into one annual report
Dim merged As PdfDocument = PdfDocument.Merge(pdfsToMerge)
' Save the final document
merged.SaveAs("annual_report.pdf")
合并 PDF 文档
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-5.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图片 5 - 新合并的输出 PDF 文件。
IronPDF 按列表顺序处理页面,因此您的 List<PdfDocument> 中的文档顺序直接控制输出中的页面顺序。 如果在合并后需要重新排序页面,页面管理 API允许您从任何 PdfDocument 复制、移动或删除单个页面。
这种模式也适用于运行时生成的文档。例如,您可以将报告的每个部分都转换为 PDF ,然后合并生成的 PdfDocument 对象,而无需将中间文件写入磁盘。 当源内容来自 WORD 文档时,此要求同样适用于 DOCX 转 PDF 的转换。
如何使用 MemoryStream 合并 PDF 文件?
对于无法写入磁盘或写入速度过慢的 Web 服务和无服务器函数,必须采用内存处理。 IronPDF 支持从字节数组加载 PDF 文档,并通过 @@--CODE-13975--CODE-13975 属性将合并结果公开为 MemoryStream。
using IronPdf;
using System.IO;
// Load PDF content as byte arrays (e.g., from database or HTTP response)
byte[] firstFileBytes = File.ReadAllBytes("contract_part1.pdf");
byte[] secondFileBytes = File.ReadAllBytes("contract_part2.pdf");
// Create PdfDocument objects from byte arrays
PdfDocument doc1 = new PdfDocument(firstFileBytes);
PdfDocument doc2 = new PdfDocument(secondFileBytes);
// Merge and access the result as a stream
PdfDocument merged = PdfDocument.Merge(doc1, doc2);
MemoryStream outputStream = merged.Stream;
// Optionally save to disk as well
merged.SaveAs("merged_contract.pdf");
using IronPdf;
using System.IO;
// Load PDF content as byte arrays (e.g., from database or HTTP response)
byte[] firstFileBytes = File.ReadAllBytes("contract_part1.pdf");
byte[] secondFileBytes = File.ReadAllBytes("contract_part2.pdf");
// Create PdfDocument objects from byte arrays
PdfDocument doc1 = new PdfDocument(firstFileBytes);
PdfDocument doc2 = new PdfDocument(secondFileBytes);
// Merge and access the result as a stream
PdfDocument merged = PdfDocument.Merge(doc1, doc2);
MemoryStream outputStream = merged.Stream;
// Optionally save to disk as well
merged.SaveAs("merged_contract.pdf");
Imports IronPdf
Imports System.IO
' Load PDF content as byte arrays (e.g., from database or HTTP response)
Dim firstFileBytes As Byte() = File.ReadAllBytes("contract_part1.pdf")
Dim secondFileBytes As Byte() = File.ReadAllBytes("contract_part2.pdf")
' Create PdfDocument objects from byte arrays
Dim doc1 As New PdfDocument(firstFileBytes)
Dim doc2 As New PdfDocument(secondFileBytes)
' Merge and access the result as a stream
Dim merged As PdfDocument = PdfDocument.Merge(doc1, doc2)
Dim outputStream As MemoryStream = merged.Stream
' Optionally save to disk as well
merged.SaveAs("merged_contract.pdf")
合并合同文件
!a href="/static-assets/pdf/blog/net-pdf-merge/net-pdf-merge-6.webp">.NET PDF Merge Tasks with IronPDF:完整的 C# 指南:图片 6 - 合并的 PDF 合同文件。
Stream 属性返回一个位于开头的 MemoryStream 值,可用于写入 HTTP 响应或传递给其他处理步骤。在 ASP.NET Core 控制器中,您可以直接返回 File(outputStream, "application/pdf", "merged.pdf") 值。 不会生成任何临时文件,这简化了清理工作,并在高吞吐量场景下降低了磁盘开销。
IronPDF 支持将字符串文件路径、字节数组和流作为输入源,因此您可以在同一个合并调用中混合使用这些输入源。 从数据库 BLOB 加载的文档可与从 URL 获取的文档合并,无需任何中间转换步骤。
合并文件中如何保留书签和导航?
在合并 PDF 文件时,IronPDF 会保留每个源文档的书签结构。 读者可在合并输出文件的导航窗格中查看所有合并文件的完整目录,这使得用户能够轻松地在源自不同源文档的各章节之间跳转。 PDF 规范中的书签存储在文档大纲字典中,IronPDF 能为所有合并的源文件正确重建此结构。
书签的保留功能会自动生效,无需额外配置。 如果源文件包含嵌套书签(章节和子章节),合并后的输出应保留该层级结构。 对于需要统一目录而非单独的文档书签树的合并文档,目录 API 允许您在合并后构建自定义导航结构。
如果源文档在创建时未包含书签元数据,合并后的输出将不会包含该部分的目录条目。 在合规或归档环境中交付合并文件之前,请通过检查生成的 PdfDocument 上的 OutlineManager 属性来验证哪些书签已被继承。 您可以通过编程方式重命名书签标签、重新排序条目,或插入新项目,将来自不同源文档的内容整合到一个逻辑层次结构中。 对于工作流中还需进行 PDF/A 转换以实现长期归档的情况,请在合并后应用合规性转换步骤,而非对每个源文件单独处理。 一次性转换最终合并后的文档效率更高,且可避免对可能需要进一步编辑的输出结果进行重复转换。
合并后,您还可以使用页码功能为合并后的文档添加页码,当输出内容来自多个来源且长达数十页时,此功能非常有用。
如何对合并后的 PDF 文件设置密码保护?
合并后,生成的 PdfDocument 公开了 SecuritySettings,用于应用用户和所有者密码,限制打印、复制和编辑权限。
using IronPdf;
PdfDocument pdfA = PdfDocument.FromFile("part1.pdf");
PdfDocument pdfB = PdfDocument.FromFile("part2.pdf");
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Require a password to open the document
merged.SecuritySettings.UserPassword = "reader123";
// Owner password controls permissions such as printing and editing
merged.SecuritySettings.OwnerPassword = "admin456";
merged.SaveAs("secured_merged.pdf");
using IronPdf;
PdfDocument pdfA = PdfDocument.FromFile("part1.pdf");
PdfDocument pdfB = PdfDocument.FromFile("part2.pdf");
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Require a password to open the document
merged.SecuritySettings.UserPassword = "reader123";
// Owner password controls permissions such as printing and editing
merged.SecuritySettings.OwnerPassword = "admin456";
merged.SaveAs("secured_merged.pdf");
Imports IronPdf
Dim pdfA As PdfDocument = PdfDocument.FromFile("part1.pdf")
Dim pdfB As PdfDocument = PdfDocument.FromFile("part2.pdf")
Dim merged As PdfDocument = PdfDocument.Merge(pdfA, pdfB)
' Require a password to open the document
merged.SecuritySettings.UserPassword = "reader123"
' Owner password controls permissions such as printing and editing
merged.SecuritySettings.OwnerPassword = "admin456"
merged.SaveAs("secured_merged.pdf")
UserPassword 会在读者查看文档之前发出提示,而 OwnerPassword 则会阻止权限更改。 您可以将密码保护与打印限制、防复制标记以及数字签名结合使用。 如需了解权限选项的完整指南,PDF 安全教程涵盖了所有可用设置。
如果源文档本身受密码保护,IronPDF 可以在合并前解密加密的 PDF 文件,前提是您拥有所有者凭据。 这意味着您可以将来自不同供应商或系统的受保护文档合并为单一的、重新加密的输出文件,而无需手动解锁步骤。
如何缩小合并后 PDF 文件的大小?
合并包含大量图片的大型文档可能会生成体积庞大的输出文件,导致存储或传输困难。 IronPDF 的 PDF 压缩 API 通过以较低质量设置重新压缩嵌入的图像,在保持文本清晰度的同时,可显著减小文件大小。
using IronPdf;
PdfDocument pdfA = PdfDocument.FromFile("report_section1.pdf");
PdfDocument pdfB = PdfDocument.FromFile("report_section2.pdf");
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Compress embedded images to reduce output file size
merged.CompressImages(60); // quality 0–100
merged.SaveAs("compressed_merged.pdf");
using IronPdf;
PdfDocument pdfA = PdfDocument.FromFile("report_section1.pdf");
PdfDocument pdfB = PdfDocument.FromFile("report_section2.pdf");
PdfDocument merged = PdfDocument.Merge(pdfA, pdfB);
// Compress embedded images to reduce output file size
merged.CompressImages(60); // quality 0–100
merged.SaveAs("compressed_merged.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
CompressImages 的整数参数是一个质量百分比:50 到 75 之间的值通常会将图像密集型文档的文件大小减少 40-70%,而不会对文本内容造成明显的劣化。 对于包含矢量图形和少量光栅图像的文档,虽然节省的空间较小,但仍建议将该调用包含在内。
PDF 合并的常见用例有哪些?
PdfDocument.Merge API 适用于生产环境中 .NET 应用程序的各种文档工作流程:
| 用例 | 输入来源 | 建议的翻译方法 |
|---|---|---|
| 年度财务报告 | 磁盘上的四个季度 PDF 文件 | 使用 Merge(List<PdfDocument>) 合并列表 |
| 多部分法律合同 | 基础合同 + 数据库中的修订条款 | 字节数组加载 + 内存合并 |
| 发票合并 | 按明细项生成的 HTML 发票 | 逐项将 HTML 转换为 PDF,然后合并列表 |
| 自动化报告交付 | 包含 DOCX 和 PDF 格式的源文件 | DOCX 转 PDF,然后合并 |
| 安全文档归档 | 多部门报告 | 列表合并 + SecuritySettings |
对于需要在合并前有选择地提取文档的工作流程,拆分 PDF API 可从源文档中提取特定的页面范围。 您可以直接在 PDF 文件之间复制页面,当需要在合并后的输出中仅显示大型文档的特定部分时,此功能非常有用。
IronPDF 还支持从合并后的文档中提取文本和图像以供后续处理,因此非常适合作为大型数据管道中核心的文档组装步骤。
下一步计划是什么?
IronPDF 的 PdfDocument.Merge 方法以最少的代码涵盖了 .NET PDF 合并场景的全部范围:双文件合并、多文件列表合并、内存处理、密码保护输出和合并后压缩。 无论输入源类型如何,每种方法都使用相同的、一致的 API。
立即开始免费试用,在您的项目中运行这些示例。 如需进行生产环境部署,请查看适合您团队规模和使用场景的许可选项。
添加合并功能后,可探索相关的文档操作:将 PDF 拆分为多个独立文件、为多页输出添加页码,或在合并后的文档所有页面上添加水印。
常见问题解答
如何在C#中合并两个PDF文件?
使用 PdfDocument.FromFile 加载每个文件,然后调用 PdfDocument.Merge(pdfA, pdfB) 并使用 merged.SaveAs 保存结果。
如何在 .NET 中合并超过两个PDF文件?
创建一个包含所有源文档的 List,并将其传递给 PdfDocument.Merge(list)。输出会保留列表顺序。
可以在不写入磁盘的情况下在内存中合并PDF吗?
可以。使用 new PdfDocument(bytes) 从字节数组中加载文档,合并并通过 merged.Stream 访问结果以避免任何磁盘写入。
IronPDF 合并PDF时会保留书签吗?
会的。IronPDF 会自动将每个源文档的书签(大纲)结构带入合并输出中,包括嵌套的书签层次结构。
如何在C#中给合并后的PDF设置密码保护?
合并后,设置 merged.SecuritySettings.UserPassword 作为阅读器密码,设置 merged.SecuritySettings.OwnerPassword 作为权限密码,然后调用 SaveAs。
如何减小合并后PDF的文件大小?
在保存之前调用 merged.CompressImages(quality) ,设置质量值在 50 到 75 之间。这会重新压缩嵌入的光栅图像,通常可将图像密集的文档文件大小减少40-70%。
IronPDF 可以合并加密的PDF文件吗?
可以。当您拥有所有者密码时,IronPDF 可以加载并合并加密的PDF。在合并之前使用 PdfDocument.FromFile(path, password) 解锁文件。
IronPDF 的合并API在ASP.NET Core中有效吗?
有效。合并结果可以作为 File(merged.Stream, "application/pdf", "merged.pdf") 从任何 ASP.NET Core 控制器操作返回。



