DioDocs for PDFを使用してPDFファイルを最適化する

今回は「DioDocs for PDF(ディオドック)」の機能で、PDFファイルを最適化するためのいくつかの方法を紹介します。PDFファイルを最適化することで、ファイルサイズを縮小して読み込みや表示を高速化することができます。

重複している画像の削除

PDFファイルでは、複数のページにわたって同じ画像が表示されるケースがあります。この場合、重複した画像がPDFファイルに含まれるようになりファイルサイズが大きくなります。DioDocs for PDFでは、重複した画像を削除して1つだけ残してPDFドキュメント全体で参照することでファイルサイズを削減できます。

DioDocs for PDFでは、PDFファイルから重複した画像を検出して削除する機能としてGcPdfDocumentクラスにRemoveDuplicateImagesメソッドが用意されています。

// PDFファイルを読み込み、重複する画像を削除して最適化します
using FileStream fs = File.OpenRead("RemoveDuplicateImages_before.pdf");
GcPdfDocument doc = new();
doc.Load(fs);

long sizeBefore = new FileInfo("RemoveDuplicateImages_before.pdf").Length;
Console.WriteLine($"Before image optimization: {sizeBefore} bytes");

doc.RemoveDuplicateImages();

doc.Save("RemoveDuplicateImages_after.pdf");

var sizeAfter = new FileInfo("RemoveDuplicateImages_after.pdf").Length;
Console.WriteLine($"After image optimization: {sizeAfter} bytes");
重複している画像の削除
重複している画像の削除

フォントの最適化

PDFファイルでは、同じフォントのサブセットが複数埋め込まれている場合に、未使用もしくは重複したフォントが含まれていることがあります。同じフォントのサブセットをマージしたり、重複フォントや未使用フォントを削除することでファイルサイズを削減できます。

DioDocs for PDFでは、PDFファイルのフォントを最適化する機能としてGcPdfDocumentクラスにOptimizeFontsメソッドが用意されています。

// PDFファイルを読み込み、重複フォントを統合&未使用のフォントを削除して最適化します
using FileStream fs2 = File.OpenRead("OptimizeFonts_before.pdf");
GcPdfDocument doc2 = new();
doc2.Load(fs2);

long sizeBefore2 = new FileInfo("OptimizeFonts_before.pdf").Length;
Console.WriteLine($"Before font optimization: {sizeBefore2} bytes");

doc2.OptimizeFonts();

doc2.Save("OptimizeFonts_after.pdf");

long sizeAfter2 = new FileInfo("OptimizeFonts_after.pdf").Length;
Console.WriteLine($"After font optimization: {sizeAfter2} bytes");
フォントの最適化
フォントの最適化

添付ファイルの削除

PDFファイルに画像やドキュメントなどの添付ファイルが含まれる場合、ファイルサイズが大きくなります。PDFファイルを保管する際に不要な添付ファイルであれば、これらを削除することでファイルサイズを削減できます。

DioDocs for PDFでは、添付ファイルを削除する機能としてGcPdfDocumentクラスのEmbeddedFilesプロパティからアクセスできる、FileSpecificationコレクションのClearメソッドが用意されています。

// PDFファイルを読み込み、添付ファイルを削除して最適化します
using FileStream fs3 = File.OpenRead("DocAttachments_before.pdf");
GcPdfDocument doc3 = new();
doc3.Load(fs3);

long sizeBefore3 = new FileInfo("DocAttachments_before.pdf").Length;
Console.WriteLine($"Before removing attachments: {sizeBefore3} bytes");

doc3.EmbeddedFiles.Clear();

doc3.Save("DocAttachments_after.pdf");

long sizeAfter3 = new FileInfo("DocAttachments_after.pdf").Length;
Console.WriteLine($"After removing attachments: {sizeAfter3} bytes");
添付ファイルの削除
添付ファイルの削除

オブジェクトストリームを使用した最適化

オブジェクトストリーム(Object Stream) は、PDFファイル内の間接オブジェクト(Indirect Object)をまとめて1つの圧縮されたストリームとして格納する機能です。PDFバージョン1.5で導入され、ファイルサイズの縮小やアクセス効率の向上を目的としています。

DioDocs for PDFの最新バージョン「V8J」では、PDFファイルを保存する際にSavePdfOptionsクラスのUseObjectStreamsプロパティを使用してオブジェクトストリームの適用方法を設定できます。

// PDFファイルを読み込み、オブジェクトストリームを使用してドキュメントサイズを削減
using FileStream fs4 = File.OpenRead("ObjectStreams_before.pdf");
GcPdfDocument doc4 = new();
doc4.Load(fs4);

long sizeBefore4 = new FileInfo("ObjectStreams_before.pdf").Length;
Console.WriteLine($"Before using object streams: {sizeBefore4} bytes");

doc4.Save("ObjectStreams_after.pdf", new SavePdfOptions(SaveMode.Default, PdfStreamHandling.MinimizeSize, UseObjectStreams.Multiple));

long sizeAfter4 = new FileInfo("ObjectStreams_after.pdf").Length;
Console.WriteLine($"After using object streams: {sizeAfter4} bytes");
オブジェクトストリームを使用した最適化
オブジェクトストリームを使用した最適化

今回紹介した機能については以下のサンプルやデモで動作を確認いただけます。

DioDocsの最新バージョン「V8J」の新機能については、以下のページで紹介していますのでこちらも是非ご覧ください。

さいごに

弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。

また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。

\  この記事をシェアする  /