PDFが重い理由はだいたい2つに分かれます。スキャナーや写真から作られていてページの実体が高解像度の画像になっているか、それとも本文は軽いのに埋め込まれたサムネイルやメタデータが積み重なっているかです。この2つは対処法が正反対で、どちらの状態なのかを見ないまま「圧縮」をかけると、必要な画質まで落としたり、逆にほとんど軽くならなかったりします。
OFFilerのPDF圧縮は圧縮レベルを3段階に分け、それぞれが内部で何をするのかを明示しています。処理はすべてブラウザ内で行われ、圧縮前後をプレビューで見比べながら決められます。以下では3つのモードが実際にしていること、テキストが失われる境界線、そして複数ファイルをまとめて処理する方法を説明します。
3つの圧縮レベルが実際にしていること
テキスト保持:メタデータとサムネイルだけを削る
一番弱いモードは、ページの中身に一切手を触れません。削除するのは、タイトル・作成者・件名・キーワード・作成アプリ名・作成日時・更新日時といった文書情報、XMPメタデータのストリーム、そして各ページに埋め込まれたサムネイル画像です。文字も画像も元のまま残るので、テキストは選択でき、印刷しても劣化しません。
このモードは「軽くする」より「余分な情報を落とす」ためのものだと考えてください。元のPDFにメタデータやサムネイルが積まれていれば目に見えて縮みますが、そうでなければサイズはほとんど変わりません。むしろ再構築の結果、元より大きくなることさえあります。その場合は元のバイト列をそのまま返すようにしてあるので、このモードでファイルが太ることはありません。
バランス/最大圧縮:ページを画像に変換して組み直す
残る2つのモードは仕組みが根本的に違います。PDF.jsで全ページをレンダリングしてJPEGにし、そのJPEGを1ページずつ貼り直した新しいPDFを組み立てます。レンダリング解像度はバランスが150dpi、最大圧縮が96dpiです。JPEGの品質はスライダーで細かく調整できます。
スキャン済みの書類のように、そもそもページの実体が画像であるPDFに対しては、この方式が圧倒的に効きます。解像度と品質という2つのつまみで、必要な読みやすさとファイルサイズの落としどころを直接決められるためです。
失われるもの・注意点
ラスタライズするとテキストは検索できなくなる
バランスと最大圧縮を選んだ時点で、ページは画像になります。文字は「見える」だけの状態になり、選択もコピーも本文検索もできなくなります。拡大したときの輪郭も、レンダリングした解像度で頭打ちになります。画面にも警告を出していますが、契約書・仕様書・論文のように後から検索や引用をする文書に強い圧縮をかけるのは避けてください。
テキストを保ったままサイズを落としたい場合、PDF側でできることは限られています。まずテキスト保持モードを試し、それで足りなければ、そもそもページ数を減らす(ページ抽出・ページ削除)方向で考えるのが現実的です。
圧縮は「黒塗り」ではない
テキスト保持モードで消えるのは文書情報とサムネイルであって、本文に書かれている内容ではありません。氏名・住所・金額といった中身を伏せたい場合は圧縮ではなくマークアップを使ってください。逆に、ラスタライズを伴うモードを通したPDFは結果的にテキスト層が消えますが、これを情報保護の手段として当てにするべきではありません。伏せたい情報が画像として残り続けるためです。
まとめて処理する・前後でつなぐ
複数のPDFを一括で圧縮してZIPで受け取る
PDFを複数まとめて投入すると、同じ設定で順に圧縮し、結果を1つのZIPにまとめてダウンロードできます。月次の請求書をまとめて軽くする、スキャンした資料を一括で提出用サイズにする、といった作業を1回の操作で終えられます。ZIPの生成もブラウザ内で行われます。
結合してから圧縮するか、圧縮してから結合するか
メール添付の上限に合わせるのが目的なら、先に結合して1ファイルにしてから圧縮する方が結果を確認しやすくなります。最終的なサイズを直接見ながら圧縮レベルを決められるためです。逆に、極端に重いスキャンPDFが混ざっている場合は、先にそれだけを圧縮してから結合した方が処理が軽く済みます。
仕様と制限
- 対応形式
- PDF(application/pdf)
- サイズ上限
- 1ファイルあたり100MB
- テキスト保持
- 文書情報・XMP・ページサムネイルを削除。本文は無変更
- バランス
- 全ページを150dpiのJPEGにして再構築
- 最大圧縮
- 全ページを96dpiのJPEGにして再構築
- JPEG品質
- スライダーで調整可(ラスタライズ時のみ)
- 一括処理
- 複数PDF対応。結果はZIPで出力
- 通信
- ファイルの送信なし。処理はすべてブラウザ内