DTP駆け込み寺
  1. [13903] InDesign JavaScriptでフォント置換は? しるしる 2012/04/19 11:57 *
    1. [13904] Re: InDe JSでフォント置換は? (z-) 2012/04/19 12:25
      1. [13905] Re^2: InDe JSでフォント置換は? (z-) 2012/04/19 12:26
      2. [13906] Re^2: InDe JSでフォント置換は? しるしる 2012/04/19 13:10
        1. [13907] Re^3: InDe JSでフォント置換は? (-_-) 2012/04/19 13:29
          1. [13909] Re^4: InDe JSでフォント置換は? (z-) 2012/04/19 14:27
        2. [13908] Re^3: InDe JSでフォント置換は? (z-) 2012/04/19 14:24
          1. [13910] Re^4: InDe JSでフォント置換は? しるしる 2012/04/19 14:54
            1. [13911] Re^5: InDe JSでフォント置換は? (z-) 2012/04/19 15:48
              1. [13912] Re^6: InDe JSでフォント置換は? しるしる 2012/04/19 18:05
                1. [13913] Re^7: InDe JSでフォント置換は? (z-) 2012/04/19 18:51
                  1. [13914] Re^8: InDe JSでフォント置換は? ditahack 2012/04/19 22:25
                    1. [13916] Re^9: InDe JSでフォント置換は? (z-) 2012/04/20 10:18
                      1. [13920] Re^10: InDe JSでフォント置換は? しるしる 2012/04/20 13:35
                        1. [13921] Re^11: InDe JSでフォント置換は? しるしる 2012/04/20 13:36
                          1. [13922] Re^12: InDe JSでフォント置換は? (z-) 2012/04/20 14:02
                            1. [13923] Re^13: InDe JSでフォント置換は? しるしる 2012/04/20 15:45
                              1. [13924] Re^14: InDe JSでフォント置換は? (z-) 2012/04/20 18:08
                                1. [13925] Re^15: InDe JSでフォント置換は? しるしる 2012/04/20 20:57
                                  1. [13926] Re^16: InDe JSでフォント置換は? ditahack 2012/04/20 22:18
                                    1. [13927] Re^17: InDe JSでフォント置換は? ditahack 2012/04/20 22:24
                                      1. [13936] Re^18: InDe JSでフォント置換は? しるしる 2012/04/24 12:17
                                        1. [13942] Re^19: InDe JSでフォント置換は? (z-) 2012/04/24 17:05
                                          1. [13944] Re^20: InDe JSでフォント置換は? . 2012/04/25 09:21
                                            1. [20551] Re^21: InDe JSでフォント置換は? たなか 2021/06/03 14:34
                                              1. [20555] Re^22: InDe JSでフォント置換は? (z-) 2021/06/04 12:34
                                                1. [20556] Re^23: InDe JSでフォント置換は? たなか 2021/06/04 17:46
                                                  1. [20557] Re^24: InDe JSでフォント置換は? -e 2021/06/09 13:52

[ 返信 ]

InDesign JavaScriptでフォント置換は?

InDesign JavaScriptでフォント置換は?

Mac10.5.8でInDesign CS4を使用しています。

InDesignファイル上のフォントをJavaScriptで一括置換したいと
思いまして下記サイトのスクリプトを見つけました。

 http://d.hatena.ne.jp/ditahack/20101218/1292658580

そこで、フォント置換リストとして下記のようにフォント名を記入したテキストファイルを用意し、
スクリプトで使用してみましたところ、エラーが出てしまい正常に動作しません。

 A-OTF じゅん Pro 34,A-OTF カクミン Pro B

添付画像のようなエラー画面が2つ続けて出てきます。

調べましたが原因が分かりません。
アドバイスいただけると助かります。

どうぞよろしくお願いいたします。

[13903] しるしる (2012/04/19 Thu 11:57)

[ 返信 ]


Re: InDe JSでフォント置換は?

