PDFがほとんど小さくならないのはなぜ?
圧縮ツールにPDFをかけたら4.1 MBが4.0 MBにしかならなかった。ツールが壊れているの?
PDFは書類キャビネットのようなもの
がっかりの原因になっているのは、PDFを文書の画像だと考えるイメージです。そうではありません。ISO 32000で定義されているPDFは、番号の付いたオブジェクトを収めたコンテナです。ページツリー、描画演算子が詰まったコンテンツストリーム、埋め込みフォントプログラム、画像XObject、フォームフィールド、注釈、しおり、そして各オブジェクトの開始位置を示す相互参照テーブルが入っています。
これらのオブジェクトの大半は、すでに圧縮されています。コンテンツストリームはたいていFlateで符号化されていますが、これはZIPファイルが使うのと同じアルゴリズムです。埋め込まれた写真はたいていDCTストリームとして格納されていて、その中身はそのまま通されたJPEGデータです。つまり汎用の圧縮ツールがPDFを見るとき、目の前にあるのは、それぞれがすでに一度圧縮された物の詰まった箱なのです。
圧縮する前に、バイトがどこにあるかを突き止める
最も役に立つ診断は、手元の文書がどの種類なのかを知ることです。それだけで結果はほぼ完全に予測できます。
| 文書の種類 | バイトの所在 | 構造的な保存でできること |
|---|---|---|
| ワープロで作成したテキスト中心の報告書 | 埋め込みフォントプログラムと小さなコンテンツストリーム | ほとんど何も。内容はすでに詰まっている |
| スキャンしたページ | 1ページにつき1枚の大きな画像 | 画像に手を付けなければ、ほぼ何もできない |
| プレゼン資料の書き出し | 埋め込み写真とグラデーション | 同じ画像が複数のスライドで重複していれば、いくらかは削れる |
| 設計図面 | 長いベクターのコンテンツストリーム | ストリームの再符号化と未使用オブジェクトの削除で、いくらかは削れる |
| 添付ファイル付きのフォーム | 埋め込みファイル、JavaScript、注釈辞書 | 余分なものを削除できるなら、大きく削れる |
構造的な保存が実際に削るもの
構造的な保存は、どのページの見た目も変えずに文書を書き直します。もう何からも参照されていないオブジェクトを削除できます。こうしたオブジェクトは、文書を編集して差分保存するたびに溜まっていきます。相互参照テーブルを圧縮し、小さなオブジェクトをオブジェクトストリームにまとめることもできます。文書のメタデータ、サムネイル、そして一部の生成ソフトが残していく編集履歴も削除できます。
何度も編集と再保存を繰り返した文書なら、これは大きな効果になります。一方、ワープロから一度きれいに書き出しただけの文書には、拾い集めるものがありません。ファイルはすでに最小に近い形になっており、4 MBから100 KB減るというのは、まさに予想どおりの結果です。
テキスト中心の文書が縮まない理由
テキスト中心のPDFでは、ファイルの大部分をたいてい埋め込みフォントが占めています。フォントプログラムはグリフのアウトラインとヒンティング命令を収めたコンパクトなバイナリで、その書体が入っていないマシンでも文書が同じように表示されるように埋め込まれています。さらにサブセット化するか削除するかしない限り、圧縮で消すことはできませんし、削除すればページの見え方が変わります。
テキストそのものはごくわずかです。文章100ページ分の文字は、圧縮前でも数百KBにしかなりません。テキスト中心のPDFが大きいなら、注目すべきは文字ではなく、フォントと、文字の裏に隠れている画像です。ヘッダーで繰り返されるロゴや、背景の透かしなどが該当します。
スキャン文書が劇的に縮む理由
スキャンしたページは、紙を1枚まるごと撮った大きな写真であり、多くは300 DPI以上で取り込まれています。A4ページを300 DPIで取り込むとおよそ2480 × 3508ピクセル、900万近いピクセル数になります。情報としての中身は数KB分のテキストにすぎないのにです。スキャン文書がラスタライズ圧縮に劇的に反応するのはこのためです。レンダリング解像度を下げてページ画像を再符号化すれば、ファイルの中で本当に大きな部分を直接攻められます。
同時に、このモードが破壊的である理由でもあります。ページが画像になった時点で、検索可能なテキストレイヤー、リンク、フォームフィールド、注釈、アクセシビリティ用のタグ構造、そして電子署名は失われます。FileSlimmerはラスタライズを、構造的な保存の結果が期待外れだったときに黙って切り替わる代替手段ではなく、警告を添えて明示した独立のモードとして扱っています。
誰も具体的な数値を約束できない理由
PDFの目標サイズ指定は、レンダリング解像度と画像品質を探索する処理であり、その探索には下限があります。ある解像度を下回ると、スキャン文書の文字は読めなくなります。特定の文書がその下限より上で特定の目標に収まるかどうかは、ページ数、インクの被覆率、写真的な内容の量、スキャナーのノイズによって決まります。同じページ数の文書2つが、まったく違うサイズになることもあります。
誠実な振る舞いは、下限で止まって探索がどこで終わったかを報告することであり、FileSlimmerのPDF目標サイズのプリセットはそのように動きます。入力した数値に必ず到達するツールは、その数値について嘘をついているか、到達するために文書を壊しているかのどちらかです。
ツールを疑う前に
- そのPDFがスキャン文書かどうかを確かめてください。1行分の文字を選択してみて、カーソルで何も選べなければ、全ページが画像です。
- ページ数とサイズを見比べてください。3ページで40 MBなら画像が重いということですし、900ページで40 MBならまったく妥当な範囲かもしれません。
- 文書が暗号化されていないか確かめてください。パスワード保護されたPDFは、ロックを解除するまで構造を書き換えることが一切できません。
- 署名されていないか確かめてください。署名済みの文書を書き直すと署名は無効になり、たいていの場合それはファイルが大きいことより悪い結果です。
- 本当に必要なものを確かめてください。送るべき6ページだけを抜き出すほうが、90ページすべてを圧縮するよりうまくいくことは多いものです。
この作業に使えるツール
出典
- ISO 32000-2 — Document management, Portable Document Format
- Adobe — PDF 32000-1:2008, the freely published PDF 1.7 specification
- PDF Association — ISO 32000 and the PDF standards family