自炊PDF

スキャンしたPDFの後処理

以前から懸案ではあったのだが,Windowsマシンも買ったことだし,画像処理関係のツールをいろいろ集めて実験してみた。実は,Mac上でもImageMagickなどで実験していたのだが,Windowsだと専用のツールが豊富にあるようなので,それがWindowsマシン購入の理由の1つだったりするのだ。

自分でスキャンするものについては,スキャンの段階で白黒2値とか選べるが,Bookscanなどのスキャン代行業者に依頼したものは,そういうわけにもいかず,黄色く紙焼けした本など,そのまんまカラーでスキャンされているものが,けっこうある。それをきれいに脱色して,白黒2値あるいは16階調グレースケールあたりに変換するのが目的である。

いくつか試してみた結果,画像梱包,Ralpha Image Resizer, XnView の3つを使って,とりあえず目的を果たした。XnViewはMac版やLinux版もあるが,あとの2つはWindows専用のプログラムである。

まず,画像梱包(pic2pdf)を使って,PDFの画像を抽出する。ソフトの注意書きには,画像梱包でPDFにしたものに対してのみ抽出可能とあったが,スキャンした本のPDFでも大丈夫のようだった。要するに,複雑な構造のPDFもあるから,それは無理ということなのだろう。本をスキャンして作ったPDFは,たいていの場合,単にJPEGのデータにヘッダー(XMLとか)を付加しただけであるから,問題ないのだと思う。抽出のスピードも非常に速い。AcrobatでJPEG出力するよりもずっと速いのだ。しかもJPEGのヘッダーを外すだけなので,基本的に無劣化で画像が取り出せるらしい。

次は,Ralpha Image Resizer を使っての画像処理。紙焼けは,周辺部がとくにひどいので,文字がないことを確認してから,上下左右をトリミングする。そして,同じ分量だけ付け加える。こうすると,紙の周囲が真っ白になる。次に,2倍に拡大する。これで,600dpi相当にオーバーサンプリングしたことになる。最後に白黒2値化するので,解像度を上げておきたいから。続いて,トーンカーブを調節する。ここのところは,ImageMagickのlevel処理のように,high, low, gamma の3つで簡単に処理しても良いと思うのだが,まあ,似たようなもの。プレビュー出来るので,結果を見ながら調節できる。最後に,赤チャンネルのみを抽出してグレースケールにする。

このあと,白黒2値でCCITT FAX G4圧縮のTIFFにしたいのだが,Ralphaでは白黒2値というメニューがない。グレースケールで色数を2色にすれば,白黒2値と同じなのかもだが,それでもJPEGになってしまうのは嫌なので,Ralphaだけで済ますのはあきらめた。結局,Ralphaでは,グレースケールにしてPNGとして出力させて終了。

Ralphaで出力したPNGファイルをXnViewで一括変換する。一気に白黒2値とどれくらい違うが疑問だが,段階を踏むことにして,グレースケールの色数を4bit, 3bit, 2bitと下げていき,最後に1bitつまり白黒2値にする。白黒2値にする際には,閾値(しきいち,threshold)というパラメーターがあるはずなのだが。何故か見当たらない。ここが謎なのだが,ともかく白黒2値にする。出力はCCITT FAX G4圧縮のTIFFファイルとする。

最後に,再び画像梱包を使う。解像度を600dpiと指定して,PDFに固める。解像度の指定をしておくと,Acrobatで見るとき,100%でもそれほど巨大にならないし,それに,表紙と裏表紙(これはPDFから抽出したままで,2倍にしていない)を後からAcrobatで加えるとき,同じ大きさで表示されるので,ちょうど良い。

以上で作業は終了。これをバッチ処理できるスクリプトがあればよいのだが。書式は,
mypdf2pdf hoge.pdf -level high low gamma -color 1-2 143-144 -resize 2 hoge2.pdf
とかいった感じで。

自炊事始め2

裁断の要領や注意点(紙がくっついてないかを、くどいくらいにチェックすること)も分かってきたので、いよいよハードカバーの書籍の解体・裁断・スキャンをやってみた。

少々ためらったが、シュヴァルツの解析学(全7巻)を遡上に。まずは、第7巻から。魚をさばくのに比べればずっと楽。(というか、やったことないから、想像だが。) 本体と表紙をくっつけているガーゼ(?)のような部分があるので、カッターで真っ直ぐに切ると、繋ぎ目がきれいに外れるようだ。上手くやると背表紙に傷をつけることなく、ハードカバーだけがパカっと取れる。まあ、どのみち廃棄するのではあるが、中には裁断後も残す本もあるだろうから。

