J

無料でPDFファイルサイズを小さくする方法

目的

PDF書類のファイルサイズを、無料で、できるだけ可読性を保ったまま、小さくしたい。

方法

ghostscriptを利用する。ghostscriptは(\LaTeX)でおなじみだと思われる。知らない方は、Mac OSであれば、Homebrewでインストールできる。

% brew install ghostscript

Unixの方はもともと入っている(?)のだろうか。 Windowsの方はGhostscript: Ghostscript, GhostPCL, GhostXPS and MuPDF Downloadsからダウンロードできる。

サンプルコード

.bash_profileに以下を記述する。

# Usage: cpdf [input file] [output file] [dpi] [Gray*|CMYK|RGB] [screen*|ebook|printer|prepress|default]
cpdf() {
   gs -q -sOutputFile=${2:-"output.pdf"} -sDEVICE=pdfwrite \
      -dNOPAUSE -dBATCH -dSAFER -dQUIET \
      -dCompatibilityLevel=1.4 -dPDFSETTINGS=/${5:-"screen"} \
      -dEmbedAllFonts=true -dSubsetFonts=true \
      -sColorConversionStrategy=${4:-"Gray"} -dProcessColorModel=/Device${4:-"Gray"} \
      -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=${3:-"100"} \
      -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=${3:-"100"} \
      -dColorImageDownsampleType=/Bicubic -dColorImageResolution=${3:-"100"} \
      $1 < /dev/null
}

これを書くことで、コンソール上で

% cpdf [圧縮したいPDFファイル名]

という使い方ができる。

cpdfは、引数順に、

cpdf [入力ファイル名*] [出力ファイル名] [dpi値] [カラースケール] [プリセット]

を設定できる。

入力ファイル名のみは必須である。入力ファイル名以外を指定しない場合、出力ファイル名はoutput.pdf、dpi値は100、カラースケールはグレイスケール、プリセットはscreenになる。

例えば、入力ファイルinput.pdfを出力ファイルout.pdfとして、dpi=50、カラースケールをCMYKで生成したい場合は、

cpdf input.pdf out.pdf 50 CMYK

となる。(dpi=50だとかなり荒い)

補足

もちろん、gsコマンドを直接コンソールで書いてもOKだが、オプションが多いため、煩雑になる。bashを利用するか、シェルスクリプトを書いて実行したほうが良い。

gsコマンド(執筆途中)

ghostscriptはgsコマンドで実行する。

% gs [オプション] [入力ファイル名]

オプションは沢山あり、全てを説明すると膨大な量になる。ここではPDF書類の圧縮に関連する一部を紹介する。

オプション 意味 デフォルト値
-sOutputFile 出力ファイル名 - output.pdf
-sDEVICE 出力デバイスの選択 gs -hで一覧を見れる -
-dNOPAUSE 各ページの処理の一時停止を無効にする
-dBATCH インタラクティブなループコマンドに入った後に終了する
-dSAFER deletefileとrenamefileオペレータを無効にし、パイプで連結されたコマンド(%パイプ%)を無効にする
-dQUIET 標準出力へのルーチン情報のコメントを非表示にする
-dPDFSETTINGS 定義済みのプリセットから1つを選ぶ /screen, /ebook, /printer, /prepress, /default /default
-sColorConversionStrategy 色の定義 Gray, CMYK, RGB
-dProcessColorModel 色の定義 /DeviceGray, /DeviceCMYK, /DeviceRGB
-dCompatibilityLevel 1.3, 1.4, 1.5, 1.6 1.4
-dEmbedAllFonts true or faluse true
-dColorImageDownsampleType /Subsample, /Average, /Bicubic /Subsample
-dColorImageResolution dpi 100 72
-dGrayImageDownsampleType /Subsample, /Average, /Bicubic /Subsample
-dGrayImageResolution dpi 100 72
-dMonoImageDownsampleType /Subsample, /Average, /Bicubic /Subsample
-dMonoImageResolution dpi 100 72
-dSubsetFonts true or faluse true

他にも多くのオプションがある。詳しくは/usr/local/share/ghostscript/doc/を参照されたい。ここではPDF書類のファイルサイズを小さくすることに関連しているオプションのみを取り上げている。 英語ばかりで良くわからないかもしれないが、重要なのは、-dGrayImageResolutionで、この数値で解像度が決定されることだ。

dpiは数値が大きいほどきれいなPDFになる。小さいほど荒い。 つまり、ファイルサイズを小さくしたかったら、dpiを小さく設定すると良い。

実は、-dPDFSETTINGS=/screenはデフォルトで72dpiに設定される。これはかなり荒く、可読性が保たれていない例が多い。筆者の推奨は100dpi程度である。