InDesignのスクリプトでフォント情報を取得
スクリプトの話です。
InDesignのスクリプトでシステムにインストールされているフォントを取得して何らかの操作を行う場合、ExtendScriptでは
var fns = app.fonts;
for (var i = 0; i < fns.length; i++) {
$.writeln(fns[i].location); //フォントの保存先フォルダ
}
などとするのが普通の考え方(『イチからわかる! InDesign JavaScript 指南書』でもそう書きました)ですが、これがとにかく遅い。私の環境では1000フォント処理するのに12分かかります。
さらに悪いことに、実際にはインストールされていないフォントもリストアップされます。Windows 10の場合、標準で「BIZ UDP明朝 Medium」がインストールされています。「BIZ UDP明朝」のファミリーでインストールされているのは「Medium」だけなんですが、InDesignのExtendScriptでは「BIZ UDP明朝 Regular」を検出してしまいます。当然そんなフォントはないので上の例ではエラーになってしまいます。
これでは非常に都合が悪いですね。
そこで色々やっていたんですが、これを次のようにして解決することにしました。これが最善かどうか分かりませんが、実行速度が格段に速く(私の環境では1000フォント処理するのに数秒)、かつ存在しないフォントを無視できるようになりました。
var fnm = app.fonts.everyItem().name;
for (var i = 0; i < fnm.length; i++) {
var fn = app.fonts.itemByName(fnm[i]);
if (fn.status != FontStatus.NOT_AVAILABLE) {
$.writeln(fn.location); //フォントの保存先フォルダ
}
}
まずapp.fonts.everyItem().nameでフォントの名前を配列に入れます。そして名前からフォントオブジェクトを作成します。次にそのフォントオブジェクトのステータスを調べます。これがNOT_AVAILABLEであれば実際には存在しないフォントということになるので、それ以外のフォントについて処理を行うということです。
フォントのステータスは次のようになっています。
| FontStatus.INSTALLED | 正常にインストールされているフォント |
| FontStatus.NOT_AVAILABLE | 存在しないフォント。Applicationオブジェクトの場合のみ |
| FontStatus.SUBSTITUTED | 代替表示されている(システムにない)フォント。Documentオブジェクトの場合のみ |
| FontStatus.FAUXED | (偽装されているフォント)。まだ出会ったことがない。 |
| FontStatus.UNKNOWN | それ以外のフォント。まだ出会ったことがない。 |