DTPab

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

【InDesign】ドキュメントにオーバーセットテキストがあったら保存できないようにするイベントリスナー型スクリプト

追記

2024-02-22:コメントで教えていただきましたが、だいぶ漏れがあるようです。
2024-02-26:ということでコードを更新しました。末尾にちょっとだけ解説を追記しています。

サンプル

というスクリプトを書きました。Gistのコードをアップデートしています(v2.0.0)。

StartupScripts*1に入れて使ってください。

追記

ぱっと調べた限り、このあたりのオーバーセットテキストを検知できなかったです。

  • パス上テキスト
  • 表組のセル内
  • 脚注
  • 後注

調べる方法がかなり難しいというかややこしかったので、現在調査中です。
前述のスクリプトは、それらを把握したうえでお使いください。

そもそも論として

オーバーセットテキストを検知したいだけなら、InDesignのプリフライト機能を使ったり、PDF書き出し前に出る警告を確認するようにしてください。
このスクリプトを作成した経緯はこちらの掲示板からです。「オーバーセットされたテキストがあったら保存できないようにする」というのが大きな仕様でした。

で、職場で使っているプリフライト的なスクリプトでも似たような処理でオーバーセットテキストを検知しているものの、調べたら同じようにザルだったので、きちんとチェックできるようにしたいと思って調べました。その結果を今回のスクリプトに反映して公開した次第です。

TextFrame.overflowsの大きな穴

パス上テキストはDocument.textFramesで取得できないため、v1.0.0のスクリプトでは検知できていませんでした。これを検知するために、ストーリーを基準にオーバーセットテキストを探しています。この処理によって、後注のオーバーセットは検知できるようになります。
ただストーリーからオーバーセットを検知しようとすると、テキストフレームに1文字も収まらない場合はそのテキストフレームを取得するのが面倒っぽいので、全体の流れをテキストフレームの検知→脚注の検知→表組の検知→ストーリーの検知としました。

Footnoteオブジェクトのオーバーセットの調べ方

脚注ですが、脚注にはなんとoverflowsプロパティが存在しません。そこでCharactersコレクションオブジェクトから最後の文字のCharacter.paretTextFrames[0]を調べます。ここでTextFrameオブジェクトではなく、undefinedが返ってくるならその文字はオーバーセットしていると判断できます。

Cellオブジェクトのオーバーセットの調べ方

Document.sotiresではセルの中のストーリーひとつひとつは取得できません。したがって、ストーリーの中の表組や、テキストフレームの中の表組など、どうにかこうにかObject.tablesにアクセスする必要があります。今回はテキストフレーム単位で表組を検知してみました。

さいごに

オーバーセットテキストの検知だっっっっっる! という印象。素直にプリフライトを利用したり、InDesignの警告を利用したりしましょう。

*1:StartupScripts is 何? という方は、昔の登壇スライドを参照ください