GhostscriptでPDFを画像に変換(PDF2PNG)
正直、目から鱗。こんな便利なものがあったとは…
きっかけは“RedBulletin”。2005年以降のバックナンバー、ファイル数にして200以上。一応、年別、レース別に整理して保存しているんですが、「○○が表紙の号はどれだっけ?」といちいちAdobeリーダーを立ち上げて探すのも面倒になってきたので、表紙のサムネイルでも作って整理し直したいなと思ったわけです。便利なソフトでもないかなと、「PDF 画像に変換」などのキーワードで検索していたところ、Ghostscriptを使うのが一番だという結論に行き当たりました。
スクリプトのインストールは、圧縮ファイルを展開するだけ。インターフェイスは専用のソフトが別にあるそうですが、なくてもそのままコマンドラインから起動できます。どうせ英語だし、大量のファイルを処理するにはバッチファイルを使った方が速い、ということで、余計なものは入れずに素で使ってみることにしました。
高度な処理にあたってはフォントの問題が出てくる可能性があるそうですが、PDFからサムネイル画像を作る程度の処理であれば大きな問題はなさげです。ネックなのは、大量のファイルを一気に処理させようとすると結構なお時間を食ってしまう点でしょうか。レッドブルテンの例でいえば、PDFファイルから1ページ抽出するのに約30秒というところでしょうか。どうやらメモリを大食いしてるようなので、パソコンのスペックでも差が出ると思います。(うちで最も高性能なMacで実験してみたかったんですが、バッチファイルが使えないのでまだ試していません。)
[PDF形式→画像形式]の変換だけでなく、逆に[画像形式→PDF形式]や、単に[画像形式→画像形式]といった変換も自由自在に行えます。こんなに便利なものがあるなんて、もっと早く知っておくべきでした。
--- ( 以下、超個人的な覚え書き ) ---
まずは、とっかかりということで、
ここで紹介されているバッチファイルをそのままいただきました。pdf2jpgはバッチリ動きましたが、応用編として紹介されているpdf2pngはエラーが出てしまいました。
マニュアルで確認したところ、
Ghostscript provides a variety of devices for PNG output varying by bit depth. For normal use we recommend png16m for 24-bit RGB color, or pnggray for grayscale. The png256, png16 and pngmono devices respectively provide 8-bit color, 4-bit color and black-and-white for special needs.
The pngalpha device is 32-bit RGBA color with transparency indicating pixel coverage. The background is transparent unless it has been explicitly filled. PDF 1.4 transparent files do not give a transparent background with this device. Text and graphics anti-aliasing are enabled by default.
The pngalpha device has one option. The other png devices have no special options.
とありましたので、バッチファイルの
-sDEVICE=png
を
-sDEVICE=pngalpha
に書き換えてリトライ。これで、pdf2pngにも成功しました。
ただ、ここまでの設定では、PDFに格納された全てのページを画像変換することになり、処理に時間が掛かってしまいます。今回は表紙だけを変換したいので、1ページ目のみを変換できる方法を調べました。マニュアルと格闘したのですが、英語、英語、英語の連続であえなくリタイヤ。「ghostscript pdf ページ指定」などのキーワードで検索するも、なかなか参考になるサイトが見つかりません。
そこで、バッチファイルを実行したときに "FirstPage 1 LastPage 10" のような文字列が吐き出されていたことを思い出し、「ghostscript firstpage lastpage」で検索。
見よう見まねに、出力ファイル名と入力ファイル名の間に
-dFirstPage=1 -dLastPage=1
と書き加え、実行。これで無事にPDFファイルから表紙のみを抽出してPNG画像に出力することができました。
pdf2png.bat - とりあえずサンプル
@C:\gs\gs8.63\bin\gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pngalpha -r300 -sOutputFile=%1%%03dTo.png -dFirstPage=1 -dLastPage=1 %1
解像度は300dpiにしています。アルファチャンネルを持つPNG画像を高解像度で出力するわけですから、当然バカでかい画像が出力されます。小さいのが好みの人は数字を削ってお好みに合わせて下さい。上のマニュアルにあるように、アルファチャンネルを使わないよう指定することも可能です。また、解像度ではなく、画像のサイズを直接指定したい人は、そういう方法もありますんで、マニュアル読むなり、ググるなりして探して下さい。
しかし、いきなりサムネイルサイズで出力させようとすると、画質の問題が生じます。マニュアルによると、Ghostscriptの標準設定(解像度を指定しない場合に自動補完される数値)は75dpiです。モノクロやグレースケールの変換であればこの数値でほぼ問題なしですが、変換元になるファイルの画素数や色数が多いものになればなるほど、どうしても低画質感の否めない粗い画像が出力されてしまうことがしばしば起こります。
好みの画質になるまで一回一回、スクリプトを走らせて画質を確認するというのも結構面倒な作業なので、私は、まずは高画質で出力して、減色とリサイズは専用のソフトに任せるつもりです。二段階の作業になりますが、結果的にはこちらの方が手早く、かつ満足な仕上がりが得られるはずです。要は用途次第ということですね。














Recent Comments