該頁面可以包含自動翻譯的文字。

在 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 物件相關的開銷。使用單執行緒版本,除非測試證明並 行程式碼更快。