My Daily Programming Life...

Illustratorで連番印刷

母親が今度コンサートを開くことになり、そのチケット作成を頼まれた。B5サイズの紙を5等分にして、それが1枚のチケットのサイズになるようにする。IllustratorでB5サイズの紙に5枚分のチケットを印刷するようにして、後でカッターで切る。

問 題は各チケットにナンバーを振る作業。通し番号を振らなくてはいけない。Illustratorそのものに連番印刷の機能は、ない。検索するとナンバリン グ用のプラグインがいくつか売られてた。でもたったこれだけのことに2,3万するプラグインなんて買う気にならないし・・・。

というわけ でいろいろ調べていたら、IllustratorやPhotoshopはJavaScriptでいろいろ操作できることがわかった。 Document Object Modelを操作することでいろいろ自動的にできる。面白そうだしやってみようと思って書いてみた。
チケットがすでに描かれているイラストレータドキュメントがあって、その中のナンバリングの部分(5ヶ所)に名前を付ける。名前はレイヤーウィンドウから 階層をたどっていって、ナンバリング用のテキストオブジェクトをダブルクリックすれば付けられる。名前はNo.1~No.5と付けた。この状態で次のスク リプトを動かす。

docObj = activeDocument;
var minNum=prompt("チケットナンバーの開始値");
var maxNum = prompt("チケットナンバーの終了値");
var ticketsPerPage = 5; //一ページ当たりのチケット枚数
var printPageNum = Math.ceil( (maxNum - (minNum-1))/5 ); // 何ページ印刷するか
var maxDegit = 3; //最大桁数。これに基づいて、テキスト整形
var prefix = "No. "; //連番のプリフィックス
var suffix = " "; //連番のサフィックス

for(var i = 0 ; i < printPageNum ; i++){ //必要なページ数ループ
for(var h = 0 ; h < ticketsPerPage ; h++){ //各ページにはticketPerPageだけナンバーを設定
var obj_name = "No."+(h+1); //テキストオブジェクトの名前(事前にaiファイルで編集・設定)
var numberItem = docObj.pageItems.getByName(obj_name);//テキストオブジェクトの取得
numberItem.contents= getNumberText(i*ticketsPerPage + Number(minNum)+ Number(h)); //ナンバーを設定
}

//プリント
docObj.print();
}

//数値を受け取って、ナンバリング用文字列を返す
function getNumberText(num){
var len = num.length;
var numText = prefix;
for( var i = 0 ; i < maxDegit - len ; i++){
numText += " ";
}
numText += num;
return numText + suffix.toString();
}

最初にナンバリングの最小値と最大値を受け取って、それを1ページ当たりのチケット枚数(今回は5)で割って、何ページ印刷すればよいか判別して、各ページに着き順番に、No.1~No.5のオブジェクトを取得してそのcontentsをナンバーで書き換えて印刷する。
こいつを動かすだけでナンバリングはばっちりできた。

うーん、さすがIllustrator。なかなかすばらしい。

こういったスクリプトは多くのドキュメントや画像を処理する際にもかなり役立ちそう。Webページ作成では結構本物画像から解像度を小さくしたサムネイルを作成する作業は多いから、そういうのもすぐに自動化できそう。

それにしてもJavaScriptもっとちゃんと勉強しないと・・・。いまいちよくわかってないな。

1 コメント:

Anonymous said...

テキストオブジェクトの取得でエラーが出るんですがどうしたらよいでしょうか?
CS2だと無理なのかな…

Post a Comment

feedSubscribe to my feed