| name | utility-pdf-compress |
| description | qpdf で PDF を品質劣化なし (ロスレス) で圧縮する。画像の再エンコードは行わないため画質・フォント・レイアウトは完全に維持される。「PDF を圧縮して」「PDF のサイズを減らして」「品質を落とさずに PDF を軽くして」などのリクエストで起動。画質を犠牲にしてでも大幅に減らしたい依頼 (ダウンサンプリング) は対象外。 |
| argument-hint | <入力PDFのパス> [出力先パス] |
| allowed-tools | Bash |
PDF ロスレス圧縮 (qpdf)
qpdf の構造最適化 (ストリーム再圧縮・オブジェクトストリーム化) で PDF をロスレス圧縮する。画像・フォント・ベクターデータは一切再エンコードしないため、品質は完全に維持される。
前提
qpdf がインストール済みであること (qpdf --version で確認)。無ければユーザに報告して停止する
- 入力 PDF が存在すること。パスが渡されていなければユーザに確認する
手順
1. 圧縮前の情報取得
stat -f "%z" "<input.pdf>"
qpdf --show-npages "<input.pdf>"
2. 圧縮実行
元ファイルは上書きしない。出力先の指定がなければ、入力と同じディレクトリに <basename>_compressed.pdf として出力する。
qpdf --recompress-flate --compression-level=9 \
--object-streams=generate --stream-data=compress \
"<input.pdf>" "<output.pdf>"
--recompress-flate --compression-level=9: 既存 flate ストリームを最高圧縮率で再圧縮 (ロスレス)
--object-streams=generate: オブジェクトをまとめて圧縮ストリーム化
--stream-data=compress: 非圧縮ストリームを圧縮
暗号化済み PDF で失敗した場合は --decrypt の追加をユーザに提案する (パスワード保護が外れる旨を明示して確認を取る)。
3. 整合性検証
qpdf --check "<output.pdf>"
qpdf --show-npages "<output.pdf>"
いずれかが失敗したら出力ファイルを削除し、エラー内容をユーザに報告する。
4. 結果報告
以下を報告する:
- 圧縮前後のサイズと削減率 (例:
3,498,937 → 3,259,391 bytes (6.8% 削減))
- 整合性検証の結果 (
qpdf --check パス / ページ数一致)
- 出力ファイルのパス
削減率の目安と限界
ロスレス圧縮のため、削減率は PDF の中身に依存する:
- 効果が出る: 非圧縮・低圧縮ストリームやオブジェクト構造に無駄がある PDF (例: フォント・ベクター主体のスライドで 5〜10% 程度)
- ほぼ縮まない: JPEG 画像主体の PDF (JPEG データはロスレスでは再圧縮できないため削減率 1% 未満もありうる)
削減率が 1% 未満だった場合は「この PDF は既に圧縮済みデータ (JPEG 等) が大半で、品質を維持したままではこれ以上縮まない」旨を報告する。画質を落として大幅削減したい場合は Ghostscript 等によるダウンサンプリングが必要だが、それは本スキルの対象外なので提案に留める。