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

C# と VB.NET で PDF ドキュメントを圧縮する

多くの場合、PDF ドキュメントを圧縮して最適化したいというのは一般的な要望です。小さい PDF ドキュメントはネットワーク経由で転送しやすく、保存コストも低くなります。PDF ファイル サイズの削減は、特にアーカイブ用途で重要です。

C# と VB.NET で PDF ドキュメントを最適化する

PDF ドキュメントを最適化する .NET ライブラリ

Docotic.Pdf library を使用して、.NET Framework および .NET Core アプリケーションで PDF ドキュメントを圧縮できます。このライブラリは NuGet と当サイトから入手できます。ライブラリと、無料の期間限定ライセンス キーは C# .NET PDF ライブラリをダウンロード ページで入手できます。

Docotic.Pdf は次のようなさまざまな最適化手段を提供します:

  • PDF オブジェクトを最適化する
  • 重複する PDF オブジェクト(フォント、画像など)を削除する
  • 画像を圧縮する
  • フォントのサブセット化
  • メタデータを削除する
  • 構造情報を削除する
  • 未使用のリソースを削除する
  • プライベートなアプリケーションデータを削除する
  • フォームフィールドと注釈をフラット化する
  • フォントの埋め込みを解除する

上記のすべてを使用して、PDF ドキュメントを最適な圧縮率で処理できます。これらの手法が実際に動作する様子は、C# と VB.NET で PDF ドキュメントを圧縮する サンプルで確認してください。

これらの圧縮方法を、順に詳しく見ていきます。

PDF オブジェクトを最適化する

内部的には、PDF ファイルは辞書、ストリーム、配列などの低レベルな PDF オブジェクトの集合です。PDF ファイルを保存する際、Docotic.Pdf は既定で次の可逆最適化を適用します:

  • PDF ストリームを Flate エンコーディングで圧縮する
  • 未使用の PDF オブジェクトを削除する
  • 間接 PDF オブジェクトをインライン化する
  • PDF オブジェクトを書式設定なしで書き込む
  • PDF オブジェクトを圧縮オブジェクト ストリームにまとめる

このサンプルは、C# で PDF オブジェクトを最適化する方法を示します:

using BitMiracle.Docotic.Pdf;

using var pdf = new PdfDocument("input.pdf");
var saveOptions = new PdfSaveOptions();

// これらのオプションは既定で有効であり、暗黙的に適用されます:
//saveOptions.Compression = PdfCompression.Flate;
//saveOptions.RemoveUnusedObjects = true;
//saveOptions.OptimizeIndirectObjects = true;
//saveOptions.UseObjectStreams = true;
//saveOptions.WriteWithoutFormatting = true;

pdf.Save("compressed.pdf", saveOptions);

これらの最適化は、PDF ドキュメントの表示内容(テキスト、画像、ブックマークなど)には影響しません。影響するのは、出力 PDF ファイル内で PDF オブジェクトがどのように書き込まれ、圧縮されるかだけです。

未使用の PDF オブジェクトの削除は、以下で説明する他の手法にとって重要です。未使用オブジェクトを保持する強い理由がない限り、PdfSaveOptions.RemoveUnusedObjects プロパティを false に設定しないでください。

PDF ドキュメント内の重複オブジェクトを削除する

PDF ドキュメントを結合すると、生成された PDF には重複するフォントや画像が含まれることがよくあります。重複オブジェクトを置き換えると、生成された PDF ファイルのサイズ削減に役立ちます。以下は、この操作の C# サンプルです:

using var pdf = new PdfDocument("merged.pdf");
pdf.ReplaceDuplicateObjects();

pdf.Save("compressed.pdf");

画像を圧縮したりフォントの埋め込みを解除したりする前に、重複オブジェクトを削除することをお勧めします。そうしないと、同じ画像やフォントの複製を最適化するために、余計な処理が大量に発生します。

PdfDocument.ReplaceDuplicateObjects メソッドは、インライン画像を置き換えません。ドキュメントにインライン画像が含まれている場合は、先に PdfCanvas.MoveInlineImagesToResources メソッドを使用してください。このメソッドはインライン画像を通常の画像に変換し、その後で ReplaceDuplicateObjects メソッドが変換された画像も重複排除できるようになります。

PDF 内の画像を圧縮する

PDF 画像の最適化は、ラスター画像を含むドキュメントに対して通常もっとも効果的な圧縮方法です。

Docotic.Pdf library は、JPEG、CCITT Group 3 および 4(fax)、JPEG 2000、zip/deflate 圧縮アルゴリズムを使用して PDF 画像を再圧縮する組み込みメソッドを提供します。画像のサイズ変更や縮小により、PDF ファイル サイズをさらに削減することもできます。あるいは、サードパーティ製ツールで画像を独自に最適化してから、画像を置き換えることもできます。

例として、GitHub 上の C# と VB.NET で PDF ドキュメント内の画像を最適化する サンプルを参照してください。

フォントのサブセット化

PDF ドキュメントは通常、テキストの描画に使用するフォントを埋め込みます。埋め込みフォントには、サポートされるすべてのグリフに関する情報が含まれていることがよくあります。PDF ドキュメントで未使用のグリフを削除すると、出力ファイル サイズを大幅に削減できます。

このサンプルは、C# で PDF フォントを最適化する方法を示します:

using var pdf = new PdfDocument("text.pdf");
pdf.RemoveUnusedFontGlyphs();

pdf.Save("compressed.pdf");

サブセット化は、テキスト ボックスやコンボ ボックスなどの可変テキスト コントロールで使用されるフォントには影響しません。

