Adobe InDesign (Photoshop や Illustrator も含む一式) は JavaScript を使って自動化できる。ExtendedScript と呼ぶそうな。
(Mac 版だと AppleScript、Windows 版だと VBScript も使える。未確認)
要るもの
- Adobe InDesign
- Adobe ExtendedScript Toolkit …標準ではインストールされないので、要ダウンロード。(CS5〜CS1向けのはここ、CS6向けのはここ)
- 知識
- JavaScript (ECMA-262, Edition 3 相当) の知識
- DTP の知識 (InDesign)
資料
-
Adobe 公式ドキュメント一式 (一通りダウンロードしておくと良い)
- Adobe InDesign CS6 スクリプティングガイド:JavaScript
- Adobe InDesing CS6 スクリプティングチュートリアル
- 日本語版の翻訳の品質がアレだと思った人は、英語版をどうぞ
- InDesign CS6自動化作戦 with JavaScript (リファレンス的に使える)
- InDesign Object Model について
- Adobe InDesign CS6 (8.0) Object Model
プログラマから見るとたいへん拙い感じのするコードが多くて残念な感じがする。グローバル変数をいっぱい使ってたりとか……。
デバッガ
ExtendedScript Toolkit 上で動作させることでブレークポイントデバッグができる。ブレークポイントはコード上に
$.bp();
と書いて仕掛ける。
コンソールへの出力
$.write("hogehoge");
$.writeln("hogehoge");
高速化
「スクリプト」パネルのメニューから「再描画を有効にする」をオフにする。これで20%くらい早くなる。
「取り消す」機能を無効にしてさらに高速化できる (20%くらい)。
var main = function() {
// ここにプログラムを記述
}
app.doScript(main, ScriptLanguage.javascript, [], UndoModes.fastEntireScript);
JavaScript の処理系があまり賢くないので、古典的な最適化手法が意外に効くのでバカにできない。手元のコードで以下の最適化をしたら1割くらい早くなった。
// Before
for(var i = 0; i < doc.pages.length; i++) {
}
// After
var pages_total = doc.pages.length;
for(var i = 0; i < pages_total; i++) {
}
// 遅い (変数 'a' の探索のせい)
var a = 1;
var hoge = function() {
return a + 1;
}
hoge();
// 早い
var a = 1;
var hoge = function(a) {
return a + 1
}
hoge(a);
ExtendedScript Toolkit を使ってコンパイルするとさらに早くなるかもしれないが、デバッグが面倒になるので私は使ってない。