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

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

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 から試すことができます。

ページの削除と並べ替え

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

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 オブジェクトの解析に関連するオー バーヘッドが伴います。並列コードの方が高速であることがテストで証明されない限り、シングルスレッド バージョンを使用してください。