Adobe Illustrator CSのjavascriptでの制御
Illustratorを自動化したい、なんて相談があったので、ちょっといじってみた。
基本的には、VBAのオブジェクトをいじるときにような感覚で問題なかった。
問題なかったのだけど、たとえば
activeDocument.textFramesの要素数はcountで返ってくるのかとか、どんな要素を持っているのか、といった情報がなくてサッパリわからなかった。
もうひとつやりづらかったのは、操作したいテキストエリアというかオブジェクトを、どうやっていじったらよいのかがわからない。TextAreaなのかTextRangeなのか、オブジェクトの情報を得る手段があってもいいと思うのだけど。
jashみたいなツールがないので、スクリプトを書いては実行して、と言う試行錯誤をするしかなくて、簡単なスクリプトなのに難儀した。デバッガないのかな?
やったのは、現在のドキュメントのTextFrameのコンテンツを、CSVから読んで置き換える、というだけ。なんだかCSVから読んでパースするあたりが気持ち悪いやり方をしているのだけど、スマートなやり方がわからなかった。。
これはIllustratorの問題じゃなくて、私のjavascriptの理解不足が原因だけど。
スクリプトでやってること
CSVからデータを読んで、既存のテキストを置き換えてPDFで保存。
行数分繰り返す。
課題
- CSVの列数が固定になっちゃうのだけど、これはパースライブラリがどっかにありそう。
- TextFrame内のテキストのフォントサイズや、フォントを変えたい。
参考にしたサイト
Illustrator CS自動化作戦 with JavaScript
//CSVファイルのデータでイラレのテキストを置き換える。 parseCSVandReplace(); function parseCSVandReplace() { //改行の文字コード設定 CRCODE = String.fromCharCode(13); //CSVファイルを開く //CSVのファイル形式は、下記を想定。 //最後の行は、空白行を想定してる。 fileObj = new File("list.csv"); flag = fileObj.open ("r","",""); if (flag){ txt = fileObj.read(); } //CSVの行ごとにlineに入れる var line = txt.split('\n'); //行データを","で分割するための正規表現 var rgexp = /(.+?),(.+?),(.+?),(.+?),(.+?),(.+?)/ig; //CSV行ごとに、name.pdfというファイルに書き出し for(var ss = 0;ss<line.length-1;ss++){ var tmp = line[ss].match(rgexp); //$1,$2は列の番号に対応 var name = RegExp.$1; var startday = RegExp.$2; var endday = RegExp.$3; var num = RegExp.$4; var title = RegExp.$5; //テキストを置き換える。 activeDocument.textFrames[0].contents = ordernum; activeDocument.textFrames[1].contents = startday+" - "+endday; activeDocument.textFrames[3].contents = startday+" - "+endday; activeDocument.textFrames[4].contents = title +CRCODE; //PDF形式で保存する。 pdfOpt = new PDFSaveOptions(); pdfOpt.compatibility = PDFCompatibility.ACROBAT6; saveFile = new File(name+".pdf"); activeDocument.saveAs(saveFile, pdfOpt); } return ; }