コンテンツへスキップ
Compress PDF
日本語

タブ内で動く圧縮エンジン。

ワーカーキューも、アップロードエンドポイントも、「サーバー上で処理中」という文言もありません。ドロップからダウンロードまで、PDFに何が起こるかを正確に説明します。

自分のPDFで試す

ステップ 1

ファイルを読み取り理解する

ファイルはブラウザの File.arrayBuffer() APIで読み取られます。どこにも送信されず、バイトはタブのメモリに留まります。

PDF.jsがドキュメントを開き、ページ数を数えます。ファイル全体から数ページがサンプリングされ、テキスト密度が測られます。サンプリングしたページにほとんど文字がなければ、おそらくスキャンです。十分に文字があればテキストベースです。その分類が、画像の再圧縮とラスタライズのどちらを先に試すかを決定します。

解析はパスワード保護も検出します。暗号化されたファイルは、破損した出力を生成する代わりに、ここで明確なメッセージと共に停止します。

ステップ 2

3つの段階的なパス

各パスは完全な再構築です。エンジンは次の、より破壊的なパスが必要かどうかを決める前に結果を実測します。

パス1 — 構造のクリーンアップ

pdf-libがドキュメントを読み込み、オブジェクトストリームを有効にして書き直します。ページサムネイル、孤立オブジェクト、識別メタデータが削除されます。フォント・画像・ページコンテンツはそのままなので、このパスは事実上ロスレスです。

ロスレス

パス2 — 画像の再圧縮

エンジンはフォームXObjectにネストされた画像を含め、各ページのリソース辞書を巡回し、JPEG画像ストリームを見つけます。それぞれは createImageBitmap でデコードされ、キャンバス上に縮小サイズで描画され、より低い品質で再エンコードされます。

新しいストリームが古いオブジェクトをその場で置き換えるため、ページレイアウト・テキスト・リンク・ベクター図形は変わりません。ソフトマスク、CMYKカラースペース、JPXまたはJBIG2圧縮の画像は、壊れた描画を避けるためスキップされます。

テキスト保持

パス3 — ラスタライズ

目標がまだ届かない場合、またはソースがスキャンの場合、PDF.jsが各ページを36〜160 DPIのオフスクリーンキャンバスに描画します。JPEGはpdf-libで新しいドキュメントに組み立てられます。これによりテキストがピクセルに平坦化されるため、最後に実行され、結果パネルがその旨を伝えます。

最終手段

ステップ 3

収まる最良の結果を探す

画像設定は期待される出力重量(スケールの二乗 × JPEG品質)でソートされたラダーとして走査されます。目標未満を実測した最初のステップが勝ちます。結果が目標を十分に下回る場合、エンジンはより鮮明なファイルを得るために一段階良い設定を試し、収まる方を保持します。

ラスタライズは160 DPIから36 DPIへの別のラダーを使います。解像度を下げるのはスキャンを縮小する最速の方法なので、ラダーはどちらか一方を極端に下げるのではなく、解像度とJPEG品質を一緒にトレードオフします。

正直さのルール: 成功とは outputBytes <= targetBytes、つまり完成ファイルで実測されたもの。何も収まらない場合は、ツールが最小の実結果と目標をどれだけ超過しているかを表示します。切り下げ、推定、超過を成功とラベル付けすることはありません。

ステップ 4

インターフェースがフリーズしない理由

Web Worker

PDF解析とJPEGエンコードは専用ワーカーで実行されるため、大きなファイル処理中もスクロール・選択・入力が応答し続けます。

OffscreenCanvas

画像処理はDOMに触れないオフスクリーンキャンバスで行われます。対応しないブラウザはメインスレッドでのチャンク処理にフォールバックします。

有界メモリ

ページはバッチで処理され、ビットマップは使用後に閉じられ、オブジェクトURLは破棄され、大きなファイルは電話のメモリを消耗する前にフラグが立ちます。

できないこと

認めたい限界

  • OCRなし。スキャンページはスキャンのまま; テキストを検索可能にはできません。
  • パスワード復号なし。暗号化されたPDFは検出されて拒否されます。
  • 署名の保持なし。あらゆる圧縮が暗号署名を無効にします。
  • JBIG2やJPXの再エンコードなし。破損を避けるためそれらの画像はそのまま残します。
  • サイズ削減の保証なし。すでに最適化されたテキストPDFはわずかにしか縮まないかもしれません。
  • クラウド処理なし。端末がメモリ不足になったら、サーバーは助けになりません。

エンジンの質問

圧縮ツールの動作についての深い答え。

なぜ単一の設定ではなく複数の設定を試すのか?

画像品質とファイルサイズの関係は線形ではなく、すべてのPDFが異なるからです。エンジンは高品質から積極的な圧縮へラダーを走査し、各ステップで実際のPDFを保存・実測し、目標に収まる最初の結果で停止します。その結果が制限を満たす中で最も見た目が良いファイルです。

なぜ常にラスタライズしないのか? 最小のファイルが生成されるのに。

ラスタライズはテキストをピクセルに変えます。ファイルは小さくなりますが、テキストが選択できなくなり、リンクが切れ、小さな文字がぼやけます。スキャン用の最終手段として提供され、結果パネルは常に使用された場合にそれを伝えます。

パスワード保護されたPDFに対応しているか?

まだです。PDF.jsはパスワードで暗号化ファイルを開けますが、ドキュメントを再構築するライブラリは結果を再暗号化できません。壊れたファイルを生成する代わりに、ツールは暗号化を検出して、先にPDFリーダーでパスワードを削除するよう求めます。

テキストのみのPDFがほとんど縮まなかったのはなぜ?

テキストとベクターグラフィックはすでにコンパクトです。ファイルの95%がテキストとフォントなら、削除できる冗長データはほとんどありません。そのようなファイルで大きな節約を報告するツールは通常ページをラスタライズしているため、このツールは使用した方法を報告します。

デジタル署名については?

あらゆる変更が暗号署名を無効にします。どの圧縮ツールもそれを保持できません。署名付きのオリジナルを保持し、共有用にコピーを圧縮してください。

自分のファイルで動作を見る。

PDFをドロップし、目標を選び、実測結果を観察してください。

PDFを圧縮