概要
圧縮というか品質を 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ほどオプションごとに違いがでます。次に screen
と ebook
を指定した場合のそれぞれの実行結果を載せてみました。
screen の場合
左が元のPDFで右が処理後のPDFです。画像の劣化が激しく、文字の判別ができなくなってしまいました。 screen
は削減効果絶大ですがあまり実用的ではありません。
ebook の場合
左が元のPDFで右が処理後のPDFです。よく見ると画像の劣化が分かりますが screen
の時ほどひどいものではありません。 ebook
をオプションに指定するのがオススメです。
もし ebook
も許容できない場合は default
を指定してください。