PDF をコマンドラインから圧縮する


概要

圧縮というか品質を GhostScript で調整してPDFのファイルサイズを削減する話です。

インターネット経由でPDFを共有するなら容量はなるべく小さい方がいい。膨らみがちなPDFのファイルサイズを小さくする方法はないかと PDF 圧縮 なんて検索すると Web サービスがいくつかヒットしますが、PDF の内容次第ではそのようなサービスを利用したくないこともあるでしょう。

そこで、なるべくローカルで完結させたい・コマンドラインで処理したいという要望に応えるべく、この記事では「GhostScript でPDFのファイルサイズを減らす方法」を紹介します。

Install GhostScript

GhostScript が必要なのでインストールしてください。

普段 TeX・LaTeX なんかを使っている人はすでに GhostScript がインストールされているかもしれません。 gs --version を実行してみてバージョン情報が返ってくるようであればすでに gs コマンドが利用可能なのでこの項目は飛ばしてください。

macOS

Homebrew でインストールできます。

brew install ghostscript
gs --version
# 9.26

その他OS

以下を参考にしてください。

Ubuntu 18.04 とかであれば sudo apt install ghostscript でインストール可能だと思いますが私は検証していません。あと環境次第ではコマンド名が gs ではなく ghostscript である場合もありそうです。

圧縮方法

実行するコマンド

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

input.pdf を入力にして output.pdf が得られます。

PDFSETTINGS は以下のものから選択できます。

  • /default
  • /screen
  • /ebook
  • /printer
  • /prepress

Shell function

次のような Shell 関数を定義しておくと便利です。

function pdfmin()
{
    local cnt=0
    for i in $@; do
        gs -sDEVICE=pdfwrite \
           -dCompatibilityLevel=1.4 \
           -dPDFSETTINGS=/ebook \
           -dNOPAUSE -dQUIET -dBATCH \
           -sOutputFile=${i%%.*}.min.pdf ${i} &
        (( (cnt += 1) % 4 == 0 )) && wait
    done
    wait && return 0
}

4 プロセスまでを同時実行できます。同時実行数の上限はお使いの環境に合わせて修正してください。 .bashrc などに書いておけば、次のようにして実行できます。

pdfmin *.pdf

*.min.pdf が生成され上書きはしません。

どの品質を選ぶべきか

以下のPDFに対してそれぞれの品質でコマンドを実行してみました。

for i in screen ebook printer prepress default; do
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/${i} -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output_${i}.pdf input.pdf
done
$ du -h *
3.9M    input.pdf
3.1M    output_default.pdf
2.1M    output_ebook.pdf
4.1M    output_prepress.pdf
4.1M    output_printer.pdf
2.1M    output_screen.pdf

この処理では 画像の品質の影響が大きい ので画像を多く含むPDFほどオプションごとに違いがでます。次に screenebook を指定した場合のそれぞれの実行結果を載せてみました。

screen の場合

左が元のPDFで右が処理後のPDFです。画像の劣化が激しく、文字の判別ができなくなってしまいました。 screen は削減効果絶大ですがあまり実用的ではありません。

ebook の場合

左が元のPDFで右が処理後のPDFです。よく見ると画像の劣化が分かりますが screen の時ほどひどいものではありません。 ebook をオプションに指定するのがオススメです。

もし ebook も許容できない場合は default を指定してください。

参考サイト