M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2005年6月15日 13:43

PDFの/MediaBoxを/ArtBoxに合わせるスクリプト

このエントリーをはてなブックマークに追加 mixiチェック

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 って使っちゃダメっていわれそげ。

投稿 大野 義貴 [Script] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/1148

コメントする