Asial Blog

Recruit! Asialで一緒に働きませんか?

ドキュメントスキャナで本を電子化

カテゴリ :
バックエンド(インフラ)
タグ :
Tech
Debian
sane
scanimage
ADFスキャナ
ドキュメントスキャナで本を電子化

最近、紙媒体が鬱陶しく思えてきました。
現在、コミックやラノベが合わせてかなりの数になり、読みたいものがすぐに出てこないことが多々あり困っています。
(読んでからしばらくして新刊が発売されたが、ストーリーをほとんど覚えていなかったので見返そうと思ったら、棚の奥深くに・・・)
買ったものはデータベース化しているので、買ったか買っていないかは分かっても、肝心のモノが出てこない。
さらに部屋は狭いので、保管場所に苦労する羽目に。(むしろ、そろそろ置く場所がなくなり平積みにしています)
PCならば、古いファイルでもとりあえずfindとgrepがあれば検索出来るのに・・・。

それなら電子化すればいい!

ということで、少々考えてみました。

電子化のメリット
・検索がすぐ出来る
・すぐに出てくる
・iPhoneなどのモバイル機器で見ることが出来る(転送orWEBアプリでネット経由)
・場所をとらない(HDDさえあればOK)
・ディスプレイで読める

電子化のデメリット
・バラす必要がある
・手間がかかる(断裁、スキャン)
・HDDの容量を食う
・原本よりクオリティは下がる

ざっと思いついたところでこんな感じになりました。

自分としては、メリットの方が多いので断裁してスキャンすることに決定。
ググって見たところ、業務用の安いグレードでコストパフォーマンスがいいfi-6130を見付けて衝動買いしました。

自分の衝動買いにしてはいい買い物です。
第一に速い!
600dpiでも分速30P。200Pの雑誌なら7分程度。
さらに、ほとんどダブルフィードしない!
したとしても検知してすぐに止まる!

その上、TWAINに対応しており、Linuxで直接操作出来ます。
そういうことで、今回はLinuxでTWAIN対応のスキャナを使用する方法を書こうと思います。

1・SANEのインストール
SANEをインストールしてスキャナを使用出来るようにします。
  1. $ sudo apt-get install sane sane-utils
例のごとく、以上。

2・スキャンしてみる
手っ取り早くスキャンするなら、
  1. $ sudo xsane
でOK
rootで作業すると云々というメッセージはでますが、無視。
無視するのが嫌なら、lsusbでbusのIDを調べて/dev/bus/usb/以下のデバイスについてのアクセスを許可すればOK
  1. sanzenin@nagisystem:~$ lsusb
  2. Bus 002 Device 005: ID 0925:1801 Lakeview Research
  3. Bus 002 Device 003: ID 04fe:000d PFU, Ltd
  4. Bus 002 Device 002: ID 046e:5244 Behavior Tech. Computer Corp.
  5. Bus 002 Device 004: ID 047d:2041 Kensington
  6. Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  7. Bus 001 Device 006: ID 04c5:114f Fujitsu, Ltd
  8. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
PFUとFujitsuがみえますが、PFUの方はHHKBなのでFujitsuの方で。
  1. sanzenin@nagisystem:~$ ls /dev/bus/usb/001/006 -l
  2. crw-rw-r-- 1 root scanner 189, 5 2010-04-01 01:46 /dev/bus/usb/001/006
777にするか、ユーザーをscannerグループに追加するかはお好みで。

xsaneを起動すると、こんな感じ。



大まかな手順は、
1・原稿一枚をセット
2・左側のプレビュー画面での左下にあるAcquire previewをクリックし、プレビューを表示
3・プレビュー画面に表示された原稿を選択してトリミング
4・お好みで色などを調整
5・真ん中のメインウインドウ上部の読み取りページ数(ここでは32になっている部分)でページ数を指定
6・読み取る数だけ原稿をセットし、同ウィンドウのScanボタンでスキャン開始

右側のDF actionなどと書いてある部分はスキャナによって表示は異なるようです。
fi-6130の場合は、ダブルフィードを検出する方法の選択(傾き、超音波、長さ)、背景色(白、黒)、バッファの使用などの設定が出来ます。

細かいパラメータは詳しくないので割愛。

3・コマンドラインからスキャン
GUIは楽でいいですが、カラーページとモノクロページがランダムに入っている雑誌の場合、いちいち設定を切り替える必要があります。
設定をクリックして読むのは非常に面倒なわけで、コマンドでバッチ化出来ればかなり楽になります。また、独自のフロントエンドも作れたりします。
コマンドの場合は、scanimageを使用します。
  1. $ sudo scanimage \
  2. --format tiff \ # 出力はtiff画像
  3. --mode Color \  # カラーモードでスキャン
  4. --resolution 300 \  # 300dpi
  5. -b \                # ?
  6. --source 'ADF Duplex' \ # ADF両面
  7. --bgcolor black \       # 背景色黒
  8. --page-width 182 \      # 横182mm
  9. --page-height 259 \     # 縦259mm
  10. --df-action=Stop \      # ダブルフードした場合は停止
  11. --df-thickness=yes \    # 重なり検知ON
  12. --df-length=yes \       # 長さ検知ON
  13. --brightness=12 \       # 明るさ12
  14. --contrast=3 \          # コントラスト3
  15. --batch="%.4d.tiff" \   # 連番の振り方
  16. --batch-start=1         # 連番の開始
