Adobe Acrobat を使わずに PDF から画像を抽出する

Adobe Acrobat を利用すれば、簡単に PDF から PNG や JPEG など様々な形式で画像を抽出することができるが、同様のことは、このソフトがない場合には pdfimages というコマンドラインツールと、先日の記事 でも触れた ImageMagick を組み合わせれば可能である。

pdfimagespoppler-utilsxpdf-utils の一部として含まれるが、多くの Linux distribution には標準で含まれている。Mac OS X では Macports などで、

$ sudo port install xpdf

また、Windows でも Cygwin から利用可能だと思う。

使用方法は、

$ pdfimages [options] PDF-file image-root

-j オプションで JPEG ファイルとして抽出可能である。通常は PBM (for monochrome images) か PPM (for non-monochrome images) で書き出される。

次のような簡単なシェルスクリプト (extract_image.sh) を作成しておけば、PDF (hoge.pdf) のファイル名と同様の名前のフォルダ (hoge) に画像が書き出される (使い方: extract_image.sh hoge.pdf)。

#!/bin/sh

BASENAME=`basename $1 .pdf`

if [ $# -lt 1 ]; then
    echo "usage : `basename $0` <pdf-file>"
    exit
fi

if [ ! -d "$BASENAME" ];then
    mkdir "$BASENAME"
fi

pdfimages "$1" "$BASENAME/$BASENAME"

これらの書き出された画像に対して convert で PNG に変換したり、回転させたり (-rotate)、中央で切り取ったり (-crop) と加工する1 (*.pbm と *.ppm は適宜読み替え)。

(上の続き)

cd "$BASENAME"
for f in *.pbm;do
    FILENAME=`basename $f .pbm`
    echo "$f"
    convert -rotate 270 -crop 50%x100% "$f" "$FILENAME.png"  # <-- option は適宜変更
    rm "$f"             # <-- *.pbm は削除
    echo "done."
done

私も今回テスト用に pdfimages を実行してみたが、書き出された画像 (*.pbm) がなぜか 90 度回転していたので、上のように convert のオプション (-rotate 270) で元に戻している。ImageMagick は超多機能なので、リンク先 を参照して、他のオプションについても、状況に応じて変更すれば良いだろう。

上のスクリプト (extract_image.sh) を実行すると、例えば、本や論文など、見開きでスキャンされ作成された PDF ファイルを1ページごとの PNG 画像に抽出することが可能である2

iPad などで閲覧する場合も、見開き画像よりこうした1ページごとの画像の方が見栄えは良い。スキャン元の実際のページ番号をファイル名に含ませる (sample_0001.png, etc.) 手間をかければ、すぐに目的のページにジャンプでき 、さらに扱いやすくなるだろう。

$ ls *.png | awk '{ printf "mv %s sample_%04d.pngn", $0, NR }' | sh

(画像は iPad のi文庫HD)

https://skalldan.files.wordpress.com/2012/09/wpid-pdfcrop_ipad2.png

【追記】

少し調べてみると見開きの PDF を単一ページに一括で crop する方法はいくつかあるようである。→ Cropping Double-Paged Scans for PDF – MobileRead Forums

Perl の Script や、クラスプラットホーム (Mac OS X, Windows, Linux) なアプリケーション briss など。briss は Debian の java (v.1.6.0_24) で試してみたが、この目的にはこのアプリケーションがもっともシンプルで良いかもしれない。

Footnotes:

1 はじめから convert だけで、

$ convert -density 300 hoge.pdf img_%04d.png

を実行してもよい感じがするが (cf. How to extract one page of a PDF as an image)、これはものすごく CPU に負荷をかける作業のようなので、結局 pdfimagesconvertmogrify の組み合わせの方が良いと思う。

2 ちなみに、Adobe Acrobat で同じ事 (見開きでスキャンされた PDF を単一ページの画像に書き出す) を行う場合、どのように行うか分からない。いろいろ試行錯誤して、例えば、偶数ページと奇数ページを別々に切り出してあとから統合する、といった方法では可能だったように記憶しているが (このあたりの話題)、どうももう少しすっきりした方法があるような気がする。ご存知の方がいらっしゃれば教えていただければ幸いです。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s