おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

自炊のはなし

自炊とは?

自炊とは通常「自分でご飯を作ること」であるが、コンピュータの世界では「紙媒体のもの(書籍など)をスキャンして電子媒体(主にPDF)にすること」を意味するスラングである。データをスキャンして「自らスイこむ」からきているらしい。ところで、一般に販売されている書籍を著者(または著作権を有する個人や団体)に許可なくデジタル化することは、たとえそれを個人使用に限っても、違法になる場合があるので注意を要する。しかし、自炊(ここでは広くスキャンによって紙媒体から電子媒体にすること、しかもそれが合法的な場合を自炊と呼ぶことにする)は、書籍以外にも、自分で書いたノートなどに対しても有用であると思う。

スキャナの状況

最近のスキャナの状況は大きく3通りに分かれる。
1.フライトヘッドスキャナ(複合プリンタを含む)
2.ドキュメントスキャナ
3.モバイルスキャナ
それぞれに長短がある。
フライトヘッドスキャナは少々厚い媒体でもスキャンができる。例えば手形をとる(こんなことする人いないと思うが)などに適している。ドキュメントスキャナは複数の紙を連続してスキャンすることができる。例えば富士通のix500は一度に50枚の紙をセットすることができ、高速スキャンが可能である。最も自炊に適したスキャナと言える。モバイルスキャナは携帯できるところにその特長がある。
また、最近のスキャナはUSBメモリやSDカードを装着して、それら外部メモリにスキャンデータを保存できるようになっているものが多い。これはLinuxユーザにとっては大きい。というのは、殆どのスキャナのドライバはMacまたはWindows専用になっているからだ。LinuxのスキャナドライバはSaneだが、これはWindowsのスキャナドライバであるtwainとの互換性はない。したがって、saneでコントロールできないスキャナが少なくないのが現状である。
ドキュメントスキャナ以外でもやる気になりさえすれば、面倒に思えるスキャンもさほどではない。問題はスキャンしたあとのデータ処理である。一応ここではスキャンしたデータはJPEG形式で保存されていると仮定する。

スキャンデータの処理

スキャンしたデータの処理で必要なのは次の2つである。
1.縦長はそのままで良いが、横長の場合は90度画像を回転しなければならない
2.一連のデータをまとめてPDFデータにする
これらは、ImageMgickのconvertコマンドで処理できる。また、それをコントロールするスクリプト(PerlやRubyなど、またはシェルスクリプトでもよい)が必要である。

画像回転のサンプルプログラム

画像データのファイル名が、「EPSON001.JPG」(エプソンの複合プリンタの場合)のような形式であったとする。データのうち、そのファイル名の番号が、12~17、40~48、55~103を時計回りに90度回転したかったとする。以下はそのためのRubyスクリプトである。
# rot.rb
def rotate(from, to)
  from.upto(to) do |number|
    filename = "EPSON"+sprintf("%03d", number)+".JPG"
    print "convert -rotate +90 #{filename} #{filename}\n"
  end
end

rotate(12, 17)
rotate(40, 48)
rotate(55, 103)
このスクリプトはbashコマンドを出力する。
$ ruby rot.rb
convert -rotate +90 EPSON012.JPG EPSON012.JPG
convert -rotate +90 EPSON013.JPG EPSON013.JPG
・・・・・・
convert -rotate +90 EPSON102.JPG EPSON102.JPG
convert -rotate +90 EPSON103.JPG EPSON103.JPG
$ 
convertはImageMagickのパッケージに含まれるコマンドで、様々なオプションがあるが、ここで使われている「-rotate」オプションは画像を回転するものであり、+90ならば時計回りに90度、-90ならば反時計回りに90度だけ回転させる。
これを、bashの入力にパイプラインで繋げば、画像の回転が実行される。
$ ruby rot.rb | bash

画像をまとめてPDFに

画像をまとめてPDFにするのもconvertコマンドとスクリプトで行える。ここでは、スキャンしたものが複数の本であったとして、それぞれをpdfにまとめることを想定してスクリプトを書いている。
1~10を「Sample1」というpdfファイルに、11~17を「Sample2」というpdfファイルに、18~39を「Sample3」というpdfファイルにまとめるとする。
# mkpdf.rb
def convert(from, to, filename)
  s = "convert "
  from.upto(to) do |number|
    s << " EPSON"+sprintf("%03d", number)+".JPG"
  end
  s << " #{filename}.pdf"
  print s+"\n"
end

convert(1, 10, "Sample1")
convert(11, 17, "Sample2")
convert(18, 39, "Sample3")
これもシェルコマンドを出力する。
convert  EPSON001.JPG EPSON002.JPG EPSON003.JPG EPSON004.JPG EPSON005.JPG EPSON006.JPG EPSON007.JPG EPSON008.JPG EPSON009.JPG EPSON010.JPG Sample1.pdf
convert  EPSON011.JPG EPSON012.JPG EPSON013.JPG EPSON014.JPG EPSON015.JPG EPSON016.JPG EPSON017.JPG Sample2.pdf
convert  EPSON018.JPG EPSON019.JPG EPSON020.JPG EPSON021.JPG EPSON022.JPG EPSON023.JPG EPSON024.JPG EPSON025.JPG EPSON026.JPG EPSON027.JPG EPSON028.JPG EPSON029.JPG EPSON030.JPG EPSON031.JPG EPSON032.JPG EPSON033.JPG EPSON034.JPG EPSON035.JPG EPSON036.JPG EPSON037.JPG EPSON038.JPG EPSON039.JPG Sample3.pdf
これをパイプラインでbashに繋げばpdfファイルにまとめ上げることができる。
$ ruby mkpdf.rb | bash
convertコマンドを手で打ち込むことはとても長くてやれないが、このようにスクリプトにすれば簡単にできる。別にrubyでなくても良い。perlでも同様のことはできるし、シェルスクリプトでもできるかもしれない(作るのは面倒に見えるが)

自炊してみて

実際にpdfファイルを作ると、実に便利である。単独の画像だといろいろと不便がある。倍率調整が必要だったり、いくつか先のページに飛びたいときなど、本当に不便だ。ところがpdfにするとこれらの不便が一気に解決してしまう。それに、紙媒体は重いが電子媒体はタブレットなどに保存すれば手軽に持ち運びできる。
ここで書いた方法は、ある程度LinuxやRubyに精通している人でないと難しいと思う。もっと直感的にできるソフトがあれば良いのだが・・・。そういう悩みがある人で、お金がある人は、ドキュメントスキャナをWindowsで動かすのが最も簡単であり、オススメである。お金に余裕がない人は(私のように)がんばって勉強していきましょう。