2010年12月28日火曜日

Sony Reader 用に 自炊 PDF を調整する手順の防備録

自炊した PDF は、そのままでも Sony Reader で表示できますが、 文字がかすれたりして、かなり読みにくいものになります。 そこで、一手間かけて、Sony Reader 専用の PDF ファイルに変換することにしました。 以下は、その手順の防備録です。

PDF ファイルから画像を取り出す

自炊した PDF ファイルは画像のみで構成されていますので、その画像を取り出します。 この例では、page-連番.jpg という名前で取り出されます。

$ mkdir tmpdir
$ cd tmpdir
$ pdfimages -j fromdir/元文書.pdf page

表紙を編集

表紙を読み込む際際、可能であれば切断せず、長尺読み取り機能を利用して読み込んでいます。 自炊 PDF を作成する際に、ScanSnap 付属のソフトウェアで90度回転したりトリミングしたりして、 PDF ビュワーで表示させる分には問題ないように編集しています。 ところが pdfimages はこれを処理できないようで、編集前の画像をそのまま出力します。

これでは困るので、gimp で表紙などを編集します。 基本的に向きの変更とトリミングのみ。 この例は、カバーと帯の表裏を編集する場合です。

$ gimp page-00[0-3].jpg

画素数の変更と余白の切り落とし

ImageMagick の convert で処理します。 Sony Reader の画素数は 600 x 800 らしいのですが、画像を表示する場合は 584 x 754 にあわせると、 劣化が発生しないそうです。 余白部分を多少削ると、文字の表示に使用できる面積が増えます。 削りすぎに注意。

$ mkdir a
$ (for f in page-*.jpg; do convert -resize 654x824
    -type GrayScale -shave 35x35 -normalize $f a/$f; done)

表紙やイラストなど、余白がない頁は別枠で変換します。

$ (for f in page-00[0-3].jpg; do convert -resize 584x754
    -type GrayScale -normalize $f a/$f; done)

調整済み PDF ファイルの作成

ImageMagick の convert で処理します。

$ convert a/*.jpg a.pdf

ただ、convert は作成する PDF ファイルのタイトル属性に、 作成するファイル名を設定します。 Sony Reader は、ファイルの一覧で、この属性を表示するのですが、 日本語の名前だと文字化けします。 属性が設定されていなければファイル名が使用されるのですが、 ファイル名に日本語が使用されている場合は問題ありません。

私の使用している版の ImageMagick では、 この動作をしないようにするオプションが存在しませんので、 ソースコードを変更して対応しました。

--- coders/pdf.c.back Wed Apr 28 22:05:40 2010
+++ coders/pdf.c Tue Dec 28 15:33:26 2010
@@ -2459,9 +2459,11 @@
   (void) FormatMagickString(buffer,MaxTextExtent,"%lu 0 obj\n",object);
   (void) WriteBlobString(image,buffer);
   (void) WriteBlobString(image,"<<\n");
+#if 0
   (void) FormatMagickString(buffer,MaxTextExtent,"/Title (%s)\n",
     EscapeParenthesis(image->filename));
   (void) WriteBlobString(image,buffer);
+#endif
   seconds=time((time_t *) NULL);
 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
   (void) localtime_r(&seconds,&

これで、Sony Reader 上でそれなりに読める PDF の完成です。 画質の改善は、今後の課題ということで。

おまけ: Solaris 機から Sony Reader 用の SDHC カードに書き込む

Sony Reader 用に調整した PDF ファイルは、 /m/books0/00-Sony-Reader/ にまとめて置いています。 Sony Reader は直接接続せず、SDHC カードを介して、PDF を渡すようにしています。 ファイルを一つ一つコピーするのは面倒なので rsync コマンドで一発。 --modify-window=1 を忘れると、毎回書き込みが発生するので要注意。

$ rsync -a --modify-window=1 -v /m/books0/00-Sony-Reader/
       /media/NO\ NAME/books

2010年12月21日火曜日

AES って食べられますか?

久しぶりに、Xperia から OpenSolaris 機 (そろそろ OS を入れ替えないとね) にアクセスし、ファイルをダウンロードしようとしたところ、なぜか接続に失敗。以前は出来たので、何か変わったか。。。

解決策は、NEC のホーム WiMAX ルータ Aterm WM3400RN に、WEP ではなく、PA/WPA2-PSK(AES) で接続すること。さらにいえば、ネットワーク分離機能を使用しないこと。

有線 LAN と無線 LAN がネットワーク的に分離される設定なので、通信できなくなるのは当たり前です。 初期設定で、この機能は WEP で有効、AES で無効になっていました。暗号化の強度によって異なる設定なのは、納得できるところです。最初から AES を使っておけば良かったという話でした。

事務所のネットワークは、つい最近まで OKI 製の WiMAX ルータを使用していました。こちらも無線 LAN と有線 LAN の両方に対応した製品です。一年以上良い感じで使えていたのですが、数度、再起動が必要な状況に陥り、その後有線・無線 LAN 経由のアクセスに反応しなくなりました。仕方ないので、修理より安いということで WM3400RN を購入。導入があまりに楽だったので、設定をあまり考えなかったのが敗因でしょうか。