该页面可以包含自动翻译的文本。
在 C# 和 VB.NET 中拆分 PDF 文档
Docotic.Pdf library 允许你将 PDF 文档拆分为一组较小的文件。你可以提取单独的页面或页面范围。你也可以基于特定条件拆分 PDF 文档。

Docotic.Pdf 提供付费许可证,但在某些情况下也可免费使用。请在 下载 C# .NET PDF 库 页面获取该库和一个有时限的免费许可证密钥。
PDF 拆分基础
PdfDocument.CopyPages 方法允许你从 PdfDocument 对象复制页面。这是用于拆分 PDF 文档的主要 Docotic.Pdf API。
将 PDF 拆分为单独的页面
下面的 C# 代码将每个 PDF 页面保存为单独的文件:
using var pdf = new PdfDocument("source.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
using PdfDocument copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save(i + ".pdf");
}
PdfDocument.RemoveUnusedResources 方法有助于减小输出文件大小。当复制的页面引用了未使用的字体、图像、图案时,它很有用。有关 PDF 压缩的更多信息,请参阅优化输出文件部分。
拆分为页面组
CopyPages 方法支持复制任意页面范围。下面的代码片段演示如何提取第三页和第一页:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.CopyPages([2, 0]);
copy.RemoveUnusedResources();
copy.Save("result.pdf");
页面索引的顺序很重要。它决定了结果文档中页面的顺序。
试试来自 GitHub 的 复制页面 代码示例。
按条件拆分 PDF
你可以基于内容拆分文档。当你事先不知道要提取哪些页面时,这很有帮助。例如,提取包含特定文本的页面:
string textToFind = ".NET Standard";
using var pdf = new PdfDocument("C# in depth.pdf");
var pageIndexes = new List<int>();
for (int i = 0; i < pdf.Pages.Count; i++)
{
string pageText = pdf.Pages[i].GetText();
if (pageText.Contains(textToFind, StringComparison.CurrentCultureIgnoreCase))
pageIndexes.Add(i);
}
if (pageIndexes.Count > 0)
{
using var copy = pdf.CopyPages(pageIndexes.ToArray());
copy.RemoveUnusedResources();
copy.Save(textToFind + ".pdf");
}
你可以在 在 C# 和 VB.NET 中从 PDF 提取文本 文章中了解更多关于文本提取的信息。
高级 PDF 拆分
提取页面
CopyPages 方法不会更改关联的 PdfDocument 对象。还有 PdfDocument.ExtractPages 方法。它们允许你从文档中移除已提取的页面:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");
pdf.Save("original.pdf");
你可以试试 GitHub 上对应的 提取页面 代码示例。
删除并重新排序页面
CopyPages 和 ExtractPages 方法会生成一个包含所选页面的新文档。另一种方式是从当前文档中删除页面:
using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf");
删除后你也可以重新排序页面。请查看这些部分中的代码示例:
优化输出文件
前面我使用了 RemoveUnusedResources 方法来优化生成的文件。Docotic.Pdf 为 PDF 压缩提供了更多选项。例如,你可以删除结构信息或压缩图像。有关更多信息,请阅读 在 C# 和 VB.NET 中压缩 PDF 文档 文章。你也可以试试 GitHub 上的 在 .NET 中压缩 PDF 文档 代码示例。
PDF 拆分有时用于获取小于某个限制的页面文件。在这种情况下,你可以测量生成文件的大小,并在必要时对其进行压缩。示例代码:
using var pdf = new PdfDocument("source.pdf");
using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();
using var ms = new MemoryStream();
copy.Save(ms);
var limit = 1024 * 1024;
if (ms.Length > limit)
{
compress(copy);
copy.Save("result.pdf");
}
请注意,将 PDF 文件压缩到某个限制以下可能是不可能的。结果取决于文件内容和限制值。
提取页面内容
在拆分时也可以更改页面内容。例如,你可以在将提取的页面用于 PDF 拼版之前缩放它们。试试 GitHub 上相关的 从页面创建 XObject 示例项目。
或者,你可以删除或替换提取页面上的某些内容。请查看 复制文本、路径和图片 代码示例,它演示了如何复制 PDF 页面对象。
将 PDF 拆分为图像
Docotic.Pdf 还允许你将 PDF 文档拆分为页面图像。有关更多细节,请阅读 在 C# 和 VB.NET 中将 PDF 转换为图像 文章。
在并行线程中拆分
对于大型文档,你可能希望并行化 PDF 拆分。PdfDocument 类不是线程安全的。但可以在每个线程中使用独立的 PdfDocument 对象:
string fileName = "source.pdf";
using var temp = new PdfDocument(fileName);
int pageCount = temp.PageCount;
Parallel.For(0, pageCount, i =>
{
using var pdf = new PdfDocument(fileName);
using var copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save($"split_{i}.pdf");
});
请注意,单线程代码通常更快。多线程方案会引入与解析额外 PdfDocument 对象相关的开销。除非测试证明并行代码更快,否则请使用单线程版本。