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 | それ以外のフォント。まだ出会ったことがない。 |