> Mac10.5.8でInDesign CS4を使用しています。
>
> InDesignファイル上のフォントをJavaScriptで一括置換したいと
> 思いまして下記サイトのスクリプトを見つけました。
>
>  http://d.hatena.ne.jp/ditahack/20101218/1292658580
>
> そこで、フォント置換リストとして下記のようにフォント名を記入したテキストファイルを用意し、
> スクリプトで使用してみましたところ、エラーが出てしまい正常に動作しません。
>
>  A-OTF じゅん Pro 34,A-OTF カクミン Pro B
>
> 添付画像のようなエラー画面が2つ続けて出てきます。
>
> 調べましたが原因が分かりません。
> アドバイスいただけると助かります。
>
> どうぞよろしくお願いいたします。

わざわざ試してみました。MacOSX 10.6.8、 CS4
正常動作しました。
フォント名を正しく書きましょう。
具体的には、「Pro」の後ろはスペースではなくタブ送りです。

これだけではなんなので、
補足としてスクリプトが読めるフォント名を知りたい文字を選択して実行。エラー処理はしてません。
chrObj=app.selection[0];
fontNameFrame=app.activeDocument.textFrames.add();
fontNameFrame.contents=chrObj.appliedFont.name;

で新規テキストフレームにフォント名が入ります。ページ左上にオーバーフローしたテキストフレームが出現するので、手が広げてください(てきとうw)

[13904] (z-) (2012/04/19 Thu 12:25) web

[ 返信 ]


Re^2: InDe JSでフォント置換は?

書き間違えました
×手が広げてください
○手で広げてください

土下座してお詫び申し上げます

[13905] (z-) (2012/04/19 Thu 12:26) web

[ 返信 ]


Re^2: InDe JSでフォント置換は?

(z-)さん、ご回答いただきありがとうございます。
アドバイス通りにフォント名を記述しましたら正常動作しました。

Proの後ろがタブだとは想像だにしませんでした。

補足で記述していただいたスクリプトも試してみました。
このようにしてスクリプトが読めるフォント名を確認するのですね。
大変勉強になりました。
ありがとうございます。

もしご存じでしたら追加でお教えいただきたいことがございます。
今回のフォント置換スクリプトは、フォント置換リストとして外部ファイルを読み込みますが、
これをスクリプトの中に記述して動作できるように改良したいと思います。

自分でも本とネットで調べて見ましたが参考となるものを
見つけられませんでした。

どのように記述すればよいのでしょうか。

[13906] しるしる (2012/04/19 Thu 13:10)

[ 返信 ]


Re^3: InDe JSでフォント置換は?

多少なりともscriptを理解していれば難しい部類じゃないです。

[13907] (-_-) (2012/04/19 Thu 13:29)

[ 返信 ]


Re^4: InDe JSでフォント置換は?

> 多少なりともscriptを理解していれば難しい部類じゃないです。

同感しつつも、おせっかいしてしまいました すいませんw

[13909] (z-) (2012/04/19 Thu 14:27) web

[ 返信 ]


Re^3: InDe JSでフォント置換は?

> これをスクリプトの中に記述して動作できるように改良したいと思います。

app.findTextPreferences.appliedFont = oldFontObj; // ←←← CS3ではココでエラー発生

app.findTextPreferences.appliedFont = app.fonts.item("ここに検索フォント名");
に、

app.changeTextPreferences.appliedFont = newFontObj[i]; // 置換後のフォントを指定

app.changeTextPreferences.appliedFont = app.fonts.item("ここに置換フォント名");
に書き換え
でそうなります。
テキストファイル読み込みの処理をスキップしないと、いちいちダミーのテキストファイルを用意しないと動きません。そこは自力で、勉強して、がんばってください。コメントアウトだけで済みますから。

あと、「改良」ってのは……本人にとっては良くなるんでしょうけど。。
元のスクリプトを善意で公開された方がクソまみれにされそうで杞憂しております。
http://pub.ne.jp/ajabon/?entry_id=3904952

[13908] (z-) (2012/04/19 Thu 14:24) web

[ 返信 ]


Re^4: InDe JSでフォント置換は?

自分なりに手を加えて下記のようになりました。
修正を加えた部分のみ記載します。
もっとスマートに書けるはずなのですが知識が乏しく自分レベルではこれが精一杯です。