裁断機Durodex 200DX, OFLAカッターハイパーH型, PLUS カッティングマット, アルミ直尺アル助

道具は、カッター、カッティングマット、定規、そして裁断機。

ハードカバーを解体・裁断 (シュヴァルツ 解析学7)

上で書いたように、脇の部分(?)というか、繋ぎ目を切断してハードバウンドを外す。読み取りはまだ試行錯誤中だが、網掛けの挿絵のない数学書の場合、白黒が一番読みやすいと思う。ScanSnapではPDFかJPEGしか選べないのだが、白黒だとJPEGも選べずにPDFの一択になってしまう。内部フォーマットはJPEGなのか、それともTIFFなのか、それも分からない。まあ、でも、これでまずまず満足の画質ではある。

白黒で読み取ったページ

念のため、カラーのJPEGでも読み取っておくことにした。圧縮もレベル2と少なめにした。ホントはRAWというかTIFFかPNGで読み取ったものを原本にしたいところだが、まあ、その代わりといったところ。

カラーで読み取ったページ

白黒での読み込みも、実はカラーで読み取ってから、画像処理用のCPUか何かでソフトウェア的に白黒にしているのだと思う。だとすれば、カラーで読み取ってから、ImageMagickなどで変換するのと、(手間を除けば)変わらないのはず。

しかし、本を解体するのは、心理的な抵抗感があるなあ。そのうち慣れちゃうのかもだけど。

自炊事始め

一昨日,初めてScansnap IX500でスキャンしたのだが,昨日は,これまた初めて裁断機 Durodex 200DX を使ってみた。幾つか失敗もしたので,反省点を含めてメモ。

  • 裁断後,ページがくっついてないかを,キチンと確認すること。ホッチキス留めの雑誌で失敗したのだが,内側のページがほんの僅かではあるが,くっついていて,そのせいでジャムってしまった。ぱっと見るとちゃんと裁断されているように感じるのだが,油断すべからず。安全を考えるのなら,多めに裁断しよう。
  • 上に関連するのだが,裁断時にページが圧着されるというか,圧力が加わるので,一度パラパラとページをばらすようにした方がよい。静電気で圧着のようになる可能性もあり。そうすると,スキャナーで紙を引き込む時に,くっついたページまで引きずられることとなる。
  • スキャナーの設定について。デフォルトはあまりにざっくりな感じなので,自分の用途を考えて,幾つか設定すべし。とりあえず,PDFかJPEGか,カラーグレー自動か手動でモノクロか,両面か片面か,JPEGの圧縮度をどうするか,このあたりを考えて,複数設定しておくこと。あとでImageMagickなどで補正することを前提とすれば,自動にせずにカラーで読み込んでおくのが良いかも。

ドキュメントスキャナーと裁断機を購入

ついにスキャナーと裁断機を購入した。

ScanSnap IX500 と 裁断機 Durodex 200DX

スキャナーは定番のScanSnap IX500という機種。TWAINに対応していないとか,気に入らないところもあるのだが,総合的にはまあこれだろうな,ということで。裁断機は縦置きで保管できて場所を取らない(比較の問題ですが)ということで,Durodexの200DXにした。

来週になったら少し暇になるから,ホントの自炊(今までは業者に依頼していたので)を始めてみようかな。

Hardy全集をお出かけ自炊してきた

自転車圏内に裁断機・スキャナ完備のレンタル自炊スペースが開店していることを知ったので、先日試しに行ってみた。開放的でゆったりとしていて、お店の人も親切かつ知識豊富。料金はちょっと高めだが、業務用の高性能スキャナで取り込めることなどを考慮すれば、個人的には許容範囲。書籍以外でも、つまりコピー用紙や資料のシートなどでも取り込んで良いという話だったので、大昔にコピーしておいたハーディー全集(第1巻)を自転車に積んで再訪した。

デフォルトは品質80%のjpegなのだが、自分で設定を変えて良いので、可逆圧縮のPNGで取り込んでみた。解像度は300dpi。さすがに600dpiで取り込む勇気はなかった 😉 もっとも、600dpiでモノクロ2値での取り込みなら、ファイルサイズも大したことはないので、こちらは検討の余地あったかも。

JPEGに比べるとPNGの方がサイズ大きいので、若干スピードが遅くなったが、この程度であれば全然問題ない。取り込んだ画像をPCで確認する。

Hardy全集1のプレビュー中

