文字幅を取得する

特定の段落を1行に収めたい場合など、文字に長体を掛けるシーンは多い(横組みの場合)のだけれど、スクリプトで段落の行数を調べて少しずつ掛けていくよりは、タグ付きテキストであらかじめ長体率を指定しておいて一気に流すほうが圧倒的に速い。
でも文字幅が全部同じなら、文字数を数えることで可能なんだけど、文字幅が異なる場合はそう簡単にはいかない。実際、入力は全角文字のみに制限されている自動組版システムも聞いたことがある。でもそれじゃあ美しくないな。欧文の場合は単語の途中で切るわけにいかないので、複数行の場合は難しいのだけれど、段落が1行のみの場合は文字幅を取得することで長体率を計算することができる。
ということで、文字幅を取得するスクリプトです。まずは図のようなドキュメントを作成してください。

テキストは文字幅を取得したい文字と書体があれOK!
その状態で次のスクリプトを実行します。

doc = app.activeDocument;
with (doc.viewPreferences){
//単位をポイントに揃える(別にポイントでなくてもいいけどとにかく揃える)
    horizontalMeasurementUnits = 2054188905;
    verticalMeasurementUnits = 2054188905;
    lineMeasurementUnits = 2054188905;
    textSizeMeasurementUnits = 2054188905;
    typographicMeasurementUnits = 2054188905;
}
txf = doc.textFrames[0];
for (i = 0 ; i < txf.paragraphs.length ; i++ ) {
    ch = txf.paragraphs[i].characters[0]
    x1 = ch.horizontalOffset;
    x2 = txf.paragraphs[i].characters[1].horizontalOffset;
    charwidth = (x2 - x1) / ch.pointSize;
    alert(ch.contents + "の文字幅は" + charwidth + " emです");
}

サンプルなのでダイアログで表示してるけど、実際に使うときはテキストファイルに落として、データベースに読み込みます。
その後は好きに利用してくださいってことで。でも実際に使うときは文字組アキ量の設定にも気をつけて。