外部ファイルの指定に従ってフォントを置換するスクリプト(未完)
外部ファイルから、旧・新のフォント名の対応を読み込んで、フォントを置換するスクリプトを作りました。簡単な文書で試したところ一応動いています。しかし、うまく動作するのはシステムにあるフォント同士を置換する場合だけ。肝心の、システムにないフォントを置換するのがうまくいきません。もう少し、悪戦苦闘しないといけません。
フォントを置換するには、旧・新のフォント名の対応をカンマ区切りで書いた、下記のようなテキスト・ファイルを作ります。
小塚明朝 Pro R,FOT-マティス Pro B りょうゴシック PlusN R,小塚明朝 Pro B
スクリプトを実行すると、ファイル選択ダイアログが開くので、このテキスト・ファイルを選択します。
【 動作確認 】Windows7 x64, InDesign CS4
/* * 外部ファイルに記述された対応に従って、文書内のすべてのテキストのフォントを置換する * * Rev01 2010.12.14 初版 * */ /******************************************************************************* * グローバル変数 *******************************************************************************/ var oldFontList = []; // 置換前のフォント名のリスト var newFontList = []; // 置換後のフォント名のリスト var newFontObj = []; // フォントオブジェクトの配列(置換後のフォント) main(); /******************************************************************************* * [概要] メインルーチン *******************************************************************************/ function main() { if (app.documents.length == 0) { myError("文書が開かれていません。\n文書を開いてから実行してください。"); } readFontReplaceFile(); // 外部ファイルから、旧フォント名と新フォント名の対応を読み込む replaceFont(); // 全段落、全セルをスキャンして、システムにないフォントを指定のフォントに置き換える } /******************************************************************************* * [概要] 外部ファイルから、旧フォント名と新フォント名の対応を読み込む *******************************************************************************/ function readFontReplaceFile() { var fileName = File.openDialog("フォント置換リストを記述したファイルを選択してください"); if (fileName) { var fileObj = new File(fileName); var flag = fileObj.open("r"); // ファイルを読み込みモードで開く if (flag == true) { while (!fileObj.eof) { var oneLine = fileObj.readln(); //$.writeln(oneLine); var tmpArray = oneLine.split(","); oldFontList.push(tmpArray[0]); newFontList.push(tmpArray[1]); newFontObj.push(app.fonts.item(tmpArray[1])); } } else { myError("ファイル [" + fileName * "] が開けませんでした。"); } } else { exit(); // キャンセルボタンがクリックされた場合は、プログラムを終了する } } /******************************************************************************* * [概要] ドキュメント内の全段落と全セルについてフォントの置換を行う *******************************************************************************/ function replaceFont() { for (var i_page = 0; i_page < app.activeDocument.pages.length; i_page++) { var pageObj = app.activeDocument.pages[i_page]; for (var i_textFrame = 0; i_textFrame < pageObj.textFrames.length; i_textFrame++) { var textFrameObj = pageObj.textFrames[i_textFrame]; // テキストフレーム内のすべての段落をスキャンする for (var i_paragraph = 0; i_paragraph < textFrameObj.paragraphs.length; i_paragraph++) { var paragraphObj = textFrameObj.paragraphs[i_paragraph]; //$.writeln(paragraphObj.contents); var fontObj = paragraphObj.appliedFont; var fontName = fontObj.name; var newFontIndex = searchOldFontList(fontName); // 置換対象のフォントかどうか調べる if (newFontIndex >= 0) { paragraphObj.appliedFont = newFontObj[newFontIndex]; } } // テキストフレーム内のすべての表をスキャンする for (var i_table = 0; i_table < textFrameObj.tables.length; i_table++) { var tableObj = textFrameObj.tables[i_table]; for (var i_cell = 0; i_cell < tableObj.cells.length; i_cell++) { var cellObj = tableObj.cells[i_cell]; for (var i_paragraph; i_paragraph < cellObj.paragraphs.length; i_paragraph++) { var paragraphObj = cellObj.paragraphs[i_paragraph]; var fontObj = paragraphObj.appliedFont; var fontName = fontObj.name; var newFontIndex = searchOldFontList(fontName); // 置換対象のフォントかどうか調べる if (newFontIndex >= 0) { paragraphObj.appliedFont = newFontObj[newFontIndex]; } } for (var i_line = 0; i_line < cellObj.lines.length; i_line++) { var lineObj = cellObj.lines[i_line]; var fontObj = lineObj.appliedFont; var fontName = fontObj.name; var newFontIndex = searchOldFontList(fontName); // 置換対象のフォントかどうか調べる if (newFontIndex >= 0) { lineObj.appliedFont = newFontObj[newFontIndex]; } } } } } } } /******************************************************************************* * [概要] 引数で指定されたフォントが置換対象のフォントかどうかを調べる * * [引数] * fontName : エラーメッセージ * * [戻り値: * -1 → 置換対象のフォントではない * 0以上 → 新しいフォントオブジェクトの配列のインデックス *******************************************************************************/ function searchOldFontList (fontName) { for (var i = 0; i < oldFontList.length; i++) { if (oldFontList[i] === fontName) { $.writeln("旧: " + fontName + ", 新: " + newFontList[i]); return(i); } } return(-1); } /******************************************************************************* * [概要] エラーメッセージを表示して、スクリプトを抜ける * * [引数] * msg : エラーメッセージ *******************************************************************************/ function myError(msg) { if (arguments.length > 0) { alert(msg); } exit(); }
【 補足 】
文書内のすべてのテキストを対象にフォントを置換しようとしていますが、このコードで本当にすべてのテキストを処理できるのか、いまいち自信がありません。appliedFontプロパティを持つオブジェクトに、story, paragraph, line, text, characterなどがあるのですが、これらオブジェクトの関係がいまひとつよく理解できていないのです。
もう少し勉強せねば。。。
【 免 責 】
上記スクリプトの使用により発生する、データの破損などのあらゆる不具合・不利益については、一切の責任を負いかねますのでご了解ください。