背景
ImageMagick、便利なんだけども $ convert input-*.jpg output.pdf
みたいに "input-" から始まるファイル名のJPEGファイルを一つのPDFファイルにまとめようとすると100GB以上もの(!!!)超大量のキャッシュを生成してしまう。(僕の環境だけ?)
ノートPCでの作業でこれだけのディスクスペースを要求されるのは超つらい。ので、なんとか回避法がないか探してみた。
結論
ImageMagickだけを使うのではなく、他のツールと連携させればキャッシュを生成させずに複数のJPEGファイルをPDFファイルへとまとめられる
具体的にはPDFtk (https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/) というツールと組み合わせる。このツールはPDFファイルに対する編集操作が得意みたいなので、戦略としてはImageMagickでJPEGファイルを1ページずつのPDFファイルへと変換した後、複数のPDFファイルをPDFtkで一つのファイルへとまとめるという流れとなる。
ツールのインストール
MacでHomebrewを使っているなら、各ツールは以下の手順でインストールできる
- ImageMagick
$ brew install imagemagick
- PDFtk
$ brew tap spl/pdftk
$ brew install pdftk
変換処理
例えば、input-0000.jpg、input-0001.jpg、 ... input-0600.jpg を output.pdf という一つのPDFファイルへとまとめる処理は以下のようなシェルスクリプトを作成することで行える。
#!/bin/sh
jpgs="input-*.jpg"
for jpgpath in $jpgs; do
number=$jpgpath
number=${number#img-}
number=${number%%.*}
echo "Generating output-${number}.pdf..."
convert -verbose $jpgpath output-${number}.pdf
done
echo "Generating output.pdf..."
pdftk output-*.pdf cat output output.pdf
echo "Removing tmp files..."
rm ./output-*.pdf
この方法だと一時的に1枚ずつのPDFファイルが一時ファイルとして生じてしまうが、ImageMagick単体での変換作業に比べれば圧倒的に少ないディスクスペースで変換が行えるようになった。
めでたしめでたし。