スキャナで生成されたPDFデータをPNGに変換したいと思った時。1ページ1ページを分離してそれぞれ1つの画像ファイルとして保存したい。
1.ImageMagickで
[bash]
$ convert hoge.pdf hoge.png
[/bash]
一番単純。これは画質がガタ落ちになる。densityオプションで画質向上できるけど、上げれば上げるだけどんどんRAMを必要とする。高画質な状態で作業したい時には不向き。density上げすぎると死亡する。
[bash]
$ convert -density 600 hoge.pdf hoge.png
zsh: abort (core dumped) convert -density 600 hoge.pdf hoge.png
[/bash]
2.pdfimagesで
[bash]
$ pdfimages -png hoge.pdf hoge
[/bash]
結構時間かかるが画質を落とさず取り出せる。
ただしスキャナの設定によって、理想通りの動作にならないことも。pdfimagesはPDFに画像データが貼り付けられていたらそれを取り出す、という動作のため、スキャンデータが1枚の画像として取り扱われる場合には(ただの画像データを貼り付けただけのページが並ぶため)PDF→PNG変換のように見える。しかし一部を文字として認識したりすると、各ページは複数のパーツ画像と文字、のようなデータになるため、pdfimagesを使うと、そこにあるパーツ画像のみが取り出される。
3.xpdfで
xpdfはpdftopngというそのものズバリなコマンドを持っている。xpdfからフォークしたPopplerではpdftoppmがあるので、これで一度ppmで書き出してからpngにしても良いかも。
[bash]
$ pdftopng -r 600 hoge.pdf hoge
[/bash]
画質を落としたくないという事でDPIを600に設定してみたが、サクサク処理が進んでいく。軽い。今まで知らなかったけどめちゃくちゃ良いじゃん。
まとめ
convert→何でもおk、ファイル種別も自動判別のお手軽仕様だが、今回の用途では画質に拘ると死ぬ
pdfimages→割と手軽に使えるが、PDFデータの状態によっては理想通りの動作にはならない
pdftopng(Popplerならpdftoppm)→今の所マズイところが見当たらない
いつか読もうと思ってた本だけどレビューはそんな評価高くなくて微妙な気持ちになってる(ならなぜこれのリンクを張るのだといのは置いといて)