ものの数分で取り込み作業は終了する。むしろ確認に時間が掛かる。まあ、サムネイルでチェックしても大丈夫そうだが。このあとPDFに変換することも出来るようだが、それは自宅でも出来るから、PNG画像のまま、持参したUSBメモリーにコピーして終了。

最初のページは、こんな感じ。読むだけであれば、このままで十分かな。

ハーディー全集第1巻

電子書籍の自炊関係では、著作権がらみで、もろもろあるようだが、裁断機や業務用スキャナをレンタルで使えるお店は個人的には非常に助かるので、長続きして欲しいなあと思う。

ImageMagickとXnConvertを併用してみる

[備忘録] 自炊PDFの後処理関係のメモ。

XnConvertのバージョンが1.51に上がり,従来のBrightness, Contrast以外にも,白黒のレベル指定が出来るようになった。これで,ImageMagickでの -level high, low, gamma と同じ(多分ね)パラメーターの指定が可能となった。速度的にはLanczosでの拡大処理を含めてXnConvertの方が速いので,こちらをメインにしようかと思う。

ただ,XnConvertでは,モノクロ2値への変換で threshold値を選ぶことが出来ない。また,ImageMagickの shave (上下左右を切り取る),border (逆に上下左右を塗る) などの処理が出来ないみたいだ。shaveに関しては,cropとrotateを組み合わせれば良いようにも思うが,よく分からない。一番の問題点は,thresholdの値(閾値)を選べないということなので,この部分はImageMagickを使う方が良いだろう。

ということで,試しに一冊処理してみた。hoge.pdfをpdfimagesを使って,hoge_000.jpgからhoge_124.jpgにバラす処理は済んでいるものとする。そこの階層に行って,次のようにする。

nconvert -extract 0 -ratio -rtype lanczos -resize 200% 200%  -levels 60 255 -gamma 0.7  -posterize 64 -posterize 32 -posterize 16 -posterize 8 -posterize 4 -out png  -o nc_% -overwrite  *.jpg

コマンドの意味は次の通り。-extract 0 で赤チャンネル抽出。-ratio 以下は,lanczosアルゴリズムによる200%拡大。-levels 60 255 と -gamma 0.7 は ImageMagickでの level 60,255,0.7 と同じ。今回の本は,スキャンの具合が良くなくて,全体的に文字が薄くてボケた感じなので,白飛びさせると文字が消えてしまいそうだったので,high=255とマックスのままにした。

-posterize は減色(ポスタリゼーション)処理。64色から順に半分ずつにして,4色まで減色している。-out png は出力ファイル形式をPNGにするということ。-o nc_% は出力ファイルの名前の設定。これだと,元ファイルがhoge002.jpgの場合,nc_hoge002.png となる。-overwrite は出力ファイルと同じ名前があった場合に上書きするということ。nconvert による処理は以上で終了。

次は,ImageMagickを使う。mogrifyコマンドを使って,上下左右を削除して白で元にもどす。それから,閾値を80%にして,モノクロ2値化する。出力ファイルはtiffにして,FAX Group4で圧縮する。

mogrify -shave 40x40 -border 40x40 -bordercolor "#FFFFFF" -threshold 80% -format tiff -compress Group4 nc_*.png

続いて,tiffをpdfに変換。

mogrify -format pdf nc_*.tiff

最後に,pdfファイルをまとめて,hoge-mono.pdf にする。

pdftk nc_*.pdf cat output hoge-mono.pdf

こんな手順で,モノクロ2値化が完了。一冊毎にパラメーター変えるのなら,この程度の入力を毎回行なっても,それほど面倒ではない。パラメーター固定で複数の書籍を変換するのなら,やはりバッチ処理用のスクリプトを書いた方が良いだろうなあ,やはり。

ImageMagickのmogrifyコマンドを使う

[備忘録] 以前 The Internet Archive からダウンロードしておいた E. Cahen の Theorie des nombre, tome 2 (整数論,第2巻)。サイズも小さくで良いのだが,何故かMacのプレビュー.appで見ると,ものすごく動作が遅くてスクロールもままならないという状況だった。それで,放っておいたのだった。そのときは対処法など分からなかったのだが,業者に依頼した自炊(?)PDFが時々同じようにスクロールが重たいという経験を経て,どうすれば良いかが自分なりに少し分かってきたので,それを試してみることにした。

