歯を磨きながら 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種についても試してみましたが、警告なしで通りました。
寝よう。