それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby imageMacick RMagick で 画像からPDFを作る

rmagick で PDFを作るのがちょっと手間だったのでメモ

rubyimagemagick 実装である rmagick が有ります。

RMagick を使えば、magick 関連が使えるbindings で重宝する。

無論、Rubyからmagickを使うには、convert/mogrifyのシェル呼び出しで済むのだ。

だけど、シェル呼び出しだと一時ファイルを作ったり消したりになるので、デバッグが一手間増えるんですよ。

シェル呼び出しは確実なんだけど、パパパパパパッと試したい時に不便だったりする。

RmagicでPDF作成

シェル呼び出しだとこれだけで済むのですが

convert sample1.jpg sample2.jpg out.pdf 

これと同じをRMagickでやるには

#!/usr/bin/env ruby

require 'RMagick'

r = Magick::ImageList.new()

r.push( Magick::Image.read( 'sample1.jpg')[0] )
r.push( Magick::Image.read( 'sample2.jpg')[0] )

r.write('out.pdf')

このようになる。

ポイントはImageListもImageも配列であるということ

ruby から処理を行うと Magick::ImageMagick::ImageList のどちらも、配列風のオブジェクトであるという点にある。

そのため、push しようとしても「配列なんていられるか!バーカ!」と rmagickに怒られることになる。

/Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rmagick-2.15.4/lib/rmagick_internal.rb:1291:in `is_an_image': Magick::Image required (Array given) (ArgumentError)
    from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rmagick-2.15.4/lib/rmagick_internal.rb:1729:in `block in push'
    from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rmagick-2.15.4/lib/rmagick_internal.rb:1728:in `each'
    from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rmagick-2.15.4/lib/rmagick_internal.rb:1728:in `push'
    from rmagick-test.rb:9:in `<main>'

そのため、Imageから先頭を取出す(どうせ要素数1なのに面倒くさい)

image_list = Magick::ImageList.new()

i = Magick::Image.read( 'sample1.jpg')[0] 
image_list.push i

このような一手間増える処理が必要だった。

これを行うことで、JPEGだけから構成されるPDFを作成することが出来る。

画像JPEG だけから構成されるPDFはZipファイルをより管理が容易だし、メールなどで送付する際にも大変便利。