該頁面可以包含自動翻譯的文字。
在 C# 和 VB.NET 中拆分 PDF 文件
Docotic.Pdf 程式庫 可讓您將 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 物件而產生額外負擔。除非測試證明平行程式更快,否則請使用單執行緒版本。