PDFから画像抽出

PDFドキュメントに含まれる画像の抽出手段の一つについてWindows用の手順をまとめておく。使えればいいという基準で探したのであって、詳細な機能比較を行なったりはしていない。

画像梱包の「開梱」タブにPDFファイルをドロップするだけで画像を抽出できる場合がある。JavaScriptを内包しているPDFで画像梱包がエラーを吐くときも、PDF Knifeでページごとに分解すると読み込む場合がある。
この画像梱包が書き出すJPEGは再圧縮ではなく、PDFドキュメント内部のJFIFストリームをそのまま保存している可能性がある。目視で確認してもとくに劣化は見当たらず、後述のXpdfが書き出したppm画像と比較するとブロックノイズはむしろppm画像より目立たないくらいなのだ。よってこの手段が使えるならそれがベストだろう。

XpdfはPDF関連ツールをまとめたオープンソースプロジェクト。その中の一つpdfimagesがPDFから画像ファイルを抽出して書き出すツールになる。コマンドラインなので、以下のようなバッチファイルを作って、ターゲットのPDFをドロップするといい。


@echo off
set /p IMGNAME="書き出すファイルの接頭文字列を入力して下さい(例: image など) >"
pdfimages %1 %IMGNAME%
pause


このツールが書き出す画像ファイルのフォーマットはPnM。PnMはフォーマットの総称で、拡張子はpbm(二値モノクロ)・pgm(グレイスケール)・ppm(フルカラー)の3種類になる。馴染みの薄いフォーマットだがSusieプラグインが存在する。
なお画像梱包で書いたようにXpdfが書き出した画像を厳密にチェックすると、画像梱包が書き出したJPEGファイルよりブロックノイズが目立っている。これはXpdf固有の問題ではなく、純正Adobe Readerで表示させてもXpdf同様にブロックノイズが目立つ。おそらくPDFの仕様上の制限によりJPEGのデコードが不正確になるのだろう。やはりPDFは糞。

BTJ32は一括処理に長けた画像処理アプリケーション。これでPnMを読んでPNGを書き出す作業を行なう。PNGの書き出しはデフォルトでサポートされており、あと必要なのはPnMのプラグインだけである。一括処理するためには読み込み時にShift選択等で対象のファイルをまとめて読み込む必要がある。圧縮はサイズ優先、下手にいじられたくないのでフィルタはなしでいいだろう。見た目グレイスケールなのに24bitRGBなどという手抜き画像は以下のようなマクロで8bitグレスケ化してもいい。


[8bitGrayScale2]
Property=Caption=8bitグレイスケール2
Grayscale=0
Reduce=Mode=8Bit_Mode2, Check=False


以上の手順でPDFに用いられている画像を元のサイズのまま(意図的なグレスケ化を除いて)保存できる。ただPDFは画像をJPEGで格納していることが多く、それをPNGで保存することでファイルサイズの合計が元のPDFより大きくなってしまうことは避け難い。