複数画像からScanSnap Organizer で検索可能PDFに変換可能なPDFを作成するRubyスクリプト

ScanSnap を買って以降、書籍を読み終わると分解して PDF にしてきました

ただ、PDF 形式で読み取る場合、途中で読み取りに失敗したら最初からやり直しなので、失敗しようものなら一気にやる気がなくなってしまいます。オライリーの本なんて鬼門です。ページ数が多い上に紙が薄いので、何度失敗したことか。オライリーの本は PDF 版を購入しようかな。

失敗しても最初からやり直さなくて済む方法をいろいろ考えました

そして思いついたのが、「全て JPEG で読み取ったあと JPEG から PDF を作成する」という方法。JPEG 形式なら1ページ1ファイルだし、ファイル名は読み取った時刻なので、失敗した部分だけをあとで読み取って、ファイル名を変更するだけで済みます。

問題は、作成した PDF を ScanSnap Organizer で検索可能 PDF に変換するとき

変換できるのは ScanSnap Organizer で作成した PDF のみときた。ただ、変換可能かどうかの判断を PDF のプロパティの「アプリケーション」の部分で判断しているようなので、PDF を作成するときアプリケーション名に ScanSnap Organizer を指定してやれば回避できます。

Ruby でスクリプトを書いてみました

JPEG から PDF を作成し、なおかつアプリケーション名を指定できる良さそうなツールが見当たらなかったので。PDF の作成には Prawn っていうライブラリを使っています。

img2pdf.rb
# coding: utf-8
require "prawn"
require "optparse"

# オプションのデフォルト
OPTS = {
  # ScanSnap Organizer のバージョンを指定
  :Creator => "PFU ScanSnap Organizer 3.2.10"
}

# オプション引数の設定
opt = OptionParser.new
opt.on("-c CREATOR", "--creator=CREATOR", "Set creator name.") do |v|
  OPTS[:Creator] = v
end
opt.parse!(ARGV)

# PDF の出力先
output_file = ARGV.pop

# PDF にアーカイブする画像ファイル
image_files = ARGV

Prawn::Document.generate(output_file, :info => OPTS) do
  image_files.each_with_index do |img, index|
    # 最初の画像でなければ改頁
    start_new_page if 0 < index

    # フチ無し&ページ内に納まるように画像を出力
    image(img,
          :at => [
            -1 * bounds.absolute_left,
            bounds.absolute_top
          ],
          :fit => [
            bounds.absolute_right + bounds.absolute_left,
            bounds.absolute_top + bounds.absolute_bottom
          ])

    puts img
  end
end

ScanSnap Organizer で変換可能な PDF を作成できます

Creator に指定しているアプリケーション名を手持ちの ScanSnap Organizer のバージョンに編集して、

ruby img2pdf.rb ./*.jpg ./sample.pdf

を実行すれば PDF が作成されます。

オプション引数でアプリケーション名を指定することもできるので、

ruby img2pdf.rb -c "PFU ScanSnap Organizer 3.2.10" ./*.jpg ./sample.pdf

でもいい。あと、optparser 初めて使ったけど、なかなか便利ですね。

追記(2012-03-27)

JPEG で取り込んだ後 PDF にする方法では、カラー PDF になるので、おのずのファイルサイズが大きくなってしまう。事実、直接 PDF に取り込んだときの3倍くらいのサイズだった。PDF で取り込んで、ツールで結合する方法がやっぱりいいのかも。。。