処理対象は,thoriedesnombr02caheuoft_bw.pdf というファイル。サイズは27.2MBほど。このままでも良いが,これを cahen2.pdf として保存。Acrobatで開き,jpegにバラして保存。cahen2_Page_001.jpg から cahen2_Page_762.jpg までの762個のjpegファイルが出来る。これらはモノクロの画像なのだが,サイズは500KBないし900KBもあり,かなり大きい。762個で520MBくらいになっている。グレースケールなのかもだが,拡大した様子では,文字部分は2値のようにも感じる。ともかく,これが27MBに圧縮されていたのだから,すごい圧縮率ではある。

さて,これを ImageMagick で白黒2値のtiffに変換して,CCITT Group4の圧縮をかけることにする。ついでに,広すぎる余白を少し削ってみた。iPhoneで見るときは余白ないほうが見やすいから。

ImageMagickのconvertでは多数のファイルを処理させると,ウソみたいに大量のメモリーを消費してしまうので,今回は mogrify というコマンドを使ってみた。convertとほとんど同じ処理が出来る。

mogrify -shave 100x200 -threshold 80% -compress Group4 -format tiff cahen*.jpg
mogrify -format pdf cahen*.tiff
pdftk cahen*.pdf cat output cahen2mono.pdf

作業内容は次の通り。mogrify コマンドで,まず, -shave 100×200 として,左右100ピクセル,上下200ピクセルずつを削除。次に,-threshold 80% で2値化。さらに, -compress Group4 でFAX G4での圧縮,最後に -format tiff でファイル・フォーマットをTIFFにする。これらを cahen*.jpg すべてに適用する。次に,生成されたtiffファイルをpdfに変換し,pdftkによって,これらのpdfを結合して,cahen2mono.pdf にする。最終的なファイルサイズは,25MBくらいになり,Macのプレビューでも,iPhone4Sの i文庫S でも,スムーズにスクロールして,すこぶる快適になった。

最初のページは次のような感じ。

Cahen "Theorie des Nombres" tome 2

iPhone 4Sでのスクリーンショットは大体こんな感じ。

Cahen "Theorie des nombres" on iPhone4S

iPhoneではさすがに文字が小さく,老眼にはつらいのだが,メガネ外すと,それでも何とか読める。何よりも,750ページもあるのに25MBに収まり,動作も軽くなったので,大満足である。

スキャンした書籍の後処理など

自炊した(業者さんに依頼しているから厳密には違うかもだが)書籍のPDFの後処理についてのメモ。

数学関係の本は,ほとんどが白黒なので,最終的にはモノクロ2値にすることにした。PDFをページ毎の画像にばらして,処理したあと,最終的にFAX Group4圧縮でモノクロ2値のTiffにする。こうすると,1頁あたり50KBないしは100KB程度に収まる。

PDFをベージ毎の画像にばらすには,Acrobatあるいは,Xpdf付属のpdfimagesを使う。ただし,pdfimagesはjpeg指定なのにppmを吐き出すことがあって,信頼性にやや欠ける。でも,シェルから呼び出せるので,バッチ処理には便利。

画像の変換には,最初GIMPを使っていた。GIMPをシェルから使うために,Script-Fuというスキーム(Lispの方言)によるスクリプトをいくつか書いた。それはそれで良かったのだが,スピードがいまいち遅いので,ImageMagickに鞍替えした。ImageMagickはびっくりするくらい多機能(たとえば,傾き補正を自動でやってくれる)で,自炊本の後処理くらいなら,これで十分かなと思う。

具体的にはImageMagickのconvertというコマンドを用いて,赤チャンネル抽出(-channel Red -separate), 2倍拡大(-filter Lanczos -resize 200%), レベル補正(たとえば -level 20%,90%,0.6 とか), 傾き補正(-deskew 40%), モノクロ2値(たとえば -threshold 70% とか), 圧縮(-compress Group 4), TIFFで保存(出力先を hoge.tif などと), といった処理を行う。

これをすべてのページに施すのだが,Perlを使って一括処理することを試みた。実のところ,Perlの勉強も兼ねているという泥縄。まあしかし,入門書は本棚にあるし,ネットで適当に調べながら,Getopt::Long という便利なモジュールを利用して,なんとか動作するものが書けた。

しばらく実験していると,プログラムの設計に柔軟性がないことに気付く。もう少し汎用的なツールになっていると良いのにと思う。あるいは,Cコンパイラーのmakeみたいな構造にしても良いなあ,とも思う。このあたりは,思案中。

ともあれ,現時点では次のような感じで,一括変換を行なっている。

% pdf2mono hoge.pdf -level 40 240 0.7 -threshold 180

GIMPを使って自炊PDFを加工してみた

