pdfのファイルサイズを小さくする方法

pdfファイルに高解像度の画像を埋め込むと,ファイルサイズが無駄に大きくなります.この場合,以下のスクリプトで画像の解像度を下げると,効率よくファイルが圧縮できます.コマンドラインで実行できるので,複数のpdfファイルを一括で変換することも可能でとても便利です.

なおこのスクリプトLinuxMac OS Xの両方で動作します

スクリプトの中身

#!/bin/bash

error()
{
    echo "$@"
    exit 1
}

if [ $# -ne 2 ]; then
    cat<<EOF
usage:
   $0   <input-pdf>  <output-pdf>
EOF
    exit 1
fi

input=$1
output=$2

[ -f "$input" ] || error "no such input file, $input"
[ -f "$output" ] && error "$output already exists"

gs \
   -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
  -dDownsampleColorImages=true \
  -dColorImageResolution=300 \
  -dNOPAUSE -dBATCH \
  -sOutputFile="$output"  "$input"

使い方

上記の内容をパスが通っているディレクトリ,例えば /usr/bin/以下に,pdf_reduce.sh という名前で保存します.次にパーミッションを設定します

$ sudo chmod  a+x /usr/bin/pdf_reduce.sh

実行方法は以下の通りです.

$ pdf_reduce.sh  original.pdf  output.pdf

ここで,original.pdf は元のファイル , output.pdf が出力ファイルの名前になります.

複数のpdfを一括変換する場合は次のようにします

$ mkdir  output
$ for x in *.pdf; do  pdf_reduce.sh $x output/$x; done

出力ファイルの保存先として "output"というディレクトリを作成して,カレントディレクトリにあるpdfをまとめて変換し,同じファイル名で outputディレクトリ以下に保存します.

解説


gsコマンドを使って pdf を読み込んで,再度pdf形式で書き出しています
ポイントは,以下の3点です

  • 出力ファイルは pdf 形式 (-DEVICE=pdfwrite)
  • 画像の解像度を下げるモードを有効にする(-dDownsampleColorImages=true)
  • 出力時の解像度は 300dpi に設定( -dColorImageResolution=300)

A4の紙に印刷する程度であれば解像度は300dpi程度で十分です