このページには自動翻訳されたテキストを含めることができます。

C# および VB.NET で PDF ドキュメントを分割する

Docotic.Pdf library を使用すると、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 メソッドは、任意のページ範囲のコピーをサポートします。このコードスニペットは、3 ページ目と 1 ページ目を抽出する方法を示します。

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

テキスト抽出の詳細は、PDF から C# と VB.NET でテキストを抽出する 記事を参照してください。

詳細な 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 面付けで使用する前に抽出したページを拡大縮小できます。関連する ページから XObject を作成する サンプルプロジェクトを GitHub で試してください。

また、抽出したページ上の一部の内容を削除または置換することもできます。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 オブジェクトの解析に関連するオーバーヘッドが発生します。テストで並列コードの方が高速であると確認できない限り、単一スレッド版を使用してください。