C#でPDFサイズの最適化、圧縮、削減

PDFドキュメントには時々追加データが含まれていることがあります。PDFファイルのサイズを小さくすることで、ネットワーク転送とストレージの最適化に役立ちます。これは、Webページへの公開、ソーシャルネットワークでの共有、電子メールでの送信、またはストレージでのアーカイブに特に便利です。PDFを最適化するためにいくつかの技術を使用できます:

  • オンライン閲覧用にページコンテンツを最適化する
  • すべての画像を縮小または圧縮する
  • ページコンテンツの再利用を有効にする
  • 重複するストリームをマージする
  • 埋め込まれていないフォント
  • 使用されていないオブジェクトを削除する
  • フォームフィールドのフラット化を解除する
  • アノテーションを削除またはフラット化する

Web用PDFドキュメントの最適化

Web用の最適化、または線形化は、Webブラウザを使用してオンライン閲覧に適したPDFファイルを作成するプロセスを指します。ファイルをWeb表示用に最適化するには:

  1. Documentオブジェクトで入力ドキュメントを開く。
  2. 最適化されたドキュメントを保存メソッドを使用して保存します。

次のコードスニペットは、Aspose.PDF.Drawingライブラリでも動作します。

次のコードスニペットは、PDFドキュメントをウェブ用に最適化する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");

// ウェブ用に最適化
pdfDocument.Optimize();

dataDir = dataDir + "OptimizeDocument_out.pdf";

// 出力ドキュメントを保存
pdfDocument.Save(dataDir);

PDFサイズを縮小

OptimizeResources()メソッドを使用すると、不要な情報を省くことでドキュメントのサイズを削減できます。 OptimizeResources() メソッドは、不要な情報を取り除くことで文書サイズを削減することができます。

  • 文書のページで使用されていないリソースは削除されます
  • 同じリソースは一つのオブジェクトに結合されます
  • 使用されていないオブジェクトは削除されます

以下のスニペットは一例です。ただし、この方法が文書の縮小を保証するわけではないことに注意してください。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "ShrinkDocument.pdf");
// PDFドキュメントを最適化します。ただし、この方法が文書の縮小を保証するわけではないことに注意してください。
pdfDocument.OptimizeResources();
dataDir = dataDir + "ShrinkDocument_out.pdf";
// 更新されたドキュメントを保存する
pdfDocument.Save(dataDir);

最適化戦略の管理

最適化戦略をカスタマイズすることもできます。 最適化戦略をカスタマイズすることもできます。

すべての画像の圧縮または縮小

画像を扱う方法は2つあります: 画像の品質を下げるか、解像度を変更するかです。いずれの場合も、ImageCompressionOptionsを適用する必要があります。次の例では、ImageQualityを50に減らすことにより画像を縮小しています。

ImageQualityはJPEGの品質と同様に機能し、値0は最低、値100は最高です。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET を参照してください
// 文書ディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// 文書を開く
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// OptimizationOptionsを初期化
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// CompressImagesオプションを設定
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// ImageQualityオプションを設定
optimizeOptions.ImageCompressionOptions.ImageQuality = 50;
// OptimizationOptionsを使用してPDF文書を最適化
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "Shrinkimage_out.pdf";
// 更新された文書を保存
pdfDocument.Save(dataDir);

画像のサイズを低解像度でリサイズする方法もあります。この場合、ResizeImagesをtrueに設定し、MaxResolutionを適切な値に設定する必要があります。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください
// 時間の初期化
var time = DateTime.Now.Ticks;
// ドキュメントディレクトリへのパス
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "ResizeImage.pdf");
// OptimizationOptionsの初期化
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// CompressImagesオプションを設定
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// ImageQualityオプションを設定
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// ResizeImageオプションを設定
optimizeOptions.ImageCompressionOptions.ResizeImages = true;
// MaxResolutionオプションを設定
optimizeOptions.ImageCompressionOptions.MaxResolution = 300;
// OptimizationOptionsを使用してPDFドキュメントを最適化
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "ResizeImages_out.pdf";
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir);

もう一つの重要な問題は実行時間です。しかし、この設定も管理できます。現在、私たちは二つのアルゴリズム - スタンダードとファストを使用できます。実行時間を制御するために、バージョン プロパティを設定する必要があります。次のスニペットはファストアルゴリズムを示しています:

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET にアクセスしてください。
// 時間の初期化
var time = DateTime.Now.Ticks;
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// OptimizationOptionsの初期化
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// CompressImagesオプションを設定
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// ImageQualityオプションを設定
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// イメージ圧縮バージョンをファストに設定
optimizeOptions.ImageCompressionOptions.Version = Pdf.Optimization.ImageCompressionVersion.Fast;
// OptimizationOptionsを使用してPDFドキュメントを最適化
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "FastShrinkImages_out.pdf";
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir);
Console.WriteLine("Ticks: {0}", DateTime.Now.Ticks - time);

使用されていないオブジェクトの削除

PDFドキュメントには、ドキュメント内の他のオブジェクトから参照されていないPDFオブジェクトが含まれていることがあります。たとえば、ドキュメントのページツリーからページが削除された場合でも、ページオブジェクト自体が削除されない場合があります。これらのオブジェクトを削除してもドキュメントが無効になるわけではなく、ドキュメントが縮小されます。

