プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

BOOKSCANでは本の表紙(カバー)をスキャンしてもらえないので、自動修正スクリプトを作りました

あけましておめでとうございます。

年末に家にある書籍(主にマンガ)をごそっとBOOKSCANでスキャンしてもらって部屋がスッキリ!したのはいいのですが、BOOKSCANでは書籍のカバーをスキャンしてもらえないという仕様で、ちょっとどうにかしたいなあと思っていました。

注文する時にリネームオプションをつければスキャン後のファイル名にISBNが追加されるため、BOOKSCAN上ではこのISBNから自動取得した画像がWEBページに表示されているのですが、i文庫など一般の電子書籍リーダーで表示すると、このような残念な感じの表示になってしまいます。

幸いファイル名は「DEATH NOTE (1) (ジャンプ・コミックス) 小畑 健 200p_4088736214.pdf」という規則性のある感じになっているので、BOOKSCANがやってることと同じことやれば解決できるじゃないか、ということで、正月だし、息抜きにこの問題を解決するスクリプトを書いてみました。

require "prawn"
require 'fastimage'

list = []
Dir.entries(ARGV[0]).each do |file|
  next unless File.extname(file) == '.pdf'
  list << file
end

list.each do |file|
  puts file

  # ISBNからカバー画像ファイル取得
  file =~ /_(.*).pdf/
  image_name = "#{$1}.09.LZZZZZZZ.jpg"
  `wget http://images-jp.amazon.com/images/P/#{image_name}`

  # カバー画像のみのPDFを生成
  Prawn::Document.generate('cover.pdf', :page_size => FastImage.size(image_name)) do |pdf|
    pdf.image image_name, :position => :center, :vposition => :center
    
    # 見開きが崩れないように空白ページを差し込み
    pdf.start_new_page
  end

  # :page_sizeを指定すると1p目に空白ページが入ってしまうので消す
  `pdftk cover.pdf cat 2-end output cover2.pdf`

  # 元のPDFファイルと結合
  `pdftk cover2.pdf "#{file}" cat output "_#{file}"`

  # 後処理
  `rm cover.pdf cover2.pdf #{image_name}`
end

手順としてはこんな感じです。

  • ISBNから画像取得
  • Prawnを使ってカバー写真をPDFに変換
  • PDFtk Serverを使って元のPDFに差し込む

あとはPDFが入っているフォルダを指定すれば自動で全部カバー写真入りのPDFが仕上がります。

ruby add_cover.rb "/Users/ntaku/Desktop/death_note"

さっきは残念だったi文庫での表示もこんな感じになりました。

書籍によってはAmazonから取得できる画像が小さくてちょっと残念なのですが、サムネイル一覧で見る分にはこれで十分!

これで心置きなくBOOKSCANを使えるようになりました。