PerlでPDFのサムネイルを作る

MTQに、「PDFファイルのサムネイルが作成されない」といった内容の質問がありました。
現状のMovable Typeには、PDFのサムネイルを自動で作成する機能はありませんので、仕様ということになります。

ただ、PDFのサムネイルをPerlで出力することができれば、サムネイルの自動作成機能を追加することができるはずです。
そこで、PDFのサムネイルをPerlで出力する方法を調べてみました。

ImageMagickでサムネイルを出力する

各種の画像ファイルを操作するプログラムとして、ImageMagickがよく使われています。
ImageMagickでは、PDFを読み込んで、そのサムネイルを出力することもできます(ただし、GhostScriptもインストールされていることが必要)。

例えば、「foo.pdf」というPDFファイルがあるとします。
このPDFファイルの1ページ目のサムネイルを作って、「foo.png」というファイルに保存するとします。
この場合、以下のようにコマンドを入力します。
「foo.pdf[0]」の「[0]」が、PDFの最初のページを表します。

convert foo.pdf[0] foo.png

また、サムネールのサイズを指定することもできます。
それには、「-resize」というパラメータを指定します。

例えば、サムネイルの幅を300ピクセルにし、高さはPDFの縦横に応じて自動的に決まるようにしたいとします。
この場合は、以下のようにコマンドを入力します。

convert foo.pdf[0] -resize 300 foo.png

PerlでImageMagickを操作してサムネイルを出力する

PerlでImageMagickを操作するには、「PerlMagick」というモジュールを使います。
PerlMagickはImageMagickに同梱されています。

PerlMagickを使うには、以下の手順を取ります。

  • 「use Image::Magick;」の文で、PerlMagickのモジュールを読み込みます。
  • 「Image::Magick->new;」でPerlMagickのオブジェクトを作成します。
  • PerlMagickオブジェクトのメソッドを使って、各種の操作を行います。

例えば、先ほど取り上げた「foo.pdfのサムネイルを、幅300ピクセルで出力する」という例だと、以下のようなソースコードになります。
4行目の「foo」が、ファイル名から拡張子を除いたものです。
また、5行目の「300」が、サムネイルの幅です。
4行目と5行目を書き換えれば、任意のPDFのサムネイルを任意のサイズで出力することができるはずです(ただし、パスワード付きのPDFについては検証していません)。

use strict;
use Image::Magick;

my $filename = 'foo';
my $thumb_width = 300;

my $image = Image::Magick->new;
$image->Read("${filename}.pdf[0]");
$image->Thumbnail(geometry => $thumb_width);
$image->Write("${filename}.png");