XNView付属(?)のnconvertでのバッチ処理の手順は大体わかったのだが、より細かい加工をしようとすると、やや物足りない感じもする。そこで、GIMPを試してみた。PhotoShopのGNU版である。使ったのは、Mac用にアプリ化した Gimp.app のバージョン2.6.11 である。Lionでも問題なく起動した。

いろいろ試した結果、nconvertの処理でも大差ないことがわかった 😉 。ならば、わざわざGIMP使う必要もないのだが、せっかく試したので、とりあえずメモ。

まずは、PDFからバラした画像(TIFF形式)を2倍に拡大する。コントラストと明るさを変更する。オートでの修正というのがあり、これでも悪くない。こうすると、文字がくっきりし、文字のまわりのモヤモヤしたノイズっぽいのも目立たなくなる。これであきたらないときは、レベルの修正を手動で、さらに物足りない場合は、トーンカーブを使うとよい。トーンカーブをあれこれいじって実験すると、これはこれで面白いのだが、写真ならともかく、スキャンした書籍の場合、ここで凝っても大差ないように思う。

次は減色(ポスタリゼーション)あるいは、グレースケール化、あるいはモノクロ2値化。ここは本によって変えると良いが、数学の本の場合は、モノクロ2値で良いだろう。threshold(しきい値)を変えると微妙に結果が変わるが、大体200前後で問題ないと思う。オートもある。

このままPDFにしても良いし、半分のサイズに戻しても良い。解像度を半分にして元のサイズに戻してみたが、普通に見る分にはさほど劣化を感じなかった。最初に2倍に拡大して処理したのが効いていると思う。

ということで、GIMPもなかなかに使えるのである。あとは、バッチ処理のために、script-fuというの書けるようにならないと。なんとscript-fuの使用言語はLispの方言であるSchemeですよ。スキームでプログラム書いたことなどないのだが、この位なら、お手本参考になんとかなると思う。

しかしなあ、いまさらcarとかcdrとかやるとは思わなかったな(笑)。Lisp 1.5 以来ですよ。

自炊PDFの加工メモ

Hardy-WrightのAn Introduction to The Theory of NumbersのPDF化が完了し,bookscanのサイトからダウンロードした。450ページで150MBほど。これをモノクロ化した。Macで利用できるツール探しから始めたので,けっこう時間かかった。以下,その手順。本のファイル名は hr.pdfとする。

  1. AcrobatでPDFを開き,ページ毎にTIFF形式の画像ファイルにして保存。hr_Page_001.tiffからhr_Page_450.tiffまでの450個のファイルが出来る。
  2. XNViewMP.app, XNConv.app の配布サイトから nconvert というUNIX プログラムをダウンロードしておく。パスの通っている適当な場所(/usr/local/bin など)に移動。
  3. XNViewMP.appで画像を開き,ガンマ補正などのパラメーターを決める。今回は,コントラスト20,ガンマ0.40に決めた。
  4. ターミナルを開き,画像ファイルのある階層に行く。nconvertを使って,すべてのページをモノクロにするのだが,まずは200%に拡大し,それから画像補正(コントラスト,ガンマなど),しかるのちに,階調を64(6 bit)から順に半分ずつにして2bitまで下げ,最後に白黒2値(1bit)に落とす。具体的には,次のようにする。
    nconvert -ratio -rtype lanczos -resize 200% 200% -contrast 20 -gamma 0.4 -dither -grey 64 -dither -grey 32 -dither -grey 16 -dither -grey 8 -dither -grey 4 -binary nodither *.tiff
  5. 変換された画像を結合する。Acrobatを開いて,hr_Page_001.tif からhr_Page_450.tif までを1つのPDFにまとめ,適当なファイル名で保存。ここでは hr_mono.pdf とする。なお,TIFFの読み込みについては,デフォルトではJBIG2のロスレスでの圧縮になっていたが,これだと表示に時間かかるみたいなので,CCITTでの圧縮に変更した。もっとも,あとでPDF/Xにするなら,ここは気にしなくても良いかも。
  6. このままでも良いが,OCR処理する。画像は元のまま(exact)としたが,300dpiでダウンサンプリングしても良いかも。hr_mono_ocr.pdf として保存。
  7. OCRかけると,なぜかMacのPreviewで読むとき,スクロールが非常に重たい。そこで,PDF/Xに変換する。デフォルトのX1aのタイプにしたが,違いはよく分からない。hr_mono_ocr_x1a.pdf として保存。

以上で完了。最後のPDF/X化をすることで,スクロールが非常にスムーズになり,快適。ファイルサイズも30MBくらいだし,文字もくっきりと黒くなって,とても読みやすくなった。

Hardy-Wright Page 238