/*******************************************************************************
* [概要] メインルーチン
*******************************************************************************/
function main() {
if (app.documents.length == 0) {
myError("文書が開かれていません。\n文書を開いてから実行してください。");
}
readFontReplaceFile("A-OTF じゅん Pro\t34","A-OTF カクミン Pro\tB");
readFontReplaceFile("A-OTF フォーク Pro\tM","A-OTF 勘亭流 Std\tUltra");
replaceFont(); // 検索・置換機能を使ってフォントを指定のフォントに置き換える
}

/*******************************************************************************
* [概要] 外部ファイルから、旧フォント名と新フォント名の対応を読み込む
*******************************************************************************/
function readFontReplaceFile (fontMae,fontAto) {
oldFontList.push(fontMae); // 置換前のフォント名を配列にプッシュ
var tmpFontObj = app.fonts.item(fontAto); // フォントオブジェクトを取得
newFontList.push(fontAto); // 置換後のフォント名を配列にプッシュ
newFontObj.push(tmpFontObj); // 置換後のフォントオブジェクトを配列にプッシュ
}

さて、(-_-) さん、ご指摘ありがとうございます。

安易に質問しないようにはしているのですが
人によって「安易」と思われてしまうことは承知しております。

「安易」というような指摘がある中で質問に答えていただいた方には、
ただただ感謝するのみです。
(z-)さん、誠にありがとうございます。本当に助かりました。

自分の今回した質問が、私も「安易」と思えるレベルに
早く到達できるよう日々精進していきたいと思います。

[13910] しるしる (2012/04/19 Thu 14:54)

[ 返信 ]


Re^5: InDe JSでフォント置換は?

感謝を述べるなら、まず誰よりも先に元のスクリプトを公開された方に向けてください。
あなたの用途には少し合わなかったかも知れませんが、改変前でも複数の組み合わせの検索・置換を一括処理できる非常に有用な物でした。
あれありきなんですから。
これだけ有名な所ですから、ご本人見てらっしゃる可能性も大いに考えられますがね‥
 閲覧者からのナマの反響が何よりも情報公開のモチベーション維持に繋がりますので ^

[13911] (z-) (2012/04/19 Thu 15:48) web

[ 返信 ]


Re^6: InDe JSでフォント置換は?

ご指摘ありがとうございます。
そうですよね。
まずはお礼を言うべきは元のスクリプトを公開された方でした。
早速、先ほどお礼の書き込みをしておきました。

改変したスクリプトをテストしていて気づいたのですが
環境にないフォントを環境にあるフォントに置換することが
できないようです。

また壁にぶつかってしまいました…。

(z-)さんに教えていただいた方法で環境にないフォントのフォント名を
調べてスクリプト内に記載したのですが正常に動作しません。

InDesignのパネル上では環境にないフォント名が[]で囲まれて表示されているので
スクリプト内での表記も半角の[]で囲んで試してみましたがダメでした。

理由がおわかりの方がおりましたらアドバイスいただけると助かります。
よろしくお願いします。

[13912] しるしる (2012/04/19 Thu 18:05)

[ 返信 ]


Re^7: InDe JSでフォント置換は?

> 改変したスクリプトをテストしていて気づいたのですが
> 環境にないフォントを環境にあるフォントに置換することが
> できないようです。

元のスクリプトでは正常に動作しました。
大事なところを改変時になくしてしまってます。
function readFontReplaceFile() の中に、

var tmpFontObj = app.fonts.item(tmpArray[1]); // フォントオブジェクトを取得
if (tmpFontObj != null) {
newFontList.push(tmpArray[1]); // 置換後のフォント名を配列にプッシュ
newFontObj.push(tmpFontObj); // 置換後のフォントオブジェクトを配列にプッシュ
} else {
aleart("システムにインストールされていないフォントです\nフォント名 = "+tmpArray[1]);
}

を復活させましょう。
app.fonts.item("hoge")は「アプリケーションが使えるフォント群のうち、hogeという名前のオブジェクト」という感じです。環境にない場合は当然オブジェクトが見つかりません。
見つからなかった時は置換設定にフォントオブジェクトの名前ではなくフォントの名前と同じ文字列を入れてやる(と動く)という仕組みっぽいです。すごいすごーい。

[13913] (z-) (2012/04/19 Thu 18:51) web

