该页面可以包含自动翻译的文本。

在 C# 和 VB.NET 中拆分 PDF 文档

Docotic.Pdf 库 允许您将 PDF 文档分成一组较小的文件。您可以提取单个页面或页面范围。您还可以根据某些标准拆分 PDF 文档。

拆分 PDF 文档

Docotic.Pdf 附带 付费许可证,但在某些情况下也是 免费。您可以在 Docotic.Pdf 下载页面 下载库并获取评估许可证密钥。

Docotic.Pdf 库 9.4.17467-dev 回归测试 14,760 通过 NuGet 总下载量 4,415,970

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(new int[] { 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 中相应的 提取页面 代码示例。

删除和重新排序页面

CopyPagesExtractPages 方法会生成一个包含选定页面的新文档。另一种方法是从当前文档中删除页面:

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);

byte 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”对象相关的开销。除非测试证明并行代码更快,否则请使用单线程版本。