Saturday, April 3, 2010 / InDesign, Groovy

GroovyからInDesignを叩く(Windows編) 〜 Groovy から InDesign CS3 のJavaScriptを実行する方法

ExtendScript Toolkit を使わないで、 直接InDesignのCOMを経由してExtendScript(JavaScript,VBScript)を実行する方法。

自動組版の一連の流れの中でInDesignをスクリプト経由で使う場合に いままでそこだけ手動で、InDesign起動してスクリプト実行、という手作業が入らざる得なかったわけですが、 make 一発ですべての処理を一括で行うことができそうです。

Mac OS X の場合は InDesign CS5 のExtendScriptをターミナルから実行する(Mac OS X) をご覧ください。

事前準備

が必要です。あらかじめインストールしておきます。

2017-10-04 追記

Scriptom はこのブログを書いた時点のものはもう存在しないようです。 こちらに Scriptom がありますが、 これがこの記事に書かれたとおり作動するかは未検証です。ご了承ください。

helloind.groovy

import org.codehaus.groovy.scriptom.*

Scriptom.inApartment
{
	def myJS = 'alert("Hello");'
	int lang = 1246973031

	//def indapp = new ActiveXObject('InDesign.Application')
	//def indapp = new ActiveXObject('InDesign.Application.CS4_J')
	def indapp = new ActiveXObject('InDesign.Application.CS3_J')
	indapp.doScript(myJS, lang )
}

new ActiveXObject() の引数で、 Indesign CS3, CS4 を明示的に区別 してオブジェクトを作成することができる。

※)lang の値は何?

Adobe InDesign CS3 Server Scripting Guide 内に記述があった、JavaScript言語を表す数値です。
Indesign CS3 ではこの値でうまく作動していますが、 CS4 などでは違う値になっているかもしれないので注意が必要です。

実行

$ groovy helloind 

InDesignCS3 が起動して Hello と表示されます。

実践編

helloind.groovy の中で毎回書き直す部分は、 myJS 変数に入れるExtendScript(JavaScript)部分だけ。 この部分を外部ファイルから読むようにしたのが ind.groovy です。

ind.groovy

import org.codehaus.groovy.scriptom.*

//
// 引数として渡されたJSファイルのチェック
//
boolean ng=false
if( args.size()<1 ){ ng=true }
else if( new File(args[0]).exists()==false ){ ng=true }

if(ng){
	System.exit(0)
}

//
// ExtendScriptの実行
//
Scriptom.inApartment
{
	def myJS = new File(args[0]).text
	int lang = 1246973031 // javascript 

	//def indapp = new ActiveXObject('InDesign.Application')
	//def indapp = new ActiveXObject('InDesign.Application.CS4_J')
	def indapp = new ActiveXObject('InDesign.Application.CS3_J')
	indapp.doScript(myJS, lang )
}

my.jsx

ind.groovy で実行するExtendScriptです。

var f   = File("/c/home/test.txt");
var flg = f.open("r");
if( flg == true ){
	var text = f.read();
	alert( text );
}

c:\home\test.txt にあるファイルを読み出して alert するコード. パスは /c/home/test.txt のように書けばよい。
/ から始めない場合は、 マイドキュメント に該当するパスが暗黙に設定されるようです。

groovy で実行します。

$ groovy ind my.jsx

補足 VBScript編

同じことをVBScriptでやるには...

単にInDesignのExtendScriptを走らせるだけならば、この方がよいと思います。 そもそも GroovyやScriptom のインストールも不要ですし。

helloind.vbs

myJS = "alert('Hello');"
lang = 1246973031

Set myInDesign = CreateObject("InDesign.Application.CS3_J")
myInDesign.DoScript myJS,lang

コマンドプロンプトから実行します。

$ cscript helloind.vbs

GUIから実行するには Windowsエクスプローラで helloind.vbs をダブルクリックすればOK.