Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

圧縮というか品質を 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 を指定してください。

参考サイト

peaceiris
Hugo ʕ◔ϖ◔ʔ や GitHub Actions について書いています。こっち https://peaceiris.com/ に引っ越しましたので、今後 Qiita への新規投稿はしませんが記事のメンテはします。
https://peaceiris.com/
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  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