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

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

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

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

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

Docotic.Pdf ライブラリ を使用して、.NET Framework および .NET Core アプリケー ションで PDF ドキュメントを圧縮します。 ライブラリの バイナリ をダウンロードす るか、その NuGet パッケージを使用できます。 評価モードの制限なしでライブラリ を試すには、こちらのフォーム を使用して、無料の期間限定ライセンス キー を取得できます。

Docotic.Pdf は、さまざまな最適化手段を提供します。

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

上記のすべてを使用して、PDF ドキュメントの最適な圧縮率を得ることができます。 Compress PDF document in .NET サンプルを見て、これらすべてのテクニックが実際に動作しているこ とを確認してください。

これらの圧縮方法をさらに詳しく見てみましょう。

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 ライブラリは、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 ドキュメントには、その論理構造に関する情報を含めることができます。 この情報は次の目的で使用されます。

  • タグ付き PDF ドキュメントを作成します
  • 補助デバイスで PDF ドキュメントにアクセスできるようにする

このような情報を削除すると、PDF ファイルのサイズを小さくすることができます。 ただし、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 ドキュメントには、プライベートなアプリケーション データが含まれ る場合があります。 このようなアプリケーション データは、ページ単位の辞書に格納されます。

このサンプルでは、ページ単位の辞書を削除して 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にインストールされています
/// * またはその名前が「常に埋め込み解除」リストに含まれている
/// * そしてその名前は「常に保持」リストには含まれません。
/// </summary>
private static void unembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = new string[] { "MyriadPro-Regular" };
    string[] alwaysKeepList = new string[] { "ImportantFontName", "AnotherImportantFontName" };

    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;
            byte[] fontBytes = loader.Load(font.Name, font.Bold, font.Italic);
            if (fontBytes != null)
            {
                font.Unembed();
                continue;
            }
        }
        
        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

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

ターゲット オペレーティング システム (Windows、Linux、macOS、iOS、Android) および PDF ビューア (Adobe、Foxit など) で、フォントが埋め込まれていない PDF ドキュメントを常にテストしてください。

PDF サイズを縮小するその他の方法

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

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

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

結論

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

GitHub から完全な Compress PDF document in C# and VB.NET サンプルをダ ウンロードして試してください。

お問い合わせ していただければ、PDF ドキュメントの最適な圧縮率を達成する方法をア ドバイスさせていただきます。