[ 返信 ]


Re^8: InDe JSでフォント置換は?

オリジナルのスクリプトを書いたものです。

置換前のフォントとして、「システムにないフォント」を指定した場合、getFontObj関数の中でフォント名を頼りにフォントオブジェクトを探すように作ってあります。この関数が完全ではないのかもしれません。

//$.writeln(fontObj.name);
とコメントアウトしている部分の、先頭の // を取って実行し、それにより表示されるフォント名の中に、置換前のフォント名(今の場合は、A-OTF じゅん Pro 34)が含まれているか確認してください。

ちなみに、改変の仕方はよくありませんね。
置換前、置換後のフォントをソースコードの中で指定するのであれば、oldFontList、newFontListそれぞれのリストに、直接フォント名を設定するべきです。newFontObjのリストには、newFontListを元にapp.fonts.item()を使って取得したフォントオブジェクトを格納します。

そんなに難しくはないと思いますので、がんばってみてください。

[13914] ditahack (2012/04/19 Thu 22:25)

[ 返信 ]


Re^9: InDe JSでフォント置換は?

> ちなみに、改変の仕方はよくありませんね。

実際に使われはしなかったものの、自分の出した改変案もぶっきらぼうだったのを反省しておりますorz
コメントアウトしてあるフォント名取得行も然り、読み解きがぜんぜん甘かったですね。。

[13916] (z-) (2012/04/20 Fri 10:18) web

[ 返信 ]


Re^10: InDe JSでフォント置換は?

(z-)さん、ご回答ありがとうございます。
そして、ditahackさん、わざわざこちらまでお越しいただいた上に
アドバイスまでいただきまして誠にありがとうございます。

ご指摘の点をふまえまして、下記のように改変しました。
改変した箇所のみ記載します。

/*******************************************************************************
* [概要] メインルーチン
*******************************************************************************/
function main() {
if (app.documents.length == 0) {
myError("文書が開かれていません。\n文書を開いてから実行してください。");
}
readFontReplaceFile(); // 外部ファイルから、旧フォント名と新フォント名の対応を読み込む
replaceFont(); // 検索・置換機能を使ってフォントを指定のフォントに置き換える
}

/*******************************************************************************
* [概要] 外部ファイルから、旧フォント名と新フォント名の対応を読み込む
*******************************************************************************/
function readFontReplaceFile() {
//置換前と置換後のフォント名をカンマ区切りで配列に入れる
var motoFontList = [
"A-OTF じゅん Pro\t34,A-OTF 勘亭流 Std\tUltra",
"ウインクス-S7-JTCウインS7\tBold,A-OTF 勘亭流 Std\tUltra",
"A-OTF フォーク Pro\tM,A-OTF 勘亭流 Std\tUltra"
];
for ( i=0 ; i<motoFontList.length ; i++ ) {
var myObj = motoFontList[i]; //
var tmpArray = myObj.split(","); // カンマで文字列を分割して、配列に格納
oldFontList.push(tmpArray[0]); // 置換前のフォント名を配列にプッシュ
var tmpFontObj = app.fonts.item(tmpArray[1]); // フォントオブジェクトを取得
if (tmpFontObj != null) {
newFontList.push(tmpArray[1]); // 置換後のフォント名を配列にプッシュ
newFontObj.push(tmpFontObj); // 置換後のフォントオブジェクトを配列にプッシュ
} else {
aleart("システムにインストールされていないフォントです\nフォント名 = "+tmpArray[1]);
}
}
}

以上になります。
残念ながらまだ完全ではありません。
置換前のフォントとして「システムにないフォント」を指定した場合は正しく動作しません。
置換後のフォントへは変更されず、何も起きないのです。
ちなみ、こちらのテスト環境では「ウインクス-S7-JTCウインS7\tBold」がシステムにないフォントです。

[13920] しるしる (2012/04/20 Fri 13:35)

[ 返信 ]


Re^11: InDe JSでフォント置換は?

※投稿する文字数制限にひっかかりましたので分割して投稿いたします。

アドバイスにありました、
//$.writeln(fontObj.name);
の//を取って実行しましたが何も表示されませんでした。

試しに、

