InDesignでevent Listenerを使ってみる

こんにちは、スクリプト担当Fです。

Adobe InDesignCS4のインストーラディスク付属のサンプルスクリプトに「BeforePrint.jsx」というJavaScriptがあります。このスクリプトは、InDesign上にてプリントする前に簡単なプリフライトチェックをします。
具体的には

  • ドキュメントの使用フォントがすべてインストール済みかどうか
  • リンク画像のステータスは正しいかどうか

を確認しダイアログで結果を表示してくれます。

フォントは問題なし、リンクが外れている場合

 

プリフライトチェックを通りませんでしたと警告が

 

問題なければプリントダイアログに進めます

使い方は「Scripts Panel」と同じ階層に「Startup Scripts」というフォルダを作成し、このスクリプトを入れておくだけです。これだけでInDesignがプリントイベントに応答しプリフライトチェックを実行できるようになります。このようにスクリプトがさまざまなイベントに応答してハンドラを実行する仕組みをeventListenerといいます。

● InDesignのeventListener

eventListenerはWebのJavaScriptでよく知られていたものでもともとはWorldwide Web Consortium(W3C)勧告の仕組みです。例えば、ホームページ上で文字の上にマウスカーソルが通る(mouseover)と色が変わるといった活用法があります。WebでもInDesignでもイベントに応答し処理を行うという考え方は同じです。
先ほどの「BeforePrint.jsx」では、InDesignでプリフライトする処理が「プリント直前」というイベントに応答していました。このイベントにはさまざまな種類があり、下記にInDesignCS4でのイベント一例をあげておきます。

beforeQuit アプリケーション終了 直前
afterQuit 直後
beforeNew 新規ドキュメント作成 直前
afterNew 直後
beforeOpen ドキュメントを開く 直前
afterOpen 直後
beforeClose ドキュメントを閉じる 直前
afterClose 直後
beforeSave ドキュメントを保存する 直前
afterSave 直後

 

● AppleScriptでevent listener

サンプルスクリプトにはJavaScriptだけではなく、AppleScriptのeventサンプルスクリプトも入っています。先ほどの「BeforePrint.jsx」のAppleScript版が「BeforePrint.applescript」です。しかし、単独では使用できず、「BeforePrintHandler.applescript」という別スクリプトとセットとなっています。しかも、構文が間違っているためそのままでは動かないという有様でガッカリです。
仕方がないので修正しました。

font statusをstatusに、graphicsをall graphicsになど

どういうわけなのかはわかりませんが、AppleScriptでevent listenerを使う場合は別スクリプトを呼び出す仕様となっています。「Startup Scripts」に「BeforePrint.applescript」を入れ、呼び出すハンドラのパスを「BeforePrintHandler.applescript」で指定します。InDesignを再起動し任意のドキュメントを開いてプリントを選択すると、プリフライトが実行されました!

フォントは問題なし、リンクが外れている場合

 

プリフライトチェックを通りませんでしたと警告が

● AppleScriptでは何かと不便…かと思いきや

JavaScriptでは単独ファイルで済むのにAppleScriptは別スクリプトにしなくてはいけないというのもいかがなものか。とはいえメリットもあります。ハンドラ呼び出しなので既存のスクリプトを流用することが可能です。
たとえば、下記のスクリプトは弊社の社内で活用している「imageFileName.scpt」というスクリプトです。

InDesignドキュメントの画像にファイル名のラベルを付加するという仕様なのですが、プリントやPDF書き出しを同時に行いたいという要望があり、このevent listenerを使用して処理しました。プリント・PDFを作成するスクリプトを作成し、imageFileName.scptはそのままリソースに入れて呼び出しています。ラベルを付加してプリントする場合は「beforePrint」、ラベルを付加してPDFを書き出す場合は「beforeExport」、プリントした後にラベルを付加してPDFを書き出す場合は「afterPrint」など処理に応じて応答するイベントを切り替えています。また、event listenerでスクリプトを呼び出すとエラーダイアログも無視(user interaction levelがnever interactに設定したときと同じ挙動になり、終わるとinteract with allに戻る)し、処理が早く終わります。
さらにAppleScriptからJavaScriptを呼び出すことも可能ですのでアイデア次第で活用の幅は広がりそうです。ちなみに、「imageFileName.scpt」はいまのところ社内でのみ活用していますがもし要望があればお気軽にご相談ください。