// 完全な例やデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// RemoveUsedObject オプションを設定
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    RemoveUnusedObjects = true
};
// OptimizationOptions を使用して PDF ドキュメントを最適化
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir);

使用されていないストリームの削除

ドキュメントには使用されていないリソースストリームが含まれていることがあります。 時々、ドキュメントには使用されていないリソースストリームが含まれています。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパスです。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// RemoveUsedStreams オプションを設定する
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    RemoveUnusedStreams = true
};
// OptimizationOptions を使用して PDF ドキュメントを最適化する
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// 更新されたドキュメントを保存する
pdfDocument.Save(dataDir);

重複するストリームのリンク

一部のドキュメントには、複数の同一のリソースストリーム(例えば画像など)が含まれている場合があります。 いくつかのドキュメントには、同一のリソースストリーム(例えば画像など)がいくつも含まれている場合があります。

// 完全な例やデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパスです。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// LinkDuplcateStreams オプションを設定する
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    LinkDuplcateStreams = true
};
// OptimizationOptions を使用して PDF ドキュメントを最適化する
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// 更新されたドキュメントを保存する
pdfDocument.Save(dataDir);

さらに、AllowReusePageContent の設定を使用することができます。 さらに、AllowReusePageContent 設定を使用することができます。

// 完全な例やデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// AllowReusePageContent オプションを設定
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    AllowReusePageContent = true
};
Console.WriteLine("開始");
// OptimizationOptions を使用して PDF ドキュメントを最適化
pdfDocument.OptimizeResources(optimizeOptions);
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("完了");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("元のファイルサイズ: {0}. 削減後のファイルサイズ: {1}", fi1.Length, fi2.Length);

フォントの埋め込み解除

ドキュメントが埋め込みフォントを使用している場合、すべてのフォントデータがドキュメントに保存されています。その利点は、ユーザーのマシンにフォントがインストールされているかどうかに関わらず、ドキュメントが表示できることです。しかし、フォントを埋め込むとドキュメントのサイズが大きくなります。フォントの埋め込み解除メソッドは、すべての埋め込みフォントを削除します。これにより、ドキュメントのサイズは減少しますが、正しいフォントがインストールされていない場合、ドキュメント自体が読めなくなる可能性があります。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// UnembedFonts オプションを設定
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    UnembedFonts = true
};
Console.WriteLine("開始");
// OptimizationOptionsを使用してPDFドキュメントを最適化
pdfDocument.OptimizeResources(optimizeOptions);
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("完了");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("元のファイルサイズ: {0}. 減少したファイルサイズ: {1}", fi1.Length, fi2.Length);

最適化リソースは、これらの方法をドキュメントに適用します。これらの方法のいずれかが適用された場合、ドキュメントのサイズはおそらく減少します。これらの方法が適用されない場合、ドキュメントのサイズは変わらないでしょう。

PDFドキュメントサイズを減らす追加の方法

注釈の削除またはフラット化

注釈は不要な場合に削除できます。編集が必要ないが必要な場合には、フラット化できます。これらの技術はファイルサイズを減らします。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// 注釈をフラット化
foreach (var page in pdfDocument.Pages)
{
    foreach (var annotation in page.Annotations)
    {
        annotation.Flatten();
    }

}
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");

フォームフィールドの削除

PDFドキュメントにAcroFormsが含まれている場合、フォームフィールドをフラット化することでファイルサイズを減らすことができます。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_Forms();

// ソースPDFフォームを読み込む
Document doc = new Document(dataDir + "input.pdf");

// フォームをフラット化
if (doc.Form.Fields.Count() > 0)
{
    foreach (var item in doc.Form.Fields)
    {
        item.Flatten();
    }
}

dataDir = dataDir + "FlattenForms_out.pdf";
// 更新されたドキュメントを保存
doc.Save(dataDir);

PDFをRGBカラースペースからグレースケールに変換する

PDFファイルはテキスト、イメージ、添付ファイル、注釈、グラフ、その他のオブジェクトで構成されています。 PDFファイルにはテキスト、画像、添付ファイル、注釈、グラフ、その他のオブジェクトが含まれています。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// ソースPDFファイルをロード
using (Document document = new Document(dataDir + "input.pdf"))
{
    Aspose.Pdf.RgbToDeviceGrayConversionStrategy strategy = new Aspose.Pdf.RgbToDeviceGrayConversionStrategy();
    for (int idxPage = 1; idxPage <= document.Pages.Count; idxPage++)
    {
        // PDF内の特定のページのインスタンスを取得
        Page page = document.Pages[idxPage];
        // RGBカラースペースの画像をグレースケールカラースペースに変換
        strategy.Convert(page);
    }
    // 結果のファイルを保存
    document.Save(dataDir + "Test-gray_out.pdf");
}

FlateDecode圧縮

Aspose.PDF for .NETは、PDF最適化機能のためのFlateDecode圧縮をサポートしています。 Aspose.PDF for .NETは、PDF最適化機能のためのFlateDecode圧縮をサポートしています。

XImageCollectionに画像を保存する

Aspose.PDF for .NETは、XImageCollectionに新しい画像をFlateDecode圧縮で保存する機能を提供します。このオプションを有効にするには、ImageFilterType.Flateフラグを使用できます。以下のコードスニペットは、この機能を使用する方法を示しています: