Hatena::ブログ(Diary)

文書遊戯 このページをアンテナに追加 RSSフィード Twitter

2010-12-14

文書で使われている、システムにないフォントの一覧を外部ファイルに出力するJavaScript

| 21:23 | 文書で使われている、システムにないフォントの一覧を外部ファイルに出力するJavaScriptを含むブックマーク

過去にMac版QuarkExpressで作られた文書を、Win版InDesignに変換する作業をサクッとやりたい・・・・

実際に手作業でやってみたら、フォントを置換するのに手間がかかることが分かりました。「ここは一つ、フォントの置換を一発でやってしまうスクリプトを書くか」ということで書き始めました。

まずは、文書で使われている、システムにないフォントの一覧を外部ファイルに出力するスクリプトを書きました。このスクリプトが出力したテキストファイルを編集し、システムにないフォントと新しいフォントの対応を書きます。そして出来上がったファイルをスクリプトに読み込ませ、文書内の該当するフォントを一気に置換してしまおう、というたくらみです。

うまくいくかなぁ。。。

※下記のスクリプト、12/13の夜にアップしたのですが12/14に差し替えました。最初にアップしたスクリプトは、システムにないフォントを判別するのに、システムにインストールされた全フォントのリストと、文書で使われているフォントを突き合わせていました。fontObj.statusプロパティを見れば、システムにあるフォントかどうかを簡単に判別できることに後から気づいた次第です (^_^;)

【 動作確認 】Windows7 x64, InDesign CS4

/*
 * 文書内で使われている、システムにないフォントの一覧を外部ファイルに出力する
 * 
 * Rev01 2010.12.13 初版
 * Rev02 2010.12.14 Font.statusプロパティを見て、フォントの有無を判定するように修正
 *
 */

/*******************************************************************************
 * グローバル変数
 *******************************************************************************/
var missingFontList = [];   // システムにないフォントの一覧を記憶する配列

main();

/*******************************************************************************
 * [概要] メインルーチン
 *******************************************************************************/
function main() {
  if (app.documents.length == 0) {
    myError("文書が開かれていません。\n文書を開いてから実行してください。");
  }

  var my_document = app.activeDocument;
  //$.writeln("*** 文書で使われている全フォント数=" + my_document.fonts.length);
  $.writeln("\n*** システムにないフォントのリスト");
  for (var i_font = 0; i_font < my_document.fonts.length; i_font++) {
    var fontObj = my_document.fonts[i_font];
    if (fontObj.status == FontStatus.NOT_AVAILABLE) {
      // システムにないフォントだけを抽出する
      var fontName = fontObj.name;  // 2010.12.17 修正
      missingFontList.push(fontName);
      $.writeln(fontName);
    }
  }
  if (missingFontList.length === 0 ) {
    alert("本文書ではシステムにないフォントは使われていません。");
  } else {
    saveMissingFontList();  // 配列missingFontListに記憶されたフォント名をファイルに書き出す
  }
}

/*******************************************************************************
 * [概要] 配列missingFontListに記憶されたフォント名を外部ファイルに書き出す
 *******************************************************************************/
function saveMissingFontList() {
  var fileName = File.openDialog("フォント一覧を保存するファイル名を入力してください");
  if (fileName) {
    var fileObj = new File(fileName);
    var flag = fileObj.open("w");  // ファイルを書き込みモードで開く
    if (flag == true) {
      for (var i = 0; i < missingFontList.length; i++) {
        fileObj.writeln(missingFontList[i]);
      }
    } else {
      myError("ファイル [" + fileName + "] が開けませんでした。");
    }
  }
}

/*******************************************************************************
 * [概要] エラーメッセージを表示して、スクリプトを抜ける
 * 
 * [引数]
 *   msg : エラーメッセージ
 *******************************************************************************/
function myError(msg) { 
  if (arguments.length > 0) { alert(msg); }
  exit();
}

【 補 足 】

フォント名は fontObj.name でも取得できますが、あえて fontObj.fontFamily + "\t" + fontObj.fontStyleName としています。nameプロパティで読み出すと、フォントのスタイル名が"Regular"とか"Medium"とかになります。fontStyleNameプロパティだと、"R"とか"M"になります。フォントを置換するときに、後者のスタイル名でないとうまくいかないので、このようにコーディングしました。

12/17:フォント名の読出しにnameプロパティを使うように修正しました。理由は、システムにインストールされていないフォントの場合、fontFamilyおよびfontObjプロパティの読出しがエラーになるためです。

【 免 責 】

上記スクリプトの使用により発生する、データの破損などのあらゆる不具合・不利益については、一切の責任を負いかねますのでご了解ください。

milligrammemilligramme 2010/12/15 20:03 はじめましてこんにちは
function replaceFont のところをStoryとTextStyleRangeベースで書き換えたらいい感じに使えたので参考になればと。https://gist.github.com/741859/

ditahackditahack 2010/12/15 20:26 コメントありがとうございます。さっそく試してみますね。
ちなみに、システムにないフォントの置換方法を調べていたら、下記のページが見つかりました。
http://indisnip.wordpress.com/2010/08/24/findchange-missing-font-with-scripting/
このページのスクリプトのように、検索・置換を使うと割と簡単にフォントを置換できるようです。
人が作ったスクリプトをそのまま使うのは性に合わないので、自分で作り直してみようと思います。

トラックバック - http://d.hatena.ne.jp/ditahack/20101214/1292329407