PDF圧縮
画像の縮小・再圧縮と重複整理でPDFを軽量化
ファイルはこのブラウザ内でのみ処理されます。サーバーにはアップロードされません。
画像のダウンサンプル・再圧縮と重複リソースの整理でPDFを軽量化
パスワード付きのPDFです。
別のツールで続ける
処理しています…
すべての処理はこのブラウザ内で行われます。ファイルがサーバーに送信されることはありません。
ダウンロードするファイルの準備ができました
この結果で編集を続ける
ページプレビューを開く
| 構成 | 処理前 | 処理後 | 変化 |
|---|
設定を変えると前の結果は隠れます。もう一度作成して最新の設定で保存してください。
暗号化されたPDFは先にパスワードを解除してください。ファイル全体を書き直すため、既存の電子署名は無効になります。原本を保管し、結果をご確認ください。
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
PDF圧縮について
このツールはPDFを描き直すのではなく、ファイル内のオブジェクトを一つずつ開いて、より小さい形に差し替えます。構造の読み書きはpdf-lib、Flate圧縮はfflate、JPEGのデコードと再エンコードはブラウザのcanvasが担当します。GhostscriptのようなWASMエンジンは同梱していないため、フォントのサブセット化やJBIG2の再圧縮といった専用エンジンが要る処理は行いません。
削減の大部分は画像から生まれます。各ページのコンテンツストリームをたどって座標変換行列を計算し、画像が実際に何インチの大きさで置かれているかから配置DPIを求めます。目標DPIの1.15倍を超える画像だけを縮小し、新しいデータが元のストリームより小さい場合だけ置き換えます。仕上がったファイルが元より大きければ、元のファイルをそのまま返します。
処理の順番と、それぞれが削るもの
処理は5段階です。段階ごとに効く対象が違うので、解析画面の画像・フォント・その他の比率を見れば、どこで効果が出るかを事前に見積もれます。
- 付帯データの削除:XMPメタデータ、ページサムネイル、編集ソフト専用の/PieceInfo。Illustratorで編集機能を保持したまま保存したPDFは/PieceInfoに元データを丸ごと抱えているので、これだけで半分以下になることもあります。
- 画像:目標DPIを超えるものを画素平均(ボックスフィルター)で縮小します。カラーのJPEGはデコードしてJPEGで保存し直し、可逆(Flate・無圧縮)の8ビットグレー・RGB画像はPNG予測子(Predictor 15)を付けてレベル9で再圧縮します。推奨・強では可逆のカラー画像をJPEGでも試し、半分以下になる場合だけJPEGを採用します。グレースケールはグレーのまま残します。ブラウザーのJPEGエンコーダーはカラー(RGB)のJPEGしか作れないため、グレーのJPEGは1チャンネルの可逆圧縮(Flate)で試して元より小さい場合だけ置き換え、可逆のグレー画像はJPEGにしません。
- その他のストリーム:無圧縮またはFlateのみのコンテンツ・フォントストリームをレベル9で再圧縮します。
- 重複の統合:バイト単位で同じストリームや、同一のFont・FontDescriptor・ExtGState辞書を一つにまとめます。複数のPDFを結合したファイルで同じロゴやフォントが何重にも入っている場合に効きます。
- 整理と保存:どこからも参照されないオブジェクトを削除し、PDF 1.5のオブジェクトストリームで小さなオブジェクトをまとめて圧縮して保存します。
画素数より配置DPIが大事な理由
同じ4000×3000の写真でも、A4いっぱいなら約340 DPI、名刺サイズの枠に入れれば1000 DPIを超えます。印刷でも300 DPIあれば足りるので、後者は画素のほとんどが無駄です。そのためこのツールは画像の大きさではなく配置サイズで判断し、同じ画像が複数箇所で使われていれば最も低いDPI(最も大きく置かれた場所)を基準にします。
ページ上で実際に描かれていない画像はDPIが分からないため、JPEG再圧縮の対象から外れます。透明度を持つソフトマスクは親画像と同じ比率で縮小して輪郭がずれないようにし、JPEGには変換しません。
ほとんど小さくならないPDF
サイズが減らないときは、たいてい構造上の理由があります。結果の項目別の表で、どこが変わっていないかを見れば原因を絞れます。
- すでに適正解像度のJPEG:150 DPI前後の写真を品質75で再圧縮しても数%しか減らず、元の90%以上なら差し替えません。JPEGの保存を繰り返しても画質が落ちるだけです。
- フォントの比率が高い文書:日本語フォントをサブセットせず丸ごと埋め込むと、1書体で数MBになります。このツールはサブセット化しないので、作成元のアプリで「使用文字のみ埋め込み」にして書き出し直すのが近道です。
- ベクターの多い図面・地図:数十万本の線はコンテンツストリームの容量として現れ、すでにFlate圧縮済みならレベル9でも数%程度です。
- 扱わない画像形式:JPEG 2000(JPX)、JBIG2、CCITT、CMYK・16ビット画像、インデックスカラー画像はそのまま残します。JBIG2で保存された白黒スキャンはもともと非常に小さく、削る余地もほとんどありません。
ダウンサンプルで壊れやすいもの
スキャン文書では文字も画像です。300 DPIでスキャンした契約書を強(96 DPI)にすると、9ポイントの文字の線がつぶれ、提出先のOCRが読めなくなることもあります。グレースケールのスキャンはJPEGで保存し直す際、ブラウザのエンコーダーの仕様でRGBのJPEGになります。白黒指定のある提出物は印刷プレビューで確認してください。
ファイルを書き直すため電子署名は無効になります。署名済みのPDFを小さくしたい場合は、署名前のファイルを圧縮してから署名する順番にします。
例
A4いっぱいに貼ったスマホ写真
- 入力
4000×3000の写真をA4(8.27×11.69インチ)の幅に合わせて配置、推奨(150 DPI、品質75)- 結果
配置DPI ≈ 342 → 約1316×1754に縮小
横3000/8.27≈363、縦4000/11.69≈342で、小さい方の342が配置DPIです。150×1.15=172.5を超えるので150/342≈0.44倍に縮小し、画素数は約19%になります。JPEGの容量はおおむね画素数に比例するので、画像は元の5分の1前後です。強(96 DPI)なら842×1123、画素は約8%です。
もともと軽い報告書
- 入力
Wordから書き出した30ページ、2.1MB。解析:フォント78%、画像12%- 結果
数%の削減、または元ファイルのまま
画像を全部消しても12%しか減りません。フォントがサブセットされずに埋め込まれているので、Wordの「文書で使用されている文字だけを埋め込む」をオンにして書き出し直す方がはるかに効きます。
目標をわずかに超える画像
- 入力
配置DPI 170の写真、推奨- 結果
縮小しない(品質75での再圧縮のみ試行)
170は172.5未満なので縮小対象外です。少し超えるだけの画像を縮めても効果は小さく、リサンプリングの劣化だけが残るため余裕を持たせています。再圧縮後が元の90%以上なら元のJPEGを残します。
使い方
- PDFを選び、画像・フォント・その他の比率と、目標DPIを超える画像の数を確認します。
- 弱(220 DPI)・推奨(150 DPI)・強(96 DPI)から選ぶか、DPIと品質を指定します。
- 実行後、項目別のサイズ変化を見て、プレビューで写真と小さな文字を拡大して確かめます。
主な用語
- 配置DPI
- 画像の画素数を、ページ上に置かれたインチ寸法で割った値です。画像内の解像度情報ではなく実際の表示サイズから計算します。
- オブジェクトストリーム
- PDF 1.5で導入された仕組みで、小さなオブジェクトを一つのストリームにまとめて圧縮します。相互参照表もストリームとして保存されます。
よくある質問
PDFを圧縮すると文字もぼやけますか?
テキストはベクターなので影響しません。スキャン文書のように画像の中にある文字だけが、解像度に応じてぼやけます。
同じファイルを2回かけるとさらに小さくなりますか?
同じ設定ならほとんど変わりません。画像はすでに目標DPI以下で縮小されず、再圧縮も10%以上小さくならない限り適用されないためです。
白黒スキャンのPDFが小さくなりません。
スキャナーがCCITTやJBIG2で保存した1ビット画像は扱いません。グレーやカラーでスキャンした場合はDPIを下げれば減りますが、文字の読みやすさを見ながら調整してください。グレーのJPEGは白黒を保つため可逆でしか保存し直さないので、DPIを下げないとそのまま残ることがよくあります。
しおりやリンクは残りますか?
ページ構造、しおり、リンク、フォームフィールドは残ります。メタデータ削除ではXMPが消えるので、PDF/Aの適合表示もなくなります。
関連ガイド
出典
- PDF Association — ISO 32000 (PDF) resources
- Adobe — Document management, Portable document format, Part 1: PDF 1.7 (ISO 32000-1:2008 copy)
- iText Knowledge Base — Which PDF filters are used to encode data?
- pdf-lib — PDFDocument.save (useObjectStreams)
- MDN — HTMLCanvasElement.toBlob()
基準日: