Help us understand the problem. What is going on with this article?

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 の場合

screen.jpg

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

ebook の場合

ebook.jpg

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

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

参考サイト

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away