メタデータを削除する

PDF ドキュメントには、作成者、キーワード、作成日時などの情報を含む、圧縮されていない XMP メタデータを含めることができます。このメタデータは、PDF ドキュメントの表示内容には影響しません。

このサンプルは、C# で PDF ファイルからメタデータを削除する方法を示します:

using var pdf = new PdfDocument("metadata.pdf");

XmpMetadata xmp = pdf.Metadata;
xmp.Unembed();
pdf.Info.Clear(false);

pdf.Save("compressed.pdf");

構造情報を削除する

PDF ドキュメントには、その論理構造に関する情報を含めることができます。この情報は次の目的で使用されます:

  • Tagged PDF ドキュメントを生成する
  • 支援技術向けに PDF ドキュメントを利用可能にする

このような情報を削除すると、PDF ファイル サイズの削減に役立ちます。ただし、PDF はもはや Tagged PDF ではなくなり、支援技術でも利用できなくなります。このサンプルは、C# で PDF から構造情報を削除する方法を示します:

using var pdf = new PdfDocument("tagged.pdf");
pdf.RemoveStructureInformation();

pdf.Save("compressed.pdf");

PDF から未使用のリソースを削除する

PDF ページと XObject は、実際に使用するより多くのフォント、画像、またはパターンを参照している場合があります。PdfDocument.RemoveUnusedResources メソッドを使用すると、PDF から未使用のリソースを削除できます。以下は C# サンプルです:

using var pdf = new PdfDocument("input.pdf");
pdf.RemoveUnusedResources();

pdf.Save("compressed.pdf");

PDF からプライベートなアプリケーションデータを削除する

Adobe ソフトウェアによって生成された PDF ドキュメントには、プライベートなアプリケーションデータが含まれることがあります。そのようなアプリケーションデータは page-piece 辞書に格納されます。

このサンプルは、page-piece 辞書を削除して C# で PDF をクリーンアップおよび圧縮する方法を示します:

using var pdf = new PdfDocument("input.pdf");
pdf.RemovePieceInfo();

pdf.Save("compressed.pdf");

PDF フォームフィールドと注釈をフラット化する

フォームが入力済みの PDF ドキュメントは、フォームフィールドをフラット化することでサイズを削減できます。フラット化すると、フォームフィールドは視覚的な表現に置き換えられます。入力された値は保持されます。この C# サンプルは、すべての PDF フォームフィールドをフラット化する方法を示します:

using var pdf = new PdfDocument("form.pdf");
pdf.FlattenControls();

pdf.Save("compressed.pdf");

代わりに、PdfDocument.FlattenWidgets メソッドを使用して、すべての注釈とコントロールをフラット化することもできます。

また、PdfWidget.Flatten メソッドを使用すると、個々の注釈またはコントロールをフラット化できます。

フォントの埋め込みを解除する

PDF フォントの埋め込みは、カスタムフォントや希少なフォントでは理にかなっています。一方で、Arial や Verdana のような広く利用可能なフォントは、正当な理由なく PDF ファイル サイズを増やすことがあります。対象プラットフォームで利用可能な一般的なフォントの埋め込みを解除できます。C# のサンプルコード:

using var pdf = new PdfDocument("input.pdf");
UnembedFonts(pdf);
pdf.Save("compressed.pdf");

/// <summary>
/// このメソッドは、次のいずれかに該当するフォントの埋め込みを解除します:
/// * OS にインストールされている
/// * または名前が "always unembed" リストに含まれている
/// * かつ名前が "always keep" リストに含まれていない。
/// </summary>
private static void UnembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = ["MyriadPro-Regular"];
    string[] alwaysKeepList = ["ImportantFontName", "AnotherImportantFontName"];

    using var ms = new MemoryStream();

    foreach (PdfFont font in pdf.GetFonts())
    {
        if (!font.Embedded ||
            font.EncodingName == "Built-In" ||
            Array.Exists(alwaysKeepList, name => font.Name == name))
        {
            continue;
        }

        if (font.Format == PdfFontFormat.TrueType || font.Format == PdfFontFormat.CidType2)
        {
            SystemFontLoader loader = SystemFontLoader.Instance;

            ms.Position = 0;
            if (loader.TryLoad(font.Name, font.Bold, font.Italic, ms))
            {
                font.Unembed();
                continue;
            }
        }

        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

この手法は PDF/A ドキュメントでは使用しないでください。PDF/A ドキュメントでは、すべてのフォントを埋め込む必要があります。

埋め込み解除したフォントを含む PDF ドキュメントは、対象 OS(Windows、Linux、macOS、iOS、Android)と PDF ビューアー(Adobe、Foxit など)で必ずテストしてください。

PDF サイズを削減するその他の方法

上記の最適化手法は多数ありますが、重要でないコンテンツを削除することで PDF ドキュメントをさらに圧縮できます。Docotic.Pdf では、PDF ドキュメントから次のオブジェクトを削除できます:

  • 注釈
  • 添付ファイル
  • ブックマーク
  • フォームフィールド
  • ページ
  • スクリプト
  • 透明度

PDF ページからテキスト、画像、ベクトル グラフィックスも削除できます。テキストのフラット化も可能です。

結論

Docotic.Pdf library を使用して、C# と VB.NET で PDF を圧縮できます。Docotic.Pdf は、多くの効果的な最適化手段を提供します。

GitHub から完全版の C# と VB.NET で PDF ドキュメントを圧縮する サンプルをダウンロードしてお試しください。

お問い合わせいただければ、PDF ドキュメントで最適な圧縮率を実現する方法をご案内します。