PyMuPDFを使ったPDFファイルサイズの最適化:3つの重要な技術
今日のペースの速いワークフローにおいて、巨大なPDFはボトルネックとなり得ます。メール添付を遅くし、貴重なストレージを消費し、モバイルビューアーをイライラさせます。高解像度画像、埋め込みフォント、隠されたメタデータがファイルを肥大化させる場合、的を絞った最適化戦略が不可欠です。この記事では、3つのコア技術(メタデータやその他の無駄な重量の除去、画像圧縮、フォントサブセット化)について説明し、PyMuPDFの直感的なAPIが、どのように巨大な文書をより軽量で高速なPDFに変換することを容易にするかを示します。
1. 無駄な重量の除去
なぜ人気なのか
PDFは、隠されたメタデータ(作成者名、タイムスタンプ、改訂履歴)、ページサムネイル、埋め込みファイル、長い注釈チェーン、さらには古いフォームフィールド値などの形で「無駄な重量」を蓄積する傾向があります。これらすべての余分な荷物は、ファイルサイズを膨張させるだけでなく、機密情報を漏洩させる可能性があります。
典型的な使用例
- ホワイトペーパーや仕様書の公開
- ウェブサイトやアプリへのPDF埋め込み
- 配布前のプライベートデータの除去
PyMuPDFがどのように役立つか
Document.scrub()への1回の呼び出しで、不要なものをすべて削除できます:
import pymupdf
doc = pymupdf.open("input.pdf")
doc.scrub(
metadata=True, # Clears basic metadata
xml_metadata=True, # Removes XML metadata
attached_files=True, # Deletes file attachments
embedded_files=True, # Deletes embedded files
thumbnails=True, # Strips page thumbnails
reset_fields=True, # Reverts form fields to their defaults
reset_responses=True, # Removes annotation replies
)
doc.ez_save("lean.pdf")
ここで、scrub()
は不要なオブジェクトを削除し、ez_save()(「イージーセーブ」と発音)は論理的に削除されたコンテンツが出力から物理的に削除されることを保証します。結果として、より小さく、プライバシーが安全なPDFが得られます。
最適な結果を得るために、この方法はファイルを保存する直前に一度だけ実行してください。
ファイル保存の詳細については、セクション「4. 高度な保存オプション」を参照してください。
2. フォントサブセット化
なぜ人気なのか
完全なフォントファイル(それぞれ数十キロバイトから数百キロバイト)を埋め込むことで、特に文書が少数の文字しか使用していない場合、シンプルなPDFが重いダウンロードになってしまいます。
典型的な使用例
- 大きな文字セットを持つ多言語マニュアルの作成
- リッチテキスト注釈の作成
- リッチテキストウィジェット(フォームフィールド)の作成または更新
PyMuPDFがどのように役立つか
PyMuPDFは埋め込みフォントを自動的にサブセット化し、各フォントで実際に使用されているグリフのみを保持できます:
doc.subset_fonts()
doc.ez_save("output.pdf")
このプロセスは、視覚的な忠実性を犠牲にすることなく、フォント関連のオーバーヘッドを大幅に削減します。
重要
この方法は、ファイルを保存する直前に一度だけ実行してください。
3. 高度な画像圧縮
なぜ人気なのか
高解像度画像は、しばしばPDF肥大化の最大の原因です。数枚の300 DPI写真で数十メガバイトを追加し、アップロード速度を殺し、受信トレイを詰まらせ、モバイルユーザーをイライラさせる可能性があります。
典型的な使用例
- スライドデッキ、製品カタログ、パンフレットのメール送信
- モバイルアプリ用の軽量PDFの公開
- 容量制限のあるドライブでのスキャン文書のアーカイブ
PyMuPDFがどのように役立つか
PyMuPDFのDocument.rewrite_images()は、ピクセルレベルの制御を提供します。ダウンサンプリング、再圧縮、またはグレースケールへの変換:
import pymupdf
doc = pymupdf.open("input.pdf")
doc.rewrite_images(
dpi_threshold=100, # only process images above 100 DPI
dpi_target=72, # downsample to 72 DPI
quality=60, # JPEG quality level
lossy=True, # include / exclude lossy images
lossless=True, # include / exclude lossless images
bitonal=True, # include / exclude monochrome images
color=True, # include / exclude colored images
gray=True, # include / exclude gray-scale images
set_to_gray=True, # convert to gray-scale before conversion
)
doc.ez_save("compressed_images.pdf")
この例では、100 DPIを超えるすべての画像が、60%品質の72 DPIグレースケールJPEGになり、多くの場合画像サイズを70〜90%削減します。
絶対最小サイズ
画像が本当に必要ない場合は、墨消し注釈を使用して完全に削除できます:
for page in doc:
page.add_redact_annot(page.rect)
page.apply_redactions(
images=pymupdf.PDF_REDACT_IMAGE_REMOVE, # remove images
graphics=pymupdf.pymupdf.PDF_REDACT_LINE_ART_NONE, # don't touch graphics
text=pymupdf.PDF_REDACT_TEXT_NONE, # don't touch text
)
doc.ez_save("images_stripped.pdf")
ここで、墨消し注釈はすべてのページ画像を削除し、テキストとベクターグラフィックスのみを残します。
4. 高度な保存オプション
これまでに行った「スクラビング」、画像ダウンサンプリング、フォントサブセット化は、すべてメモリ内でのみ行われました。参照されなくなったオブジェクト(「ゴースト」)を物理的に削除し、PDFの内部ストリームを圧縮しなければ、ファイルは同じように巨大なままです。
PyMuPDFのDocument.save()パラメータは、書き込み時にガベージコレクションと圧縮をトリガーできます:
-
garbage=3
もう参照されていないすべてのオブジェクトの重複除去と削除を行います。 -
deflate=True
圧縮されていないストリーム(画像、フォントなど)にzlib圧縮を適用します。 -
use_objstms=True
テキストベースのPDFオブジェクト定義を圧縮可能なストリームに変換し、多くの場合サイズをさらに25%以上削減します。
doc.save(
"output.pdf",
garbage=3, # de-duplicate and drop unreferenced objects
deflate=True, # zlib-compress any loose streams
use_objstms=True # convert text objects into compressible streams
)
# Or simply:
doc.ez_save("output.pdf")
メソッドez_save()は、これらのオプションを内部で適用し、ディスク上のPDFが行った最適化を真に反映することを保証します。
結論
無駄な重量の除去、画像最適化、フォントサブセット化を組み合わせることで、巨大なPDFを洗練された軽量な文書に変換できます。これは、メール、モバイルアプリ、ウェブ公開に理想的です。PyMuPDFの直感的なAPIは、これらの強力な技術を手の届くところに置き、配信制約ではなくコンテンツに集中できるようにします。PDFワークフローを大幅に改善する準備はできていますか?PyMuPDFドキュメントに飛び込んで、トリミングを始めましょう!
Discussion