function main() {
if (app.documents.length == 0) {
myError("文書が開かれていません。\n文書を開いてから実行してください。");
}
readFontReplaceFile(); // 外部ファイルから、旧フォント名と新フォント名の対応を読み込む
$.writeln(newFontObj.name);
}

こちらの位置でwritelnを実行してみましたが、同じく何も表示されません。
八方ふさがりです。

どなたかアドバイスをいただけると助かります。

[13921] しるしる (2012/04/20 Fri 13:36)

[ 返信 ]


Re^12: InDe JSでフォント置換は?

> writelnを実行してみましたが、同じく何も表示されません。

ねんのため確認ですが、ExtendScriptToolKitは使われてますか?
もしくは起動されてますか?
$.writeln()は引数をExtendScriptToolKitのJavaScriptコンソールウィンドウ内に書き出します。

問題の切り分けのため、他のてきとうなどうでもいいフォントをアンインストールの上で試してみてはどうでしょう。インストール済みのとき動作したフォントで。

[13922] (z-) (2012/04/20 Fri 14:02) web

[ 返信 ]


Re^13: InDe JSでフォント置換は?

ExtendScriptToolKitに表示されるとは気づきませんでした。
ありがとうございます。

早速ExtendScriptToolKitのJavaScriptコンソールウィンドウを表示させたら
下記テキストが表示されていました。

旧: A-OTF じゅん Pro 34, 新: A-OTF 勘亭流 Std Ultra
A-OTF フォーク Pro M
A-OTF 勘亭流 Std Ultra
ウインクス-S7-JTCウインS7 Bold
旧: ウインクス-S7-JTCウインS7 Bold, 新: A-OTF 勘亭流 Std Ultra
旧: A-OTF フォーク Pro M, 新: A-OTF 勘亭流 Std Ultra

頭に「旧: 」と入っていない行があります。
このあたりに何か原因があるのでしょうか。

また、アドバイスいただいたように
インストール済みで動作したフォントをアンイストールした上で
スクリプトの動作を確認しましたが、ダメでした。
置換後のフォントに変わってくれません。

[13923] しるしる (2012/04/20 Fri 15:45)

[ 返信 ]


Re^14: InDe JSでフォント置換は?

> スクリプトの動作を確認しましたが、ダメでした。
> 置換後のフォントに変わってくれません。

改変前のスクリプトではどうですか?
それで改善されなければ、あなたが新境地を拓く流れになりますが…

[13924] (z-) (2012/04/20 Fri 18:08) web

[ 返信 ]


Re^15: InDe JSでフォント置換は?

改変前のスクリプトを試してみましたがダメでした。
置換前のフォントとして「システムにないフォント」を指定した場合は置換されません。

新境地を拓くしかないですかね…。
自分にはハードル高すぎですが、調べてみたいと思います。
ありがとうございました。

[13925] しるしる (2012/04/20 Fri 20:57)

[ 返信 ]


Re^16: InDe JSでフォント置換は?

1) 旧: A-OTF じゅん Pro 34, 新: A-OTF 勘亭流 Std Ultra
2) A-OTF フォーク Pro M
3) A-OTF 勘亭流 Std Ultra
4) ウインクス-S7-JTCウインS7 Bold
5) 旧: ウインクス-S7-JTCウインS7 Bold, 新: A-OTF 勘亭流 Std Ultra
6) 旧: A-OTF フォーク Pro M, 新: A-OTF 勘亭流 Std Ultra

コンソールに出力された上記の文字列のうち、1,5,6は、
$.writeln("旧: " + oldFontList[i] + ", 新: " + newFontList[i]);
のコードで出力されたものです。

2,3,4が、
 $.writeln(fontObj.name)
のコードで出力されたものです。

[13926] ditahack (2012/04/20 Fri 22:18)

[ 返信 ]


Re^17: InDe JSでフォント置換は?

1) 旧: A-OTF じゅん Pro 34, 新: A-OTF 勘亭流 Std Ultra
2) A-OTF フォーク Pro M
3) A-OTF 勘亭流 Std Ultra
4) ウインクス-S7-JTCウインS7 Bold
5) 旧: ウインクス-S7-JTCウインS7 Bold, 新: A-OTF 勘亭流 Std Ultra
6) 旧: A-OTF フォーク Pro M, 新: A-OTF 勘亭流 Std Ultra

