PDFを画像ファイルに

「pdfを画像ファイル」で検索してる方がいるらしいので、PDFファイルから画像を取り出す方法をちょっと調べてみました。主に Mac か Linux 環境向けです。Windows の場合は……「かんたんPDFダイエット」とか使えばいいんじゃないですかね。

Poppler (または Xpdf) を使う

Poppler に “pdftoppm” というコマンドがありますのでそれを使います。

pdftoppm hoge.pdf output

と実行すると、hoge.pdf をファイル名の先頭に output をつけた画像ファイルに出力します。
主に以下のようなオプションがあります。

-png, -jpeg  :PNG, JPEGファイルを生成
-gray    :グレースケールのPGMファイルを生成
-r 数字    :解像度 (DPI) を指定
-o      :奇数ページのみ
-e      :偶数ページのみ

-png, -jpeg, -tiff, -gray などのオプションが無いと PPM ファイルを生成するはず。その場合は ImageMagick の mogrify で変換しましょう。

mogrify -format png output*.ppm

以下、ヘルプのコピペです。

% pdftoppm --help
pdftoppm version 0.22.0
Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftoppm [options] [PDF-file [PPM-file-prefix]]
  -f <int>                 : first page to print
  -l <int>                 : last page to print
  -o                       : print only odd pages
  -e                       : print only even pages
  -singlefile              : write only the first page and do not add digits
  -r <fp>                  : resolution, in DPI (default is 150)
  -rx <fp>                 : X resolution, in DPI (default is 150)
  -ry <fp>                 : Y resolution, in DPI (default is 150)
  -scale-to <int>          : scales each page to fit within scale-to*scale-to pixel box
  -scale-to-x <int>        : scales each page horizontally to fit in scale-to-x pixels
  -scale-to-y <int>        : scales each page vertically to fit in scale-to-y pixels
  -x <int>                 : x-coordinate of the crop area top left corner
  -y <int>                 : y-coordinate of the crop area top left corner
  -W <int>                 : width of crop area in pixels (default is 0)
  -H <int>                 : height of crop area in pixels (default is 0)
  -sz <int>                : size of crop square in pixels (sets W and H)
  -cropbox                 : use the crop box rather than media box
  -mono                    : generate a monochrome PBM file
  -gray                    : generate a grayscale PGM file
  -png                     : generate a PNG file
  -jpeg                    : generate a JPEG file
  -tiff                    : generate a TIFF file
  -tiffcompression <string>: set TIFF compression: none, packbits, jpeg, lzw, deflate
  -freetype <string>       : enable FreeType font rasterizer: yes, no
  -aa <string>             : enable font anti-aliasing: yes, no
  -aaVector <string>       : enable vector anti-aliasing: yes, no
  -opw <string>            : owner password (for encrypted files)
  -upw <string>            : user password (for encrypted files)
  -q                       : don't print any messages or errors
  -v                       : print copyright and version info
  -h                       : print usage information
  -help                    : print usage information
  --help                   : print usage information
  -?                       : print usage information

Automator を使う (Mac OS X 限定)

Mac OS X の自動化ツール Automator に PDF 関連のアクションが結構あります。
「PDF ページをイメージとしてレンダリング」というアクションが今回の目的にあいそうです。
「奇数ページと偶数ページを抽出」というアクションもありますね。

スクリーンショット 2013-02-07 4.58.09

自炊スキャンデータをKobo Gloに最適化

Kobo Glo 買いました。Kindle Paperwhite と比較したんですが、やっぱり microSD が挿せないのは不便ですから。あと Kindle のコンテンツそんなに持ってませんし。

で、自炊した小説(JPEGファイルをZIPでかためたもの)を Kobo Glo で表示してみたんですが、文字がかすれ気味でちょっと読み辛いです。

そこで電子ペーパーに最適化する方法を検索。見つけたのは以下の記事。

Kindle Paperwhiteで自炊した本を読む手順と便利なツール | ごりゅご.com

calibre というオープンソースのアプリがあるんですね。WindowsでもMacでもLinuxでも動くそうです。

という訳で早速Macにインストールして変換してみたんですが……、あんまり綺麗じゃないですね。原稿とディスプレイの縦横比が違うと悲惨なことに。それにも増して厭だったのが、日本語ファイル名がアルファベットになることです。設定で変えられるとは思うんですが。

他の手は無いかと更に検索。

ScanSnap後の画像処理 – \ay diary

なるほど、ImageMagick の convert コマンドでトリミング出来るんですね。私はZIPを展開したあと、以下のようにターミナルで実行しました。

for i in *.jpg; do
    convert ${i} -type grayscale -sharpen 5 -fuzz 50% -trim -linear-stretch 2%x2% -bordercolor white -border 2%x2% png:- | convert - -depth 4 -resize 758x1024 ${i%.jpg}.png
done

"-type grayscale" でグレースケールに、
"-sharpen 5" で鮮鋭化、
"-fuzz 50% -trim" でファジーにトリミング、
"-linear-stretch 2%x2%" でヒストグラムを引き伸ばしてコントラストを上げ、
"-bordercolor white -border 2%x2%" で白枠を付け(ギリギリにトリミングすると読み辛いので)、
"-depth 4" で 4-bit 化(ファイルサイズが小さくなりますが、ImageMagickのバージョンによっては対応してないかも)、
"-resize 758x1024" で Kobo Glo 用に解像度変換しています。

ライトノベル一冊当たり6分程度かかります。GNU Parallel が使えるようでしたら、

ls *.jpg | parallel -j4 "convert {} -type grayscale -sharpen 5 -fuzz 50% -trim -linear-stretch 2%x2% -bordercolor white -border 2%x2% png:- | convert - -depth 4 -resize 758x1024 {.}.png"

みたいにすると速くなるかも知れません。更にファイルサイズを小さくしたい場合は、以下のように OptiPNG を実行すると5%くらい小さくなるでしょう。

optipng *.png

元ファイルが PDF の場合は kindlizer を使うといいかも。ImageMagick の他に Poppler, sam2p, PDFtk, Rake が必要になります。

Kindlizerの使い方 – はてなの鴨澤

あ、ImageMagick も Parallel も OptiPNG も Homebrew で一発インストールしました。


追記

シェルスクリプトにしてみました。ZIPでかためたJPEGファイルをKobo Gloに最適なCBZファイルにします。→ Zipped jpeg files to CBZ file for Kobo Glo.

ImageMagickでサイズ変更

 今更なネタですが自分の備忘録として。たまにしか使わないからすぐ忘れる……。

 開発向けのアプリで固定解像度 (1812×1240) のビットマップ画像しか受け付けてくれないというのがありまして。Photoshop なんかで逐一リサイズしてたら面倒くさいことこの上ないのでコマンドラインでやることにしました。

for i in *.jpg ;
do
convert -depth 8 -density 600 -geometry 1812x1280 -crop 1812x1240+0+15 $i `basename ${i} jpg`bmp ;
done

 こんな感じgeometry でサイズ変更して crop で切り出し。デフォルトで 16bit になってしまうので depth 8 が必要。

 ところで最初、geometrycrop を同時にできないものと思い込んで

convert -geometry 1812x1280 input.jpg - | convert - -crop 1812x1240+0+15 output.bmp

みたいにしてました。それはいいんですが、前の方法で生成された画像と若干色合いが違うんですがどういうことなんでしょう……?Cygwin 環境だったから?