最直接方法是用iTextSharp的PdfReader和PdfCopy:先用PdfReader读取源PDF,再用PdfCopy.AddPage配合GetImportedPage逐页导出。需注意资源释放、页码格式化、避免复用PdfCopy实例,并校验NumberOfPages和IsEncrypted等状态。

用 iTextSharp 提取单页 PDF 文件最直接
iTextSharp 是 C# 生态里最成熟的免费 PDF 操作库(注意:v5.x 是免费的,v7+ 需商业授权),iTextSharp.text.pdf.PdfReader 和 iTextSharp.text.pdf.PdfCopy 配合就能稳定拆页。别用 System.Drawing 或硬解析二进制——PDF 不是图像,强行读字节会丢文字、矢量图和元数据。
常见错误现象:IOException: The process cannot access the file,往往是因为 PdfReader 未释放或输出流没关闭;还有人误用 PdfWriter.GetInstance 写单页,结果生成损坏文件——必须用 PdfCopy 复制页面结构。
- 确保 NuGet 安装的是
iTextSharp.LGPLv2.Core(.NET Core/.NET 5+ 兼容版)或经典iTextSharp(.NET Framework) -
PdfReader构造后立即检查NumberOfPages,避免空 PDF 导致循环越界 - 每生成一个单页文件,必须新建
PdfCopy实例并调用AddPage,不能复用同一个PdfCopy写多个文件
代码示例:按页码导出独立 PDF 文件
以下片段可直接运行,支持 .NET 6+,已处理异常和资源释放:
using iTextSharp.text.pdf;
using System.IO;
<p>string inputPdf = @"C:\docs\multi.pdf";
using var reader = new PdfReader(inputPdf);</p><p>for (int i = 1; i <= reader.NumberOfPages; i++)
{
string outputPdf = $@"C:\docs\page_{i:D3}.pdf";
using var fs = new FileStream(outputPdf, FileMode.Create);
using var doc = new Document();
using var copy = new PdfCopy(doc, fs);</p><pre class="brush:php;toolbar:false;">doc.Open();
copy.AddPage(copy.GetImportedPage(reader, i));
doc.Close();}
关键点:copy.GetImportedPage(reader, i) 是核心,它把原 PDF 第 i 页完整导入新文档;D3 格式化页码防止文件名顺序错乱(如 page_1.pdf 排在 page_10.pdf 前面)。
用 PdfPig 替代 iTextSharp(.NET Core 原生首选)
如果项目禁用 LGPL 库或需纯 .NET Standard 支持,PdfPig 是更现代的选择——MIT 协议、无依赖、支持读取但不支持写入 PDF。等等,那怎么拆页?答案是:只读 + 外部工具生成。实际流程是:PdfPig 解析页数 → 用 Ghostscript 命令行按页提取。
-
PdfPig仅用于探测页数和元信息,避免自己解析 PDF 结构 - 执行命令:
gswin64c -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dFIRSTPAGE={i} -dLASTPAGE={i} -sOutputFile=page_{i}.pdf input.pdf - 注意 Windows 上
Ghostscript路径需加入环境变量,否则Process.Start找不到命令
性能与大文件注意事项
拆 100 页 PDF 时,iTextSharp 方式内存占用约 2–3 倍原文档大小——因为每页都要加载字体、资源字典等。容易被忽略的点:
- 不要在循环内反复 new
PdfReader,它很重;一个实例复用即可 - 若源 PDF 含加密(
reader.IsEncrypted为 true),需传密码构造PdfReader(input, password),否则GetImportedPage抛BadPasswordException - 含 XFA 表单或 AcroForm 的 PDF,iTextSharp v5 可能丢失交互逻辑,这种场景建议先用 Adobe Acrobat「打印为 PDF」扁平化再拆
真正麻烦的不是拆页本身,而是 PDF 的隐式结构差异:线性化 PDF、增量更新、对象流压缩……这些都会让“看似简单”的一页变成需要解压、重组、重映射的完整子文档。所以别省事跳过 PdfReader 初始化校验。










