Upgrade to Pro — share decks privately, control downloads, hide ads and more …

品質を担保するInDesignスクリプト

Yusuke S.
October 21, 2017

 品質を担保するInDesignスクリプト

2017年10月に東京のDTP勉強会で登壇した際のセッションスライド。

Yusuke S.

October 21, 2017
Tweet

More Decks by Yusuke S.

Other Decks in Technology

Transcript

  1. 11 イベントについて イベントに割り当てるスクリプトは自動的に (目的のイベントが発生し たときに) 実行される点が異なります。 =スクリプトパネルからダブルクリ ックしなく てよい イベントにスクリプトを割り当てるには、

    eventListenerというスクリプ トオブジェクトを使用します。 =eventListenerに登録すれば、 イベントの度に呼び出されるスクリプ トになる 〔Adobe InDesign CS6 スクリプティ ングガイド p.126より引用〕
  2. 12 #targetengine スクリプトを動作させるレイヤーのようなもの (必須) 。 何も指定しない場合は 「main」 になるが、 eventListenerは 「main」

    で は動作しない。 addEventListener ( [イベントタイプ] , [関数or File] ) eventListenerを仕込むメソ ッ ド (必須) 。 どんなイベン トで発動させたいか、 発動した場合はどんな処理を行うか を記述する。 イベントについて
  3. 17 afterOpen_versionCheck1.jsx 1 #targetengine "versionChecker" 2 app.addEventListener("afterOpen", function (ev){ 3

    if (parseInt(app.version, 10) >= 7 && 4 ev.target.constructor.name === "Document") return; 5 var curDoc = ev.target.parent; 6 var createdVer = curDoc.metadataPreferences.creator; 7 alert("保存バージョン:"+createdVer+"\rアプリバージョン:"+app. version); 8 }); 基本形はこんな感じ。 これだとち ょ っと使いづらい。 保存バージョンのチェック
  4. 23 afterOpen_versionCheck2.jsx … 保存バージョンのチェック ver2 switch文でメタデータから取得した文字列を分岐し、 配列に代入。 case "メタデータから抽出した文字列 " :

    myVerLib = ["表示させたいバージョン表記 ", バージョンの値 ]; break; 今後のバージョンに合わせて上記書式でdefault文の前に書き足す。
  5. 24 afterOpen_versionCheck2.jsx 保存バージョンのチェック ver2 以下の条件分岐を条件 (三項) 演算子で1行に記述している。 if (parseFloat(app.version) === 7.5)

    var appVer = 7.5; else var appVer = parseInt(app.version, 10); ※このような半端なバージョンが登場したら追加する必要があるかも? parseFloat (文字列) …文字列を数値型 (浮動小数点) に変換する。 parseIntと違って、 基数は指定する必要はない。
  6. 25 afterOpen_versionCheck2.jsx ドキュメントの保存バージョンとアプリケーションが一致しない場合に 警告を表示する。 また、 2つめのif文 if (myVerLib[1] !== 0)

    で、 表示する文字列を変えている (先のswitch文でどのケースにも当て はまらなかった場合) 。 保存バージョンのチェック ver2
  7. 34 exportLogFile.jsx main関数の内部 afterExportイベン トが呼ばれたときのオプション。 event.format…書き出しフ ォーマッ ト decodeURI (event.fullName)

    …書き出し先のフルパス もしイベン トを増やしてオプションを追加したい場合は、 else if (event.eventType === " [イベント] "){ … } とする。 ログファイル書き出し
  8. 35 exportLogFile.jsx main関数の内部 末尾にあるexportLog関数を呼んでいる。 引数は順に [ログのフルパス] , [ログに書き出す内容] , [区切り文字]

    作業者単位でログを書き分けたい場合は、 exportLog ("~/desktop/saegusa.txt", myLogText, "\t"); などとすると、 作業者別にログを分けることが可能。 ログファイル書き出し
  9. 36 exportLogFile.jsx myRound関数 小数第2位で四捨五入する関数。 Math.round (値) …値を四捨五入して、 最も近似の整数を返す Math.roundメソ ッ

    ドは整数しか返さないので、 2桁スライド (*100) して 四捨五入し、 改めて桁数を戻している。 value = Math.round (value*100) 100 ログファイル書き出し
  10. 37 exportLogFile.jsx exportLog関数 new File ( [ファイルパス] ) …新し く

    ファイルオブジェク トを作成 File.open ( [モード] ) …r、 w、 e、 aの4種類から指定 r:read (読み込みのみ) 、 w:write (新規書き込み) 、 e:edit (読み書き) a:append (読み書き、 ファイルの最後にカレン トポジションが移る) 今回はファイルの最後に書き加えたいのでappendとした。 ログファイル書き出し
  11. 43 注意点 InDesign CS4以降でしか機能しない。 ファイルメニューの 「書き出し」 コマンドを監視しているため、 PDF書き 出しプリセッ トからプリセッ

    トを直接選んで書き出す場合には対応でき ない。 カスタマイズ スクリプト自体はほとんどカスタマイズする余地なし。 リス トとして読み込むtxtファイルの名前は任意に変更可能。 ////////ファイル名 var listFile = "checklist.txt"; //←ここを変更 書き出し前チェックリスト
  12. 44 myCheckList.jsx 25 ev.preventDefault(); //イベントを強制中断させるメソッド 26 27 //リストの読み込み 28 var

    listAry = []; 29 var myList = tgtListFile.open('r'); 30 while (!tgtListFile.eof) listAry.push(tgtListFile.readln()); 31 tgtListFile.close(); リス トファイルを開き、 listAryに1行ずつ配列として追加していく。 File.eofは、 ファイルを読み込んでいるカレントポジションがファイルの 末尾に来るとtrueを返す。 File.readln()メソ ッ ドは、 ファイルを1行ずつ読み出す。 書き出し前チェックリスト
  13. 45 myCheckList.jsx 40 for (var i=0; i<listAry.length; i++) myDlgItems.push (add('checkbox',undefined,listAry[i]));

    41 myDlgItems.push (add ('button', undefined, "書き出し")); … 44 myDlgItems[myDlgItems.length-1].onClick = function (){ … } myDlgItemsには、 ダイアログの子要素を格納している。 一番最後にボタンを追加しているので、 myDlgItems.length-1がそのボ タン。 これのonClickプロパティに関数を与えてボタン動作を実装。 書き出し前チェックリスト
  14. 46 myCheckList.jsx 45 var checkFlag = 0; 46 for (var

    i=0; i<myDlgItems.length-1; i++) checkFlag += (0+myDlgItems[i].value); 47 if (checkFlag === (myDlgItems.length-1)){ … } リス トが全てチェックされたかどうかを判別する。 真偽値を数式に入れると (0+myDlgItems[i].value) 、 trueであれば1、 falseであれば0を返すことを利用している。 最後の条件文では、 myDlgItems.length-1 (この1はボタンの分) と、 リ ストのtrueの合計値を比較している。 書き出し前チェックリスト
  15. 47 myCheckList.jsx 49 app.menuActions.itemByName ("$ID/Export...").eventListeners. itemByName("myCheckList").remove(); 50 app.menuActions.itemByName ("$ID/Export...").invoke(); 51

    var myEv = app.menuActions.itemByName ("$ID/Export..."). addEventListener ("beforeInvoke", myCheckList); 52 myEv.name = "myCheckList"; myCheckListという名前のイベントリスナーを一旦消し (remove) 、 改 めて書き出しコマンドを実行する (invoke) 。 その上でもう一度イベン トリスナーを登録し直す。 消して登録し直すという一見回り くどい方法を採っているが、 そうしない とinvokeした時点で改めてチェックリストが呼ばれてしまう。 書き出し前チェックリスト
  16. 50 yourName.jsx 1 #targetengine "yourName" 2 app.addEventListener ("afterOpen", function (ev){

    3 alert("瀧くん…"); 4 }); afterOpenイベン トをそのまま利用するだけだと2回実行される。 イベントリスナー afterOpen ち ょ っぴりデモンストレーション
  17. 52 yourNameAtOnce.jsx 1 #targetengine "yourName" 2 app.addEventListener ("afterOpen", function (ev){

    3 if (parseInt(app.version, 10) >= 7 && 4 ev.target.constructor.name === "Document") return; 5 alert("瀧くん…"); 6 }); parseInt(app.version, 10) >= 7 …InDesignのバージョンがCS5以上の場合 ev.target.constructor.name === "Document" …開かれた対象がDocumentの場合   (ちなみに、 2回目はLayoutWindowで呼ばれている) 1 度だけ実行する afterOpen イベント