終わりのないPDFサイズ問題との戦い#
オンライン申請サイトやウェブ上にPDFファイルをアップロードするとき、必ずといっていいほどファイルサイズ制限の問題に直面します。就職活動の応募書類、ビザ申請書類、学術論文の提出など、「ファイルサイズが5MBを超えています」といったメッセージを見て困った経験は誰しもあるでしょう。
特にPDFに画像が含まれている場合、この問題は指数関数的に悪化します。スクリーンショットやスキャンしたページが数枚含まれただけで、簡単にファイルサイズが20MB以上に膨れ上がってしまいます。これまで様々なアプローチを試してきました。カスタムフィルター、macOS内蔵のColorSyncユーティリティ、オンライン圧縮ツールなど、しかし時々うまくいったり、時々うまくいかなかったりします。Macの内蔵のファイルサイズ削減フィルターは良いのですが、劇的にファイルサイズを削減してくれません。
Ghostscriptの登場:ゲームチェンジャー#
最近、オンラインシステムに書類をアップロードしようとしている際に再びこの問題に遭遇しました。いつものような方法で期待外れの結果しか得られなかった後、Ghostscriptをきちんと試してみることにしました。その結果に本当に驚きました:16MBのPDFがわずか866KBまで圧縮され、しかも品質の劣化は全く感じられませんでした。
インストールと使用方法#
Macユーザー向け#
Homebrewでのインストール#
# HomebrewでGhostscriptをインストール
brew install ghostscript
基本的な圧縮コマンド#
# 基本的な圧縮(サイズと品質のバランス良好)
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed.pdf input.pdf
Ghostscriptは-dPDFSETTINGS
パラメータを通じて異なる品質プリセットを提供します:/screen
(最小サイズ)、/ebook
(バランス型)、/printer
(高品質)、/prepress
(最高品質)。/screen
設定はほとんどのオンライン申請や書類提出に最適です。
Windowsユーザー向け#
私はWindowsでGhostscriptを個人的にテストしていませんが、プロセスは似ているはずです:
- 公式ウェブサイトからGhostscriptをダウンロード
- Windows版をインストール
- コマンドプロンプトまたはPowerShellで同じコマンドを使用、
gs
をgswin64c
またはgswin32c
(システムに応じて)に置き換え
コマンドパラメータの理解#
-sDEVICE=pdfwrite
: PDF出力フォーマットを指定-dCompatibilityLevel=1.4
: 最大互換性のためのPDFバージョン設定-dPDFSETTINGS=/screen
: 圧縮プリセット(screen、ebook、printer、prepress)-dNOPAUSE
: ページ間で一時停止しない-dQUIET
: エラー以外のメッセージを抑制-dBATCH
: 処理後に終了-sOutputFile=
: 出力ファイル名を指定
技術者・非技術者両方へのヒント#
ターミナルに慣れたユーザー向け#
簡単にアクセスできるよう、シェル設定に関数を作成してください:
compress_pdf() {
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${1%.*}_compressed.pdf" "$1"
}
使用法:compress_pdf document.pdf
でdocument_compressed.pdf
を作成
拡張ラッパー関数(推奨)#
より堅牢なソリューションが必要な場合は、エラーハンドリング、ヘルプドキュメント、品質オプション、圧縮統計を含む改良されたラッパー関数を作成しました:
compress_pdf() {
# ヘルプを表示
if [[ "$1" == "help" || "$1" == "--help" || "$1" == "-h" ]]; then
echo "compress_pdf - Ghostscriptを使ってPDFファイルを圧縮"
echo ""
echo "使用法:"
echo " compress_pdf <input.pdf> [品質]"
echo ""
echo "品質オプション(デフォルト: screen):"
echo " screen - 最小サイズ、画面表示に適している"
echo " ebook - 中サイズ、電子書籍リーダーに適している"
echo " printer - 印刷に適した良好な品質"
echo " prepress - プロ印刷用の最高品質"
echo ""
echo "例:"
echo " compress_pdf document.pdf"
echo " compress_pdf document.pdf ebook"
return 0
fi
# ファイルが提供されているかチェック
if [[ -z "$1" ]]; then
echo "エラー: PDFファイルを指定してください"
echo "使用法: compress_pdf help"
return 1
fi
# ファイルが存在するかチェック
if [[ ! -f "$1" ]]; then
echo "エラー: ファイル '$1' が見つかりません"
return 1
fi
local input_file="$1"
local quality="${2:-screen}"
local output_file="${input_file%.*}_compressed.pdf"
# 品質設定を検証
case "$quality" in
screen|ebook|printer|prepress)
;;
*)
echo "エラー: 無効な品質 '$quality'。使用可能: screen、ebook、printer、prepress"
return 1
;;
esac
echo "'$input_file' を圧縮中(品質: $quality) -> '$output_file'"
local input_size=$(stat -f%z "$input_file" 2>/dev/null)
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/"$quality" \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile="$output_file" "$input_file"
if [[ -f "$output_file" ]]; then
local output_size=$(stat -f%z "$output_file" 2>/dev/null)
local reduction=$((100 - (output_size * 100 / input_size)))
local input_readable=$(numfmt --to=iec-i --suffix=B "$input_size")
local output_readable=$(numfmt --to=iec-i --suffix=B "$output_size")
echo "成功! ${input_readable} から ${output_readable} に削減(${reduction}%小さくなりました)"
else
echo "エラー: 圧縮に失敗しました"
return 1
fi
}
この拡張版は以下の機能を提供します:
- 内蔵ヘルプ:
compress_pdf --help
- 品質オプション:
compress_pdf document.pdf ebook
- 存在しない/無効なファイルのエラーハンドリング
- サイズ削減を示す圧縮統計
- 品質設定の入力検証
非技術者向け#
/screen
プリセットから始める - ほとんどの用途で最適な圧縮を提供- 常に元のファイルをバックアップとして保持
- 圧縮されたファイルが品質要件を満たすかテスト