コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

031.【ID】フォルダ内の全inddの代替字形をチェック

書いたコード

var folderObj = Folder.selectDialog("フォルダを選択してください");
var myFiles = folderObj.getFiles("*.indd");
var myResultsTxt = "";
var errTxt = "";
var errCnt = 0;
var errPath = folderObj.fsName + "/代替字形.txt";

app.findGrepPreferences = NothingEnum.nothing;<200b>
app.changeGrepPreferences = NothingEnum.nothing;

var myProfile = app.preflightProfiles[0].duplicate();
myProfile.preflightProfileRules.item("ADBE_MissingGlyph").flag = PreflightRuleFlag.RETURN_AS_ERROR;

for (var i = 0; i < myFiles.length; i++) {
  app.open(myFiles[i]);
  var myDoc = app.activeDocument;
  var myProcess = app.preflightProcesses.add(myDoc, myProfile);
  myProcess.waitForProcess();
  var myResults = myProcess.processResults;
  if (myResults !== "None\r\n") {
    var tmpErr = findMissingGlyph();
    if (tmpErr !== "") {
      errCnt = errCnt + 1;
      errTxt = errTxt + "【" + myDoc.name + "】\n" + tmpErr + "\n----------------\n\n";
    }
  }
  myProcess.remove();
  myDoc.close();
}

app.findGrepPreferences = NothingEnum.nothing;<200b>
app.changeGrepPreferences = NothingEnum.nothing;

if (errCnt > 0) {
  var errObj = new File(errPath);
  errObj.open("w");
  errObj.write(errTxt);
  errObj.close(SaveOptions.NO);
  alert(errCnt + "ファイルで代替字形が見つかりました。");
} else {
  alert("大丈夫だ、問題ない。");
}

myProfile.remove()


function findMissingGlyph() {
  var errP = "";
  var myResultsArr = myProcess.aggregatedResults;
  for (var j = 0; j < myResultsArr[2].length; j++) {
    if (myResultsArr[2][j][0] === 3) {
      if (myResultsArr[2][j][3].indexOf("問題: フォントに元のファイルで指定された字形がありません。") === 0) {
        var tgtPageName = myResultsArr[2][j][2];
        var tgtPage = myDoc.pages.itemByName(tgtPageName);
        var tmpNum = myResultsArr[2][j][1].indexOf(">");
        var tgtCharCode = myResultsArr[2][j][1].substring(12, tmpNum); // <unassigned-1F338> (UID : 1f338)
        tgtCharCode = "\\x{" + tgtCharCode + "}";
        app.findGrepPreferences.findWhat = tgtCharCode;
        for (var k = 0; k < tgtPage.textFrames.length; k++) {
          var tgts = tgtPage.textFrames[k].findGrep();
          for (var l = 0; l < tgts.length; l++) {
            try {
              tgts[l].createOutlines();
              app.undo();
            } catch (e) {
              tgts[l].fillColor = myDoc.swatches.itemByName("確認");
              errP = tgtPageName + "ページ\n";
            }
          }
        }
      }
    }
  }
  return errP;
}

メモ

積み残し

  • 同じ文字が複数箇所で代替字形となっている場合、何度も同じ処理をしてしまうことになる。 Grep検索をする前にあらかじめプリフライト結果を全て検査して、tgtCharCodeを重複の無いかたちで配列に入れておく。
  • 確認用のPDFを書き出す処理追加。
  • 確認スウォッチが無かった場合に作成する処理追加。
  • サロゲートペアがどうなるか未確認。

参考