DTP 駆け込み寺で「PDFの/MediaBoxを/ArtBoxに合わせたい」みたいなのを見かけたので、作ってみました。
Windows でテストしましたが、パスの通っているところに、pdftk をおいておけば Linux でもちゃんと動くはず。Mac OS はシラネ。
あと、単ページ PDF 限定のつもり。はたしてこれで用事が足りるのかしら。
pdftk については、再三書いているとおり、PDF HACKS で説明されています。pdftk で具具って見て、わけわかんねー場合に PDF HACKS を買うというのがいいのではないかと。って、1週間前も書きました。
(ここだけの話、PDF HACKS 微妙に売れています。)
#!/usr/bin/perl -w
use strict;
use File::Basename;
use File::Temp qw/ tempfile tempdir /;
# 正規表現パターン設定
my $Regex = <<'REGEX';
/ArtBox \[(.+?) (.+?) (.+?) (.+?)\]
REGEX
;
# コマンドライン引数分繰り返し
foreach my $argv (@ARGV) {
my ($mediabox, $trimbox, $bleedbox, $pdf, $dd, $a);
(my $base, my $dir) = fileparse($argv, '\.[^\.]+$');
my $filename = $base . ".pdf";
my $newfilename = '#' . $filename;
my $newpath = $dir . $newfilename;
# pdftk を使って、伸長処理してパイプで取り込み
if ($argv =~ m/.+ .+/) { # パスに空白含む(D&D)
$dd = 1;
open(IN, "pdftk $filename output - uncompress |")
|| die "can't open $filename \n";
}
else { # パスに空白含む(D&D じゃない)
$dd = 0;
open(IN, "pdftk $argv output - uncompress |")
|| die "can't open $argv \n";
}
binmode(IN);
while() { # $pdf に 伸長した PDF の中身が入ります
$pdf .= $_;
}
close (IN);
# perl で検索処理しやすいよう $PDF をコピーして改行コード変更
# my $pdf_serach = $pdf;
# (my $pdf_serach = $pdf) =~ tr/\r/\n/d;
# パターンで検索ループ
# 本来は、PDFリファレンス第2版 pp.68 のように、
# ページツリーをたどって、その部分の ページオブジェクト
# の Contents の参照先のみを検索すればいいのだけれども、
# Perl で有効な PDF のパーサが分からないのでとりあえずこのママ。
# あっても使えないし。
while ($pdf =~ m/$Regex/gmo ) {
$mediabox = "/MediaBox [$1 $2 $3 $4]";
last;
}
# 検索ループ終わり
# 検索ループで見つかった場合、box 類を書き換える
# 本来は、PDFリファレンス第2版 pp.68 のように、
# ページツリーをたどって、その部分の ページオブジェクト
# の box 類を置換すればいいのだが、Perl で有効な
# パーサが分からないのでとりあえずこのママ。
if ($mediabox) {
$pdf =~ s#/MediaBox \[.+\]#$mediabox#;
}
# テンポラリファイルに置換結果書き込み
# (pdftk がパイプで入力受け付けてくれないから)
(my $fh, my $tempfilename) = tempfile();
binmode($fh);
print $fh $pdf;
# pdftk で正規化
if ($dd) { # D&D
system("pdftk $tempfilename output $newfilename");
}
else { # D&D じゃない
system("pdftk $tempfilename output $newpath");
}
}
トンボを検出するものよりは確実に動くみたいですが、無保証。しかも、仕組み的に時間がかかりすぎるのでお勧めできません。誰か手を入れてください。誰か助けて!
ARGV から展開するところは、MM 岩手さんの AddTrimBox [dtpwiki.jp] を参考にしました。
~~~
Trueflow だから、隠しオプションで /ArtBox に合わせるとかありそげ。ていうか、Trueflow で手でいじった PDF って使っちゃダメっていわれそげ。