尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

通过C#拆分PDF页面的多场景示例

通过C#拆分PDF页面的多场景示例 在处理 PDF 文档时“拆分页面”可以说是最常遇到的需求之一。比如一份几十页的报告你只想要其中某一章或者开会发的 PDF 会议纪要需要按参会者姓名拆成单页分别发邮件又或者你刚把一份扫描件导出来希望每一页变成一个独立的 PDF 文件……这些场景我都遇到过。今天就介绍如何用 Free Spire.PDF for .NET 这个免费库通过 C# 实现各种 PDF 页面拆分 场景。安装在 NuGet 包管理器里搜FreeSpire.PDF直接安装就行。这是一个免费社区版唯一的限制是单次处理不能超过 10 页适用于偶尔处理小文件。一、PDF 页面拆分原理拆 PDF 其实就四步把原 PDF 读进来决定要拆出哪些页单页、一个范围、或者抽几页新建一个空的 PDF 对象把选中的页面“复制”进去保存成新文件Free Spire.PDF 提供了一个PdfDocument类里面的Pages集合就像数组一样你可以按索引取出每一页然后插入到另一个文档里。下面我会用实际代码演示。二、每一页单独存一个 PDF如果你的目标就是“把一份 PDF 的每一页拆成单独的文件”这个库内置了一个Split方法一行调用就能搞定。1234567891011121314151617181920usingSpire.Pdf;namespaceSplitPdfDemo{internalclassProgram{staticvoidMain(string[] args){PdfDocument pdf newPdfDocument();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就不管用了得我们自己动手循环。代码12345678910111213141516171819202122232425262728293031323334353637383940414243usingSpire.Pdf;usingSystem;namespaceSplitPdf{internalclassProgram{staticvoidMain(string[] args){stringinputFile sample.pdf;intpagesPerGroup 3;// 每3页一组stringoutputPattern Group_{0}.pdf;PdfDocument source newPdfDocument();source.LoadFromFile(inputFile);inttotalPages source.Pages.Count;intgroupCount (int)Math.Ceiling((double)totalPages / pagesPerGroup);for(intg 0; g groupCount; g){PdfDocument groupDoc newPdfDocument();intstartIdx g * pagesPerGroup;// 起始索引0基intendIdx Math.Min(startIdx pagesPerGroup - 1, totalPages - 1);for(inti startIdx; i endIdx; i){groupDoc.InsertPage(source, source.Pages[i]);}stringoutputFile string.Format(outputPattern, g 1);groupDoc.SaveToFile(outputFile);groupDoc.Close();Console.WriteLine($已生成{outputFile});}source.Close();Console.WriteLine($全部完成共生成 {groupCount} 个文件);}}}四、其他常用拆分玩法1. 提取不连续的几页例如第 2、5、7 页有时候你只想抽几页出来做成一个新 PDF比如从合同里只把签字页拿出来。12345678910111213141516171819202122PdfDocument source newPdfDocument();source.LoadFromFile(合同.pdf);PdfDocument result newPdfDocument();int[] wantedPages { 2, 5, 7 };// 这里的数字是页码从1开始foreach(intpageNuminwantedPages){// 注意Pages 集合的索引是从0开始的所以要减1if(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. 提取所有奇数页 / 偶数页比如一份双面扫描的文档你想把奇数页和偶数页分开处理。123456789101112131415161718192021PdfDocument source newPdfDocument();source.LoadFromFile(双面扫描件.pdf);PdfDocument oddPages newPdfDocument();// 奇数页第1、3、5...PdfDocument evenPages newPdfDocument();// 偶数页第2、4、6...for(inti 0; i source.Pages.Count; i)// i 是0基索引{// 第1页的索引是0第2页索引是1依此类推if(i % 2 0)oddPages.InsertPage(source, source.Pages[i]);elseevenPages.InsertPage(source, source.Pages[i]);}oddPages.SaveToFile(奇数页.pdf);evenPages.SaveToFile(偶数页.pdf);oddPages.Close();evenPages.Close();source.Close();这里容易混淆的是索引 i0 对应第1页奇数页所以i%20是奇数页。五、总结需求使用方法核心 API每页单独保存pdf.Split(pattern_{0}.pdf, 1)内置Split每 N 页合为一个文件手动循环 InsertPagePdfDocument.InsertPage按指定页码提取手动筛选 InsertPage同上掌握上述模式后您可以灵活组合出满足各种业务规则的 PDF 拆分逻辑。
返回列表