書いたコード
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);
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を書き出す処理追加。
- 確認スウォッチが無かった場合に作成する処理追加。
- サロゲートペアがどうなるか未確認。
参考