こんな感じでオプションを指定し、実行すればスキャン出来ます。
他のオプションは、scanimage --helpで確認可能です。
(スキャナに問い合わせて、独自のオプションも拾ってくるので、反応が帰ってこなくてもしばらく待ってください)

4・すごくいい加減なバッチ
  1. #!/bin/bash
  2. page=$((`ls | sort -n | tail -n 1 | grep -o '[0-9]*' | sed 's/^0*//'` + 1))
  3. while true
  4. do
  5. echo "-----------------------------"
  6. echo "Current page is $page"
  7. echo "input [c/l]"
  8. while true
  9. do
  10. read  type
  11. if [ "$type" = "c" -o "$type" = "l" ]
  12. then
  13. break;                                                                                                                         
  14. fi
  15. echo "Undefined type. input c or l"
  16. done
  17. if [ "$type" = "c" ]
  18. then
  19. echo scan color
  20. sudo scanimage \
  21. --format tiff \
  22. --mode Color \
  23. --resolution 300 -b \
  24. --source 'ADF Duplex' \
  25. --bgcolor black \
  26. --page-width 182 \
  27. --page-height 259 \
  28. --df-action=Stop \
  29. --df-thickness=yes \
  30. --df-length=yes \
  31. --brightness=12 \
  32. --contrast=3 \
  33. --batch="%.4d.tiff" \
  34. --batch-start=${page}
  35. elif [ "$type" = "l" ]
  36. then
  37. echo scan lineart
  38. sudo scanimage \
  39. --format tiff \
  40. --mode Lineart \
  41. --resolution 600 -b \
  42. --source 'ADF Duplex' \
  43. --bgcolor black \
  44. --page-width 182 \
  45. --page-height 259 \
  46. --df-action=Stop \
  47. --df-thickness=yes
  48. --df-length=yes \
  49. --brightness=40 \
  50. --contrast=55 \
  51. --batch="%.4d.tiff" \
  52. --batch-start=${page}
  53. fi
  54. page=$((`ls | sort -n | tail -n 1 | grep -o '[0-9]*' | sed 's/^0*//'` + 1))
  55. done

いちいちカラーとモノクロのコマンドを打つのが面倒なので、簡単なバッチファイルを作成しました。
1・カラーとモノクロを選択
2・ADFに入っている原稿をすべてスキャン
3・スキャン終了したら最後の画像+1をbatch-startに設定し、1へ戻る

スクリプトも設定値もかなりいい加減なので、あくまでも参考程度にしてください。

現在、上記スクリプトをGUIで出きるように空いた時間でちまちまプログラム組んでます。(perl-gtk使用)
こちらも出来たらそのうちに公開するかもしれません。
現在はボタンを押したらスキャン開始して、最新の画像をプレビュー表示することが目標ですが、将来的にはトリミングや画質調整が出来ればいいなとか思ってます。

あと、画質の設定値は色々と試行錯誤中。なかなか綺麗にならない。
単行本をスキャンするにあたって、表紙くらいは綺麗にスキャンしたい。モノクロ2値なページならそこそこ綺麗にスキャン出きるが・・・。

とりあえず、全書籍の電子化に一歩近づきました。漫画雑誌はすべてスキャンしようかと思います。
単行本についても雑誌が終わり次第着手。
ラノベは読み終わったものから着手。
漫画はiphoneでも何とか読めますが、ラノベは解像度が高くないとどうしても読みにくいので(約40x40をリサイズなしですべて表示する必要あり)後回しに。
ラノベを読むデバイスとして、iPadにはかなり期待しています。
大きさそこそこ、解像度そこそこ。
静かで持ち歩きも出来るとくれば、便利に使えそうです。

余談ですが、iPadについては日本の電子書籍よりも、個人で自炊したもののビューワとして普及したりしてと思ってみた今日この頃です。

さらに余談ですが、念のため・・・スキャンしたデータはどこかに公開とか流出とかさせないようにしてください。あくまでも私的利用の範囲内で。
自分の場合は、内部からのみアクセス可能なサーバーに保存。外部からは自分専用のOpenVPN経由でしかアクセス出来ないようにしています。(というか、自作ビューワが適当すぎてry)
あと、原本については、後々スキャンすることがあるかもしれないので、ダンボールに入れてクローゼットに保管しています。