わいえむねっと

Contents
Categories
Calendar
2011/03
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.055 sec
Chashed: -
2011/03/30 Wed
オライリーのebookから余白を除去して、Kindleで快適に読む方法 - ただのにっき(2011-03-28)
http://sho.tdiary​.net/20110328.h​tml#p01
電子書籍端末向けにPDFを加工するには、テキストデータを抽出する方法や、PDFをそのまま加工(crop)する方法があるが、オライリーのPDFはDRMがかかっているのでいずれもうまくいかないようだ。

歯を磨きながら Ebook のバイナリをぼけと眺めてみたのですが、CropBox の書き換えは特に問題なさそうな気がしたので試してみました。


スクリプト


例によって Perl で。

use strict;
use warnings;

# left, bottom, right, top
my @offset = (20, 20, -20, -20);

while(<*.pdf>)
{
    next if /-cropped/;

    open my $in, $_ or die;
    s/(.*)(\.pdf)$/$1-cropped$2/;
    open my $out, '>', $_ or die;

    binmode $in;
    binmode $out;

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

sub crop
{
    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);
}


実行結果

CropBox 変更前



CropBox 変更後



やったね!

# 写真のはかなりカツカツに設定してます。(60, 43, -60, -74)


味噌

/CropBox [ 0 0 516 659.52 ]



/CropBox [ 20 20 496 639.52 ]

のように加工するとオフセットが破綻してファイルが壊れるため、小数点以下を捨てたりスペースを除去して桁を増やすための領域を無理やり確保しています。
まぁ、簡易処置ということで。

当然、領域が確保できない場合も想定されるわけですが、その場合は警告を出力して、その位置の CropBox は無視します。
今回自分が購入した(うちのURLが届いた分)5冊については、警告なしで通ったのでとりあえず良し。
ThoughtWorksアンソロジーのサンプル3種についても試してみましたが、警告なしで通りました。


O'Reilly Japan - ThoughtWorksアンソロジー
http://www.oreill​y.co.jp/books/9784873113​890/


寝よう。