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