メインコンテンツへスキップ
Background Image
  1. Today I Learned (TIL)/

Ghostscriptを使ってPDF文書のファイルサイズを劇的に削減する方法

··5 分· ·
TIL Pdf Ghostscript 圧縮 ターミナル 生産性
著者
Aakash Nand
Senior Data Engineer @ Kraken Technologies

終わりのない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を個人的にテストしていませんが、プロセスは似ているはずです:

  1. 公式ウェブサイトからGhostscriptをダウンロード
  2. Windows版をインストール
  3. コマンドプロンプトまたはPowerShellで同じコマンドを使用、gsgswin64cまたは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.pdfdocument_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プリセットから始める - ほとんどの用途で最適な圧縮を提供
  • 常に元のファイルをバックアップとして保持
  • 圧縮されたファイルが品質要件を満たすかテスト

参考文献
#