きっかけ

本を裁断してpdfにする自炊というものをやり始めて1年以上が経ち,自炊したpdfも350冊・35GBを超えてしまった.手持ちのiPadには全部の書籍が入りきらなくなってしまい,終いには自炊した本のことを忘れて中古で買い直す始末.そんなこんなで,自炊した書籍のpdfをまとめる本棚みたいなものが欲しくなってきた.手の込んだものはいらないので,表紙をざっと眺めたり,タイトルと著者を検索できる程度のもので簡単に済ませたい.

というわけで,Sphinxで静的htmlを吐き出してDropboxのPublicフォルダで公開するようなシステムを簡単に組んでみた.SphinxはPythonで書かれたドキュメンテーションツールで,rst形式のテキストから静的なhtmlを出力できるほか,jsで簡易な検索もできる.バックグラウンドでスクリプトを動かしたりデータベースを置いておく必要がないので,DropboxのPublicフォルダみたいな場所でも公開できる便利さがある.今回はそれをメインにして,付加情報として書籍ファイルのISBNを使ってAmazonのProduct Advertising APIを叩いてメタ情報を入手し,書籍カバーの画像と一緒に表示させるようなSphinxのrstファイルを作成するという目論見.今回やってみた限りだとDropbox+Sphinxは連携が案外簡単だったので,この他にも個人的なメモなどの用途にも最適だと思う.

なお,今回のウェブページはリンクを一般に公開しておらず,また書籍pdfはダウンロードできる状態にはしていない.書籍の電子化に関しては色々難しいところがあるのでスクリプトの公開などは控えるようにする.

できたページ

トップページには直近50件の書籍カバーの画像と,その下には書籍タイトル一覧を表示してある.タイトルで検索するだけならこのページでテキスト検索するだけで済む.

iPhoneとの連携も良好だ.ちなみに今回始めて知ったのだが,iOSのSafariでもテキスト検索ができるらしい.ウェブページを表示した状態で右上の検索ボックスに単語を入力し,出てくる候補の一番下にある”On This Page”の候補をクリックすると,Mac OS XのSafariと同様に検索できる.

作り方

基本的に書籍pdfに付けているタイトル「#{data}#{title}.pdf」をそのまま使用している.rstを作る部分はRubyで書いており,ファイル名を抜き出してそれぞれのrstファイルを自動生成している.

メインのindex.rstには,画像を並べる部分と

1
2
3
4
5
6
7
8
9
10
11
12
13
.. image:: _book_thumb/20120927自炊本1.jpg
   :target: _book_rst/20120927自炊本1.html
   :width: 100px

.. image:: _book_thumb/20120927自炊本2.jpg
   :target: _book_rst/20120927自炊本2.html
   :width: 100px

.. image:: _book_thumb/20120927自炊本3.jpg
   :target: _book_rst/20120927自炊本3.html
   :width: 100px

〜〜〜続く〜〜〜

と,toctreeの部分

1
2
3
4
5
6
7
8
9
10
11
.. toctree::
   :maxdepth: 2

   _book_rst/20120927自炊本1
   _book_rst/20120927自炊本2
   _book_rst/20120927自炊本3
   _book_rst/20120927自炊本4
   _book_rst/20120927自炊本5
   _book_rst/20120927自炊本6

〜〜〜続く〜〜〜

を上のように並べているだけ.

また,書籍カバーのサムネイル用の画像はMac OS Xのコマンドラインツールであるsipsを使って生成している.

1
$ sips -s format jpeg --resampleWidth 100 --out /path/to/out_dir /path/to/pdf_dir/*.pdf

とすると,/path/to/pdf_dir/にあるpdfファイルがすべて幅100pxのjpgファイルとなって/path/to/out_dirに保存される.今回始めてsipsを使ってみたのだが,フォーマット変換やリサイズに関してはImageMagickと同様の便利さでなかなか良かった.まあ今回は速度とかは特に気にしていないので手軽に出来ればそれで良い.

そして,最終的なSphinxのビルドはmake htmlで出力する先をDropboxのPublicフォルダに設定する.Makefileの中にあるBUILDDIRを

1
BUILDDIR = /Users/yag_ays/Dropbox/Public/path/to/dir/

とすると,静的な画像ファイルなども含めてPublicの指定ディレクトリ以下に展開される.

問題点

最低限の機能さえあれば十分といいつつも,1つだけ気になる点がある. それはSphinxの検索があまりよろしくないことだ.どうやら予めテキストをn-gramに分割したものからパターンマッチで検索しているらしく,クエリとして投げる単語によっては検索できたりできなかったりする.このあたりが改良できると,曖昧な記憶の中から本を探すときに便利になるのだが….

参考

Sphinxの検索まわりの日本語対応と強化.

Product Advertising APIはRubyのamazon-ecsを使った.

sipsの詳細

iPhoneのSafariでテキスト検索する方法