しろもじメモランダム

文字についてあれこれと。

米O'Reillyで買ったPDF本をkobo gloでも読めるように加工する

米 O'Reilly のアカウントを作って手持ちの紙本(同社から出ている英語版に限る)を登録すると、その電子書籍版が$4.99/冊で買えるらしい。自宅には CJKV Information Processing(第2版)と Fonts & Encodings があり、どちらもいろいろと役に立っているが、さすがにこれを持ち運ぼうと思うとつらい。

というわけで電子書籍版をさっそく買ってしまった。タイトルによっては eBub や mobi フォーマットも選択できるようだが、この2冊はPDF版のみ。残念ながら errata は反映されていない様子。

余白の除去

このPDFは版面の上下左右に余白が大きく取られているため、これをそのまま電子書籍端末で読もうとしても読みづらい。ググってみたところ、PDF内部の CropBox の値を書き換えて余白を除去する方法があった。

このページのスクリプトにすこし手を加え、次のようにしてみた。

#!/usr/bin/perl
# crop_pdf.pl - PDFの余白を除去

use utf8;
use strict;
use warnings;

# 余白除去を行わずにスキップするページ数
my $skip_page = 2;  # 先頭の2ページ(表紙と裏表紙)

die "Usage: $0 file top right bottom left\n" unless @ARGV == 5;
my $filename_in = $ARGV[0];

# CropBox に合わせて格納(left, bottom, right, top)
my @offset = ($ARGV[4], $ARGV[3], -$ARGV[2], -$ARGV[1]);

open my $in, '<', $filename_in or die;
(my $filename_out = $filename_in) =~ s/(.*)(\.pdf)$/$1-cropped$2/;
open my $out, '>', $filename_out or die;

binmode $in;
binmode $out;

my $page = 0;
while (<$in>) {
    s/(\/CropBox\s*\[\s*([^\[]+)\])/crop($1, $2)/eg;
    print $out $_;
}

sub crop {
    $page++;
    return $_[0] if $page <= $skip_page;

    my @offset = @offset;
    my @pos = map{int $_ + shift @offset} split /\s+/, $_[1];

    my $crop = sprintf '/CropBox[%d %d %d %d]', @pos;

    my $blank = length($_[0]) - length $crop;
    warn $_[0] and return $_[0] if $blank < 0;

    return $crop.(' ' x $blank);
}

これを

$ perl crop_pdf.pl Fonts_and_Encodings.pdf 70 110 140 95

などとして実行すれば、余白が除去されたPDFファイル Fonts_and_Encodings-cropped.pdf が生成される。なお、余白除去量の指定順序は、自分でわかりやすいように上から時計回り(CSSと同じ)とした。kobo glo での閲覧を考えると、なるべく大きく表示させるために上下の余白をギリギリまで切り詰めたい。何度か試してみた結果、とりあえず以下のパラメータに落ち着いた。

  • CJKV Information Processing: 40 50 30 50
  • Fonts & Encodings: 70 110 140 95*1

書名・著者名の追加

このPDFのメタデータには書名や著者名が入っていないため、kobo では「untitled」「著者不明」などと表示されてしまう。今回は pdftk でこれを編集してみた。

$ pdftk orig.pdf dump_data_utf8 > metadata.txt

とすると、orig.pdf の書名・著者名・しおりなどのメタデータが metadata.txt に書き出される。これを編集し、例えば

InfoKey: Title
InfoValue: CJKV Information Processing, 2nd Edition
InfoKey: Author
InfoValue: Ken Lunde
(以下略)

のように書き換える(該当部分がなければ追加する)。あとは

$ pdftk orig.pdf update_info_utf8 metadata.txt output new.pdf

とすれば、メタデータだけが書き換わったPDFファイル new.pdf が生成される。

まとめ

以上の余白除去と書名・著者名の追加あたりをやっておけば、一応はまずまず使えるようになる。もっとも、kobo のPDF対応は、検索ができない・しおりの階層が無視される・操作性が悪いなど、不満な点も多々あるのが現状。

というわけで、みなさんもぜひ CJKV Information Processing と Fonts & Encodings のPDFを買って携帯しましょう!

*1:一部のページで下が切れてしまうが、これで妥協。