InDesignを制御するには、Javascript一番よく使われているかと思います。但し、そのJavascriptの基準が1999年のもので、スマート的な言語ではない。InDesign/Illustrator/Photoshopなどを制御する時、それを意識してコードを書く必要がある。この記事では、高速化するかどうかの処理時間差を測ってみる。

InDesignデータ用意:新規documentを作成、1頁目に1000個のtextFrameを追加。

//ページに50*20=1000個のtextFrameを作成
var doc = app.documents.add();
var page = doc.pages[0];
var tf;
var y1, x1;
for (var i = 0; i < 50; i++) {
    for (var j = 0; j < 20; j++) {
        tf = page.textFrames.add();
        tf.contents = i + ":" + j;
        y1 = i * 5;
        x1 = j * 10
        tf.geometricBounds = [y1, x1, y1 + 5, x1 + 10];
    }
}

1、再描画を無効に(スクリプトパネルで設定)

//古典的な書き方: Bad (--> page.textFrames, page.textFrames.length)
var page = app.activeDocument.pages[0];
var start = new Date();
for (var i = 0; i < page.textFrames.length; i++) {
    page.textFrames[i].contents = "Bad";
}
alert((new Date() - start) / 1000);

結果:48.107秒(再描画有効)-->44.152秒(再描画無効) 

※今回の例はあまり効果が見えないが、複雑な描画を行う場合は、処理時間もっと減る。

2、属性を複数回使い回す時、一旦変数に格納-->特にloopの中

//変数使う場合: Good
var page = app.activeDocument.pages[0];
var start = new Date();
var tfs = page.textFrames;//変数に
var len = tfs.length;//変数に
for (var i = 0; i < len; i++) {
    tfs[i].contents = "Good";
}
alert((new Date() - start) / 1000);
3、「取り消す」機能を無効に
//「取り消す」機能を無効に: UndoModes.fastEntireScript
app.doScript(main, ScriptLanguage.javascript, [], UndoModes.fastEntireScript);
function main() {
    var page = app.activeDocument.pages[0];
    var start = new Date();
    var tfs = page.textFrames;
    var len = tfs.length;
    for (var i = 0; i < len; i++) {
        tfs[i].contents = "Good";
    }
    alert((new Date() - start) / 1000);
} 

処理時間


再描画有効 再描画無効

古典loop 古典loop 変数 変数+取り消し機能を無効に
1回目 9.349 7.882 6.685 6.131
2回目 9.478 9.086 6.506 6.048
3回目 10.219 9.036 6.738 6.104
4回目 9.565 9.107 6.515 6.023
5回目 9.496 9.041 6.694 6.19
合計(秒) 48.107 44.152 33.138 30.496
100% 92% 69% 63%

以上、変数を活用し、また、取り消し機能をOFFにしたら、処理スピードが倍に上がる可能性が十分ある。

因みに、InDesignには、objects[list].everyItem()という謎なメソッド が存在している。これを上手利用したら、特定な処理においては、爆速!(次(次)回)