この出力を見ると、4)のフォント名と、5)の旧フォント名が一致しているので、getFontObj()の中の、下記のコードにより、旧フォントのフォントオブジェクトが戻るはずです。

if ((fontObj.name === fontNameStr) ||
((alternativeFontName !== "") && (fontObj.name === alternativeFontName))) {
return(fontObj);
}

ExtendScriptToolKitで上記のif文のところにBreak Pointを設定し、フォント名が「ウインクス-S7-JTCウインS7 Bold」のときの文字列比較がうまく動いているか調べてみてください。

[13927] ditahack (2012/04/20 Fri 22:24)

[ 返信 ]


Re^18: InDe JSでフォント置換は?

アドバイスありがとうございます。

ExtendScriptToolKitでブレークポイントを設定するも
ブレークポイントで止まらないという問題が起きており、
現在、試行錯誤しています。

解決でき次第、アドバイスの件を調べてみたいと思います。

[13936] しるしる (2012/04/24 Tue 12:17)

[ 返信 ]


Re^19: InDe JSでフォント置換は?

> ExtendScriptToolKitでブレークポイントを設定するも
> ブレークポイントで止まらないという問題が起きており、
> 現在、試行錯誤しています。

赤丸は止まります。空行の赤丸では止まりません。
また、あずき色も止まりません。

$.bp(); でも止まります。これだと、一行に欲張っていっぱい書いた途中に書いても、そこで止まります。

すっごい上の方でリンクしたkamisetoさんのblog記事を熟読されたし。

[13942] (z-) (2012/04/24 Tue 17:05) web

[ 返信 ]


Re^20: InDe JSでフォント置換は?

多くの場合、止まらないのではなくそこに至っていないと思ったほうが良いです。

ステップ実行でどう動くのか、変数を確認しながら、試してみましょう。

[13944] . (2012/04/25 Wed 09:21)

[ 返信 ]


Re^21: InDe JSでフォント置換は?

Indesignのスクリプトでフォントの置換がしたくて、こちらのスレッドを見つけた。
こちらOTFはうまくいくのですが、NEW CIDが動きません。
おそらくNEW CIDフォントの正式名称なのかと思うのですが、どなたか分かる方いたら教えていただけたらと思います。

A-OTF 新ゴ Pro\tM を A-CID 新ゴ\tM 等試してみたのですがうまくいきません。

[20551] たなか (2021/06/03 Thu 14:34)

[ 返信 ]


Re^22: InDe JSでフォント置換は?

どう動かないのか、の情報は充実させてもらいたいです。
CC2019以降でで開いたからだめなのか、
New CIDはインストールされているのかいないのか、
New CIDにしたいのか、New CIDからA-OTFにしたいのか、
なにかエラーメッセージが出たのか、
それとも正常終了したのに処理されていないのか、
バージョンいくつのInDesignで試しているのか、
試したスクリプトはこの長いスレッドのどの段階のものを使ったのか、
元の作者さんにコンタクトは取ってみられたのか。

ちなみに、弊社環境はすでにCIDは一切扱わないので検証できません(すみません)

[20555] (z-) (2021/06/04 Fri 12:34)

[ 返信 ]


Re^23: InDe JSでフォント置換は?

(z-)様

遅くなってすいません。
環境はOS10.15.7
indesignCC2020です。
NEWCIDはインストールされていません。
過去にNEWCIDで作られたデータから大量に作り直すという仕事があり、
困っています…。
作者さんにはコンタクトは取っていません。

そうですよね、今どきNEWCIDはどこも扱っていないですよね…。

[20556] たなか (2021/06/04 Fri 17:46)

[ 返信 ]


Re^24: InDe JSでフォント置換は?

ドキュメント内フォント名は以下で見ることができますが、
CIDがないので検証はできていません。
var df=app.activeDocument.fonts;
for (var i=0; i<df.length; i++){
$.writeln(df[i].fontFamily+"\t"+df[i].fontStyleName);
}

[20557] -e (2021/06/09 Wed 13:52)