DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

PDF書き出しダイアログのページ範囲をリセットしたい

概要

PDF書き出しダイアログのページ範囲

タイトルどおりの要望がフォーラムに出ていたので、スクリプトで解決できますよ、という話です。

どうやってやるの?

PDF書き出しダイアログの該当部分はアプリケーションレベルで記憶されます*1。ページ範囲「4」を指定してPDF出力すると、アプリケーションはこの「4」を記憶します。次に開いたドキュメントに同じページ範囲(ノンブル)が存在すると、それが再びセットされた状態のPDF書き出しダイアログが出現する仕様のようです。このとき、前回記憶したページ範囲(ノンブル)がドキュメントになければ設定がリセットされます。
PDF書き出しダイアログの設定の一部はスクリプトでいじれます。なのでその仕様を利用して、ドキュメントには存在しないページ範囲(ノンブル)を指定してダイアログの設定をリセットしようという理路です。

スクリプトで解決しよう

スクリプトで解決したいのですが、そのためにはスクリプトを実行するというアクションを起こさねばなりません。ドキュメントを開いたらこのスクリプトを実行しましょう、では面倒ですよね。ドキュメントを開いたら自動的にスクリプトを実行してほしいわけですが、InDesignではそれができます。

それにはスタートアップスクリプトという仕組みと、スクリプトにあるイベントリスナーという仕組みを併用します。

NOTES

スタートアップスクリプトとは、アプリケーションの起動時に、所定の場所に保管したスクリプトが一度だけ自動的に実行される仕組みです。

イベントリスナーはもともとJavaScriptが持つ仕組みで、それがExtendScriptとしてInDesign用に拡張されたものです。InDesignの特定のイベント(ファイルを開く、特定のメニュー操作を実行する等)に対して、そのイベントが実行されるタイミングに合わせて実行したいスクリプト処理を登録できます。あえて端的に言えば、イベントにスクリプト処理を登録するためのスクリプトの仕組み、でしょうか。

  1. ダイアログの設定をリセットするスクリプト処理を用意する
  2. 「ドキュメントを開いたとき」というイベントに対して 1 の処理を登録するためのスクリプトを用意する
  3. スタートアップスクリプトとして 2 のスクリプトをInDesign起動時にアプリケーションに自動実行させる

というのが今回の一連の流れになります。

コード

コード全文は下記の通りです。

InDesignPDF書き出しページ範囲をリセットするスクリプト

ざっくり解説すると…

  • 冒頭の//@targetengineはイベントリスナーを利用する際の、ExtendScriptのルールです*2
  • addEventListener()というメソッドがイベントリスナーを登録するためのメソッドです
    • 引数は順に、スクリプト処理を登録する対象イベント(String)、登録する内容(コールバック関数)、バブリングするかどうか(Boolean、省略可)です*3
  • コールバック関数の引数には、対象のイベントがEventオブジェクトとして渡されます(引数eを設定していますが、このサンプルではどこにも使っていません)*4
  • PdfExportPreference.pageRangeがPDF書き出しダイアログのページ範囲です
    • 普通、ドキュメントのノンブルに0は使わないと思うので、この値を"0"にすることで設定をリセットさせています

となります。

インストール

このコードを適当な名前で.jsxファイルとして保存し、下記の場所に入れてください(InDesign 2021(v16)の場合)。

  • Mac
    ~/Library/Preferences/Adobe InDesign/Version 16.0-J/ja_JP/Scripts/startup scripts
  • Windowsの場合
    ~\AppData\Roaming\Adobe\InDesign\Version 16.0-J\ja_JP\Scripts\startup scripts

この場所に「startup scripts」というフォルダがなければ作成してOKです。

スタートアップスクリプトとイベントリスナーの組み合わせは非常に強力です。うまく利用してInDesignをゴリゴリ活用しましょう!
こんなことできるかなとか、もっと詳しい話が聞きたいな、ということであればもくもく会でお待ちしています!

*1:筆者調べ

*2:指定するエンジン名(サンプルでは "PDFpageRangeReset")は任意です

*3:詳細はInDesignスクリプティングガイドを参照ください

*4:このケースであれば、開いたドキュメントの情報がこの引数eに渡されています