韩曙 發表於 2026-4-29 14:38:00

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

<section id="mp-md" style="-webkit-font-smoothing: antialiased; text-autospace: normal; text-align: left; color: rgba(92, 97, 102, 1); background-color: rgba(252, 252, 252, 1); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 16px; line-height: 1.6; padding: 1.5em 1em"><p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">在处理 PDF 文档时,“拆分页面”可以说是最常遇到的需求之一。比如:一份几十页的报告,你只想要其中某一章;或者开会发的 PDF 会议纪要,需要按参会者姓名拆成单页分别发邮件;又或者你刚把一份扫描件导出来,希望每一页变成一个独立的 PDF 文件……这些场景我都遇到过。</span></p>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">今天我就用 Free Spire.PDF for .NET 这个免费库,把 C# 里拆分 PDF 的各种姿势都讲一遍。代码都是实际跑过的,你复制过去改改路径就能用。</span></p>
<blockquote style="box-sizing: border-box; display: block; font-size: 0.95em; overflow: auto; border-left: 3px solid rgba(242, 151, 24, 1); padding: 12px 20px; margin: 1em 0; background: rgba(248, 249, 250, 1)">
<p style="box-sizing: border-box; margin: 0; overflow-wrap: break-word; line-height: 1.7"><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">安装</strong><span style="box-sizing: border-box; margin: 0">:在 NuGet 包管理器里搜 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">FreeSpire.PDF</code><span style="box-sizing: border-box; margin: 0"> 直接安装就行。这是一个免费社区版,唯一的限制是</span><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">单次处理不能超过 10 页</strong><span style="box-sizing: border-box; margin: 0">,如果超过 10 页,后面的页会被悄悄截掉(不会报错,但结果会少页)。所以如果你只是偶尔处理小文件,这个库很顺手。</span></p>
</blockquote>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">一、先搞清楚原理</span></h2>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">拆 PDF 其实就四步:</span></p>
<ol style="box-sizing: border-box; margin: 0 0 1em; padding-left: 2em; list-style-type: decimal">
<li style="box-sizing: border-box; margin: 0 0 0.4em; line-height: 1.7"><span style="box-sizing: border-box; margin: 0">把原 PDF 读进来</span></li>
<li style="box-sizing: border-box; margin: 0 0 0.4em; line-height: 1.7"><span style="box-sizing: border-box; margin: 0">决定要拆出哪些页(单页、一个范围、或者抽几页)</span></li>
<li style="box-sizing: border-box; margin: 0 0 0.4em; line-height: 1.7"><span style="box-sizing: border-box; margin: 0">新建一个空的 PDF 对象,把选中的页面“复制”进去</span></li>
<li style="box-sizing: border-box; margin: 0 0 0.4em; line-height: 1.7"><span style="box-sizing: border-box; margin: 0">保存成新文件</span></li>
</ol>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">Free Spire.PDF 提供了一个 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">PdfDocument</code><span style="box-sizing: border-box; margin: 0"> 类,里面的 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">Pages</code><span style="box-sizing: border-box; margin: 0"> 集合就像数组一样,你可以按索引取出每一页,然后插入到另一个文档里。下面我会用实际代码演示。</span></p>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">二、最简单的情况:每一页单独存一个 PDF</span></h2>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">如果你的目标就是“把一份 PDF 的每一页拆成单独的文件”,这个库内置了一个 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">Split</code><span style="box-sizing: border-box; margin: 0"> 方法,一行调用就能搞定。</span></p>
<pre style="box-sizing: border-box; margin: 1em 0; padding: 1.2em; background-color: rgba(248, 249, 250, 1); border-radius: 10px; overflow-x: auto; line-height: 1.6"><code class="language-csharp" style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; word-break: break-all; background-color: rgba(0, 0, 0, 0); color: inherit; padding: 0; border: none; border-radius: 0; font-size: 0.875em; line-height: 1.5"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">using</span> Spire.Pdf;<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">namespace</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">SplitPdfDemo</span><br style="box-sizing: border-box; margin: 0">{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">internal</span>&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">class</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">Program</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-function" style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">static</span>&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">void</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">Main</span>(<span class="hljs-params" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0"><span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span>[] <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">args</span></span>)</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfDocument pdf = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pdf.LoadFromFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"D:\\测试文档.pdf"</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 注意:模板里必须写 {0},这是编号占位符</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 比如 "page_{0}.pdf" 会生成 page_1.pdf, page_2.pdf ...</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pdf.Split(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"C:\\output\\page_{0}.pdf"</span>, <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">1</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pdf.Close();<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"拆分完成,请去 output 文件夹查看"</span>);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">}<br style="box-sizing: border-box; margin: 0"></code></pre>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">一点小经验</strong><span style="box-sizing: border-box; margin: 0">:</span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">Split</code><span style="box-sizing: border-box; margin: 0"> 方法第二个参数 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">startNumber</code><span style="box-sizing: border-box; margin: 0"> 我一般就填 1,这样文件名看起来更自然。如果你填 0,第一个文件就会变成 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">page_0.pdf</code><span style="box-sizing: border-box; margin: 0">,容易引起困惑。</span></p>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">三、进阶:每 N 页合并成一个 PDF(比如每 3 页一个文件)</span></h2>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">有时候我们不是要“每页一个文件”,而是“每几页合成一个文件”。比方说,你把扫描仪设置成了连续进纸,每 3 页是一份合同,那么拆分时就要按 3 页一组来切。</span></p>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">这时候 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">Split</code><span style="box-sizing: border-box; margin: 0"> 就不管用了,得我们自己动手循环。</span></p>
<h3 style="box-sizing: border-box; margin: 1.2em 0 0.5em; overflow-wrap: break-word; line-height: 1.35; font-weight: 600; font-size: 1.2em; color: rgba(242, 151, 24, 1)"><span style="box-sizing: border-box; margin: 0">代码</span></h3>
<pre style="box-sizing: border-box; margin: 1em 0; padding: 1.2em; background-color: rgba(248, 249, 250, 1); border-radius: 10px; overflow-x: auto; line-height: 1.6"><code class="language-csharp" style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; word-break: break-all; background-color: rgba(0, 0, 0, 0); color: inherit; padding: 0; border: none; border-radius: 0; font-size: 0.875em; line-height: 1.5"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">using</span> Spire.Pdf;<br style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">using</span> System;<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">namespace</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">SplitPdf</span><br style="box-sizing: border-box; margin: 0">{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">internal</span>&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">class</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">Program</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-function" style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">static</span>&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">void</span>&nbsp;<span class="hljs-title" style="color: rgba(254, 196, 24, 1); box-sizing: border-box; margin: 0">Main</span>(<span class="hljs-params" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0"><span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span>[] <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">args</span></span>)</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span> inputFile = <span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"sample.pdf"</span>;<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> pagesPerGroup = <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">3</span>;            <span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 每3页一组</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span> outputPattern = <span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"Group_{0}.pdf"</span>;<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfDocument source = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source.LoadFromFile(inputFile);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> totalPages = source.Pages.Count;<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> groupCount = (<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span>)Math.Ceiling((<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">double</span>)totalPages / pagesPerGroup);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">for</span> (<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> g = <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">0</span>; g &lt; groupCount; g++)<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfDocument groupDoc = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> startIdx = g * pagesPerGroup;                <span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 起始索引(0基)</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> endIdx = Math.Min(startIdx + pagesPerGroup - <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">1</span>, totalPages - <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">1</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">for</span> (<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> i = startIdx; i &lt;= endIdx; i++)<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupDoc.InsertPage(source, source.Pages);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span> outputFile = <span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">string</span>.Format(outputPattern, g + <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">1</span>);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupDoc.SaveToFile(outputFile);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupDoc.Close();<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">$"已生成:<span class="hljs-subst" style="box-sizing: border-box; margin: 0">{outputFile}</span>"</span>);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source.Close();<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">$"全部完成,共生成 <span class="hljs-subst" style="box-sizing: border-box; margin: 0">{groupCount}</span> 个文件"</span>);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">}<br style="box-sizing: border-box; margin: 0"></code></pre>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">四、其他常用拆分玩法</span></h2>
<h3 style="box-sizing: border-box; margin: 1.2em 0 0.5em; overflow-wrap: break-word; line-height: 1.35; font-weight: 600; font-size: 1.2em; color: rgba(242, 151, 24, 1)"><span style="box-sizing: border-box; margin: 0">1. 提取不连续的几页(例如第 2、5、7 页)</span></h3>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">有时候你只想抽几页出来做成一个新 PDF,比如从合同里只把签字页拿出来。</span></p>
<pre style="box-sizing: border-box; margin: 1em 0; padding: 1.2em; background-color: rgba(248, 249, 250, 1); border-radius: 10px; overflow-x: auto; line-height: 1.6"><code class="language-csharp" style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; word-break: break-all; background-color: rgba(0, 0, 0, 0); color: inherit; padding: 0; border: none; border-radius: 0; font-size: 0.875em; line-height: 1.5">PdfDocument source = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0">source.LoadFromFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"合同.pdf"</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">PdfDocument result = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0"><span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span>[] wantedPages = { <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">2</span>, <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">5</span>, <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">7</span> };   <span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 这里的数字是页码(从1开始)</span><br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">foreach</span> (<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> pageNum <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">in</span> wantedPages)<br style="box-sizing: border-box; margin: 0">{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 注意:Pages 集合的索引是从0开始的,所以要减1</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">if</span> (pageNum &gt;= <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">1</span> &amp;&amp; pageNum &lt;= source.Pages.Count)<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.InsertPage(source, source.Pages);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">else</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">$"警告:第<span class="hljs-subst" style="box-sizing: border-box; margin: 0">{pageNum}</span>页不存在,已跳过"</span>);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;}<br style="box-sizing: border-box; margin: 0">}<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">result.SaveToFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"提取的签字页.pdf"</span>);<br style="box-sizing: border-box; margin: 0">result.Close();<br style="box-sizing: border-box; margin: 0">source.Close();<br style="box-sizing: border-box; margin: 0"></code></pre>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">一个小坑:如果你传入的页码超出范围,代码不会自动报错,只是那页不会被复制。所以我加了一个 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">if</code><span style="box-sizing: border-box; margin: 0"> 判断并打印警告,避免你“以为复制了其实没有”。</span></p>
<h3 style="box-sizing: border-box; margin: 1.2em 0 0.5em; overflow-wrap: break-word; line-height: 1.35; font-weight: 600; font-size: 1.2em; color: rgba(242, 151, 24, 1)"><span style="box-sizing: border-box; margin: 0">2. 提取所有奇数页 / 偶数页</span></h3>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">比如一份双面扫描的文档,你想把奇数页和偶数页分开处理。</span></p>
<pre style="box-sizing: border-box; margin: 1em 0; padding: 1.2em; background-color: rgba(248, 249, 250, 1); border-radius: 10px; overflow-x: auto; line-height: 1.6"><code class="language-csharp" style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; word-break: break-all; background-color: rgba(0, 0, 0, 0); color: inherit; padding: 0; border: none; border-radius: 0; font-size: 0.875em; line-height: 1.5">PdfDocument source = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<br style="box-sizing: border-box; margin: 0">source.LoadFromFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"双面扫描件.pdf"</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">PdfDocument oddPages = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();   <span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 奇数页(第1、3、5...)</span><br style="box-sizing: border-box; margin: 0">PdfDocument evenPages = <span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">new</span> PdfDocument();<span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 偶数页(第2、4、6...)</span><br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0"><span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">for</span> (<span class="hljs-built_in" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">int</span> i = <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">0</span>; i &lt; source.Pages.Count; i++)   <span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// i 是0基索引</span><br style="box-sizing: border-box; margin: 0">{<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment" style="color: rgba(141, 134, 135, 1); box-sizing: border-box; margin: 0">// 第1页的索引是0,第2页索引是1,依此类推</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">if</span> (i % <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">2</span> == <span class="hljs-number" style="color: rgba(249, 155, 21, 1); box-sizing: border-box; margin: 0">0</span>)<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oddPages.InsertPage(source, source.Pages);<br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword" style="color: rgba(129, 91, 164, 1); box-sizing: border-box; margin: 0">else</span><br style="box-sizing: border-box; margin: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evenPages.InsertPage(source, source.Pages);<br style="box-sizing: border-box; margin: 0">}<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">oddPages.SaveToFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"奇数页.pdf"</span>);<br style="box-sizing: border-box; margin: 0">evenPages.SaveToFile(<span class="hljs-string" style="color: rgba(72, 182, 133, 1); box-sizing: border-box; margin: 0">"偶数页.pdf"</span>);<br style="box-sizing: border-box; margin: 0"><br style="box-sizing: border-box; margin: 0">oddPages.Close();<br style="box-sizing: border-box; margin: 0">evenPages.Close();<br style="box-sizing: border-box; margin: 0">source.Close();<br style="box-sizing: border-box; margin: 0"></code></pre>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">这里容易混淆的是:</span><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">索引 i=0 对应第1页(奇数页)</strong><span style="box-sizing: border-box; margin: 0">,所以 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">i%2==0</code><span style="box-sizing: border-box; margin: 0"> 是奇数页。</span></p>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">五、和其他库简单对比一下(个人感受)</span></h2>
<figure class="figure-table" style="box-sizing: border-box; margin: 1em 0; text-align: center; overflow-x: auto; -webkit-overflow-scrolling: touch"><table style="box-sizing: border-box; display: table; width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 0.95em; text-align: left; margin: 0"><thead style="box-sizing: border-box; margin: 0"><tr style="box-sizing: border-box; margin: 0"><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">库</span></th><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">许可</span></th><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">优点</span></th><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">缺点</span></th></tr></thead><tbody style="box-sizing: border-box; margin: 0"><tr style="box-sizing: border-box; margin: 0"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">Free Spire.PDF</strong></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">免费社区版</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">API 很直观,不需要装 Adobe,页面复制时注释、表单、书签都保留得不错。</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">10页限制,超过就截断(这是硬伤)</span></td></tr><tr style="box-sizing: border-box; margin: 0; background-color: rgba(250, 250, 250, 1)"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">iTextSharp</strong></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">AGPL</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">功能最强,工业级。</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">AGPL 许可证对商业项目很不友好,想商用必须买授权,而且配置略繁琐。</span></td></tr><tr style="box-sizing: border-box; margin: 0"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><strong style="box-sizing: border-box; margin: 0; font-weight: 600; color: rgba(242, 151, 24, 1)">PdfSharp</strong></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">MIT</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">完全免费无限制,轻量。</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">页面复制的效果一般,有些复杂元素(比如某些字体或透明度)会丢失。</span></td></tr></tbody></table></figure>
<p style="box-sizing: border-box; margin: 0 0 1em; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">我个人建议:如果你只是偶尔处理一些 ≤10 页的 PDF,Free Spire.PDF 最省心。如果经常处理几十页的文件又不想花钱,可以试试 PdfSharp,但要做好“部分样式丢失”的心理准备。</span></p>
<hr style="box-sizing: border-box; margin: 1.5em 0; border-top: 2px solid rgba(230, 232, 235, 1); border-right: none; border-bottom: none; border-left: none; border-radius: 2px">
<h2 style="box-sizing: border-box; overflow-wrap: break-word; line-height: 1.35; margin: 0.3em 0; font-weight: 600; font-size: 1.35em; color: rgba(252, 252, 252, 1); background-color: rgba(242, 151, 24, 1); padding: 2px 12px; border-radius: 4px; display: inline-block"><span style="box-sizing: border-box; margin: 0">六、总结</span></h2>
<figure class="figure-table" style="box-sizing: border-box; margin: 1em 0; text-align: center; overflow-x: auto; -webkit-overflow-scrolling: touch"><table style="box-sizing: border-box; display: table; width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 0.95em; text-align: left; margin: 0"><thead style="box-sizing: border-box; margin: 0"><tr style="box-sizing: border-box; margin: 0"><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">需求</span></th><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">使用方法</span></th><th style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); font-weight: bold; color: rgba(242, 151, 24, 1); text-align: center; min-width: 6em"><span style="box-sizing: border-box; margin: 0">核心 API</span></th></tr></thead><tbody style="box-sizing: border-box; margin: 0"><tr style="box-sizing: border-box; margin: 0"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">每页单独保存</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">pdf.Split("pattern_{0}.pdf", 1)</code></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">内置 </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">Split</code></td></tr><tr style="box-sizing: border-box; margin: 0; background-color: rgba(250, 250, 250, 1)"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">每 N 页合为一个文件</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">手动循环 + </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">InsertPage</code></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">PdfDocument.InsertPage</code></td></tr><tr style="box-sizing: border-box; margin: 0"><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">按指定页码提取</span></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">手动筛选 + </span><code style="box-sizing: border-box; margin: 0; font-family: &quot;SF Mono&quot;, Consolas, &quot;Liberation Mono&quot;, Menlo, monospace; font-size: 0.9em; background-color: rgba(248, 249, 250, 1); color: rgba(242, 151, 24, 1); padding: 2px 4px; border-radius: 3px; word-break: break-all">InsertPage</code></td><td style="box-sizing: border-box; margin: 0; padding: 8px 12px; border: 1px solid rgba(230, 232, 235, 1); text-align: left"><span style="box-sizing: border-box; margin: 0">同上</span></td></tr></tbody></table></figure>
<p style="box-sizing: border-box; margin: 0; overflow-wrap: break-word; line-height: 1.8"><span style="box-sizing: border-box; margin: 0">掌握上述模式后,您可以灵活组合出满足各种业务规则的 PDF 拆分逻辑。代码均已在实际项目中验证,可直接复用。</span></p></section><br><br>
来源:https://www.cnblogs.com/jazz-z/p/19951840
頁: [1]
查看完整版本: C# 实现 PDF 页面拆分:单页、指定页精准拆分