行业资讯

C# 实现 PDF 页面拆分:单页、指定页精准拆分

发布时间:2026/7/8 5:29:36
C# 实现 PDF 页面拆分:单页、指定页精准拆分 一、先搞清楚原理拆 PDF 其实就四步把原 PDF 读进来决定要拆出哪些页单页、一个范围、或者抽几页新建一个空的 PDF 对象把选中的页面“复制”进去保存成新文件Free Spire.PDF 提供了一个PdfDocument类里面的Pages集合就像数组一样你可以按索引取出每一页然后插入到另一个文档里。下面我会用实际代码演示。二、最简单的情况每一页单独存一个 PDF如果你的目标就是“把一份 PDF 的每一页拆成单独的文件”这个库内置了一个Split方法一行调用就能搞定。using Spire.Pdf; namespace SplitPdfDemo { internal class Program { static void Main(string[] args) { PdfDocument pdf new PdfDocument(); pdf.LoadFromFile(D:\\测试文档.pdf); // 注意模板里必须写 {0}这是编号占位符 // 比如 page_{0}.pdf 会生成 page_1.pdf, page_2.pdf ... pdf.Split(C:\\output\\page_{0}.pdf, 1); pdf.Close(); Console.WriteLine(拆分完成请去 output 文件夹查看); } } }一点小经验Split方法第二个参数startNumber我一般就填 1这样文件名看起来更自然。如果你填 0第一个文件就会变成page_0.pdf容易引起困惑。三、进阶每 N 页合并成一个 PDF比如每 3 页一个文件有时候我们不是要“每页一个文件”而是“每几页合成一个文件”。比方说你把扫描仪设置成了连续进纸每 3 页是一份合同那么拆分时就要按 3 页一组来切。这时候Split就不管用了得我们自己动手循环。代码using Spire.Pdf; using System; namespace SplitPdf { internal class Program { static void Main(string[] args) { string inputFile sample.pdf; int pagesPerGroup 3; // 每3页一组 string outputPattern Group_{0}.pdf; PdfDocument source new PdfDocument(); source.LoadFromFile(inputFile); int totalPages source.Pages.Count; int groupCount (int)Math.Ceiling((double)totalPages / pagesPerGroup); for (int g 0; g groupCount; g) { PdfDocument groupDoc new PdfDocument(); int startIdx g * pagesPerGroup; // 起始索引0基 int endIdx Math.Min(startIdx pagesPerGroup - 1, totalPages - 1); for (int i startIdx; i endIdx; i) { groupDoc.InsertPage(source, source.Pages[i]); } string outputFile string.Format(outputPattern, g 1); groupDoc.SaveToFile(outputFile); groupDoc.Close(); Console.WriteLine($已生成{outputFile}); } source.Close(); Console.WriteLine($全部完成共生成 {groupCount} 个文件); } } }四、其他常用拆分玩法1. 提取不连续的几页例如第 2、5、7 页有时候你只想抽几页出来做成一个新 PDF比如从合同里只把签字页拿出来。PdfDocument source new PdfDocument(); source.LoadFromFile(合同.pdf); PdfDocument result new PdfDocument(); int[] wantedPages { 2, 5, 7 }; // 这里的数字是页码从1开始 foreach (int pageNum in wantedPages) { // 注意Pages 集合的索引是从0开始的所以要减1 if (pageNum 1 pageNum source.Pages.Count) { result.InsertPage(source, source.Pages[pageNum - 1]); } else { Console.WriteLine($警告第{pageNum}页不存在已跳过); } } result.SaveToFile(提取的签字页.pdf); result.Close(); source.Close();一个小坑如果你传入的页码超出范围代码不会自动报错只是那页不会被复制。所以我加了一个if判断并打印警告避免你“以为复制了其实没有”。2. 提取所有奇数页 / 偶数页比如一份双面扫描的文档你想把奇数页和偶数页分开处理。PdfDocument source new PdfDocument(); source.LoadFromFile(双面扫描件.pdf); PdfDocument oddPages new PdfDocument(); // 奇数页第1、3、5... PdfDocument evenPages new PdfDocument(); // 偶数页第2、4、6... for (int i 0; i source.Pages.Count; i) // i 是0基索引 { // 第1页的索引是0第2页索引是1依此类推 if (i % 2 0) oddPages.InsertPage(source, source.Pages[i]); else evenPages.InsertPage(source, source.Pages[i]); } oddPages.SaveToFile(奇数页.pdf); evenPages.SaveToFile(偶数页.pdf); oddPages.Close(); evenPages.Close(); source.Close();这里容易混淆的是索引 i0 对应第1页奇数页所以i%20是奇数页。五、和其他库简单对比一下个人感受库许可优点缺点Free Spire.PDF免费社区版API 很直观不需要装 Adobe页面复制时注释、表单、书签都保留得不错。10页限制超过就截断这是硬伤iTextSharpAGPL功能最强工业级。AGPL 许可证对商业项目很不友好想商用必须买授权而且配置略繁琐。PdfSharpMIT完全免费无限制轻量。页面复制的效果一般有些复杂元素比如某些字体或透明度会丢失。我个人建议如果你只是偶尔处理一些 ≤10 页的 PDFFree Spire.PDF 最省心。如果经常处理几十页的文件又不想花钱可以试试 PdfSharp但要做好“部分样式丢失”的心理准备。六、总结需求使用方法核心 API每页单独保存pdf.Split(pattern_{0}.pdf, 1)内置Split每 N 页合为一个文件手动循环 InsertPagePdfDocument.InsertPage