在处理 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方法,一行调用就能搞定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
一点小经验:Split方法第二个参数startNumber我一般就填 1,这样文件名看起来更自然。如果你填 0,第一个文件就会变成page_0.pdf,容易引起困惑。
三、每 N 页合并成一个 PDF(比如每 3 页一个文件)
有时候我们不是要“每页一个文件”,而是“每几页合成一个文件”。比方说,你把扫描仪设置成了连续进纸,每 3 页是一份合同,那么拆分时就要按 3 页一组来切。
这时候Split就不管用了,得我们自己动手循环。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
四、其他常用拆分玩法
1. 提取不连续的几页(例如第 2、5、7 页)
有时候你只想抽几页出来做成一个新 PDF,比如从合同里只把签字页拿出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
一个小坑:如果你传入的页码超出范围,代码不会自动报错,只是那页不会被复制。所以我加了一个if判断并打印警告,避免你“以为复制了其实没有”。
2. 提取所有奇数页 / 偶数页
比如一份双面扫描的文档,你想把奇数页和偶数页分开处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
这里容易混淆的是:索引 i=0 对应第1页(奇数页),所以i%2==0是奇数页。
五、总结
| 需求 | 使用方法 | 核心 API |
|---|---|---|
| 每页单独保存 | pdf.Split("pattern_{0}.pdf", 1) | 内置Split |
| 每 N 页合为一个文件 | 手动循环 +InsertPage | PdfDocument.InsertPage |
| 按指定页码提取 | 手动筛选 +InsertPage | 同上 |
掌握上述模式后,您可以灵活组合出满足各种业务规则的 PDF 拆分逻辑。