PDFの圧縮率がファイルごとに違う理由:画像・フォント・ストリームと圧縮フィルター
同じツールでも90%小さくなるPDFとほとんど変わらないPDFがある理由を、ファイル構造から説明します。Flate・DCT・JBIG2・JPXフィルター、オブジェクトストリーム、スキャン向けMRC、状況別の対処法まで。
PDF圧縮ツールに2つのファイルを入れたら、片方は40MBが3MBになり、もう片方は2MBが1.9MBにしかならない。よくあることです。ツールの性能差に見えますが、ほとんどはファイルの中に何がどう入っているかの違いです。PDFは一つの圧縮形式ではなく、種類の違うデータをそれぞれ別の方法で圧縮して詰めた入れ物だからです。
PDFの容量はどこに使われているか
PDFは番号付きのオブジェクトの集まりです。ページ、フォント、画像、しおりがすべてオブジェクトで、大きなデータは「ストリーム」として入ります。容量の大半を占めるストリームは3種類です。
| 構成要素 | 中身 | 典型的な大きさ |
|---|---|---|
| 画像 | 写真、スキャンしたページ、スクリーンショット | 写真1枚で数百KB〜数MB |
| フォント | 使った書体の字形データ | 欧文のサブセットは数十KB、日本語フォントの全体埋め込みは数MB |
| コンテンツストリーム | 文字の配置や線・図形を描く命令 | 通常は1ページ数KB、図面や地図では数MB |
Wordで書いた30ページの報告書は文字が中心なのでコンテンツストリームは小さく、フォントが容量の主役です。スキャンした契約書は1ページ丸ごと画像なので、画像が95%以上を占めます。CADから出力した図面は画像が一つもないのに、数十万本の線のせいでコンテンツストリームが数十MBになることもあります。圧縮ツールが効くかどうかは、まずこの比率で決まります。
ストリームごとのフィルター
PDFの規格(ISO 32000)では、ストリームをどう圧縮したかを/Filterに書くことになっていて、ビューアーはその名前を見て復号方法を選びます。よく見るものは次のとおりです。
- FlateDecode:zlib/deflate(RFC 1950・1951)の可逆圧縮です。PNGと同じアルゴリズムで、コンテンツストリーム・フォント・可逆画像の多くがこれを使います。画像にはPNGと同じ予測子(Predictor)を組み合わせ、行ごとに隣の画素との差を記録すると圧縮率が大きく上がります。
- DCTDecode:JPEGです。ファイル内のバイトはJPEGファイルそのものです。
- JPXDecode:JPEG 2000で、PDF 1.5で追加されました。同じ画質ならJPEGより小さくできますが、扱えるソフトが少なめです。
- CCITTFaxDecode:ファクス用の1ビット圧縮(ITU-T T.4・T.6)です。白黒スキャンで長く使われてきました。
- JBIG2Decode:1ビット画像用でPDF 1.4で追加されました。ページ内で繰り返す文字の形を記号辞書に一度だけ保存し、位置だけを記録できるので、文字のスキャンをとても小さくできます。
- LZWDecode、RunLengthDecode、ASCIIHexDecode、ASCII85Decode:古い方式や、バイナリをテキストに変える符号化です。ASCII系はむしろ容量が増えます。
ここで大事なことが一つあります。**すでにDCTやJBIG2で圧縮されたデータをFlateで包み直しても、ほとんど小さくなりません。**圧縮済みのデータは統計的にランダムに近く、可逆圧縮が見つける繰り返しがないからです。PDFをZIPにしてもサイズがあまり変わらないのと同じ理由です。
大きく縮むPDFの条件
大きく縮むのは、たいてい次の3つのどれかです。
**表示サイズよりはるかに高解像度な画像。**スマートフォンの写真は1200万画素(4000×3000)が普通です。これをA4いっぱいに置くと約340 DPIで、画面で見たり事務用プリンターで刷ったりするには150 DPIで足ります。150 DPIに縮めると縦横それぞれ約0.44倍、画素数は約19%になります。JPEGの容量はおおむね画素数に比例するので、画像は5分の1前後になります。写真を半ページの大きさで置いていれば配置DPIは2倍になり、削減幅はさらに大きくなります。
**圧縮されていない画像。**古いソフトや一部のスキャナードライバーは画像を無圧縮や予測子なしのFlateで入れます。A4を300 DPIのカラーで無圧縮保存すると2481×3508×3バイト、約26MBです。こうしたファイルはJPEGにするだけで数十分の一になります。
**編集用の付帯データ。**Illustratorで「編集機能を保持」して保存したPDFは、元の作業データを丸ごと抱えています。複数のPDFを結合したファイルには、同じフォントやロゴが元ファイルの数だけ入っていることもあります。どちらも画質を損なわずに消せます。
ほとんど縮まないPDFの条件
逆に、どのツールでも縮まないファイルにもはっきりした理由があります。
**適正解像度ですでにJPEG圧縮された写真。**150 DPI・品質75程度で保存された写真は、再圧縮しても数%しか減らず、JPEGを保存し直すたびにブロックの境目や色のにじみが積み重なります。よくできた圧縮ツールは、削減量が小さければ元のデータをそのまま残します。
**サブセットせずに埋め込んだ日本語フォント。**欧文フォントは数百字で足りますが、日本語フォントはJIS第1・第2水準の漢字だけで6,000字を超え、1書体で数MBになります。文書で使った文字だけを入れるサブセット埋め込みにすれば数百KB以下に下がります。サブセット化はフォント構造の作り直しなので、PDFを作るソフト側で設定するのが確実です。Word、InDesign、一太郎などのPDF書き出し設定にあります。
**ベクターの図面。**線1本ごとに「移動、線を引く」の命令なので、図面が複雑なほどコンテンツストリームが大きくなります。すでにFlate圧縮済みなら、圧縮レベルを上げても数%です。現実的な方法はCAD側で不要なレイヤーを外して書き出すことです。
**白黒スキャン。**スキャナーがすでにJBIG2やCCITT G4で保存した白黒スキャンは、1ページあたりの容量がもともと小さく、削る余地がほとんどありません。
オブジェクトストリーム:構造そのものを圧縮する
PDF 1.4までは、ページやフォントの説明のような辞書オブジェクトは無圧縮のテキストで保存され、末尾の相互参照表もオブジェクトごとに20バイトの行を1つずつ持っていました。オブジェクトが数万個ある文書では、これだけでも無視できない量です。
PDF 1.5は2つの仕組みを導入しました。複数のオブジェクトを一つのストリームに集めてFlateで圧縮するオブジェクトストリームと、相互参照表そのものを圧縮したバイナリで保存する相互参照ストリームです。ただしストリームのオブジェクト(画像、フォントデータなど)はオブジェクトストリームに入れられないので、効果は構造情報に限られます。タグの多いアクセシブルなPDFやページ数の多い文書では目に見えて効き、写真中心の文書ではほぼ差が出ません。
スキャン文書とMRC
カラースキャンは難しいケースです。文字はくっきり、背景や写真はなめらかであってほしいのに、一つの圧縮方式で両方を満たすのは困難です。JPEGの品質を下げると文字の縁にノイズが出て、可逆にするとファイルが巨大になります。
**MRC(Mixed Raster Content、ITU-T T.44)**はページを層に分けてこれを解決します。文字の形は高解像度の1ビットマスク(JBIG2やG4)、文字の色と背景は低解像度のカラー画像(JPEGなど)として別々に保存し、マスクで2つの層を合成します。PDFでは画像マスクやソフトマスクといった既存の機能の組み合わせで実現するので、普通のビューアーでそのまま開けます。市販のスキャンソフトの「高圧縮」モードはたいていこの方式で、カラースキャンを1ページ数十〜数百KBに収められます。
MRCとJBIG2には注意点もあります。JBIG2の非可逆モードは、似た形の文字を一つの記号にまとめます。2013年、ドイツのダーフィト・クリーゼル(David Kriesel)は、ゼロックスの複合機がスキャン時に数字の6を8に置き換えて保存する現象を発見して公表しました。原因はまさにこの記号の統合でした。数字が重要な会計・医療文書では、JBIG2の可逆モードかG4を使う方が安全です。
状況別の対処法
**メール添付の上限を超えた写真入りの証憑。**画像比率が高く配置DPIも高い典型例です。PDF圧縮を150 DPIでかければ、たいてい解決します。まだPDFにまとめる前なら、画像圧縮で先に写真を小さくしておく方が軽く、結果も予測しやすくなります。
**フォントで重い報告書。**圧縮ツールより先に、作成元のソフトのPDF保存設定を見直してください。フォントの埋め込みはオンのまま、使用文字だけを埋め込む設定にします。
白黒で印刷するカラー文書。PDFグレースケール変換で色をグレーにすると、モノクロプリンターでの濃淡が予測しやすくなります。ただしグレースケール変換はカラーJPEGを可逆のグレー画像として入れ直すので、写真が多いとファイルが大きくなることがあります。容量が大事なら変換してから圧縮してください。逆の順番だと、圧縮したJPEGをグレースケール変換が可逆データに戻してしまいます。
**スキャンした契約書。**できればスキャンの段階で解決します。文字中心なら300 DPIの白黒(1ビット)でスキャンし、G4か可逆JBIG2で保存するのが最も小さく鮮明です。印影や署名の色が必要ならスキャナーのMRC高圧縮モードを使います。すでにカラーでスキャンされたファイルを圧縮するときは、150 DPIを下回ると小さな文字が読みにくくなることがあります。
**電子署名済みのPDF。**どの圧縮もファイルを書き直すので、電子署名は無効になります。圧縮してから署名する順番を守ってください。
よくある誤解
「PDFをZIPにすれば小さくなる」:中のストリームはすでに圧縮されているので、ほとんど変わりません。効くのは無圧縮の文字だけのPDFのような例外だけです。
「何度も圧縮すればどんどん小さくなる」:一度目標解像度まで縮めたら、それ以上縮める画像はありません。品質を下げて繰り返せば小さくはなりますが、劣化が積み重なります。
「DPIは高いほどよい」:配置サイズに必要な解像度を超えた画素は、印刷時に捨てられます。事務用の出力なら150〜200、高品質な印刷でも300 DPIでたいてい足ります。
出典
- Adobe — ISO 32000-1:2008 (PDF 1.7), 7.4 Filters, 7.5.7 Object streams, 7.5.8 Cross-reference streams
- PDF Association — ISO 32000 (PDF) resources
- iText Knowledge Base — Which PDF filters are used to encode data?
- ITU-T T.44 — Mixed Raster Content (MRC)
- ITU-T T.6 — Facsimile coding schemes (Group 4)
- IETF RFC 1951 — DEFLATE Compressed Data Format
- D. Kriesel — Xerox scanners/photocopiers randomly alter numbers in scanned documents (2013)