コモノExtendScript100本ノック

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

035.【ID】版面に合っていないテキストフレームを探す

書いたコード

// 横組み限定
var doc = app.activeDocument;
var ro = app.activeDocument.viewPreferences.rulerOrigin;
app.activeDocument.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN;
pl: for (var i = 0; i < doc.pages.length; i++) {
  if (i % 2 === 0) {
    var tmpxLefts = getEvenPInfo(i)[0];
    var tmpxRights = getEvenPInfo(i)[1];
    var tmpyTop = getEvenPInfo(i)[2];
    var tmpyBottom = getEvenPInfo(i)[3];
  } else {
    var tmpxLefts = getOddPInfo(i)[0];
    var tmpxRights = getOddPInfo(i)[1];
    var tmpyTop = getEvenPInfo(i)[2];
    var tmpyBottom = getEvenPInfo(i)[3];
  }
  for (var j = 0; j < doc.pages[i].textFrames.length; j++) {
    if (!existInArr(tmpxLefts, roundFp(doc.pages[i].textFrames[j].geometricBounds[1], 3))) { // [ y1, x1, y2, x2 ]
      $.writeln((i + 1) + "ページ 左 " + roundFp(doc.pages[i].textFrames[j].geometricBounds[1], 3))
    }
    if (!existInArr(tmpxRights, roundFp(doc.pages[i].textFrames[j].geometricBounds[3], 3))) {
      $.writeln((i + 1) + "ページ 右 " + roundFp(doc.pages[i].textFrames[j].geometricBounds[3], 3))
    }
    if (roundFp(doc.pages[i].textFrames[j].geometricBounds[0], 3) !== tmpyTop) {
      $.writeln((i + 1) + "ページ 天 " + roundFp(doc.pages[i].textFrames[j].geometricBounds[0], 3) + "/" + tmpyTop)
    }
    if (roundFp(doc.pages[i].textFrames[j].geometricBounds[2], 3) !== tmpyBottom) {
      $.writeln((i + 1) + "ページ 地 " + roundFp(doc.pages[i].textFrames[j].geometricBounds[2], 3) + "/" + tmpyBottom)
    }
  }
}
app.activeDocument.viewPreferences.rulerOrigin = ro;

function getEvenPInfo(p) {
  var refP = doc.pages[p];
  var pBounds = refP.bounds; // [y1, x1, y2, x2]
  var pHeight = pBounds[2] - pBounds[0];
  var pWidth = pBounds[3] - pBounds[1];
  var margin = refP.marginPreferences.properties; // {top:0,left:0,bottom:0,right:0}
  var yTop = margin.top;
  var yBottom = roundFp(pHeight - margin.bottom, 3);
  var gridWidth = pWidth - (margin.left + margin.right);
  var clCnt = refP.marginPreferences.columnCount;
  var clGttr = refP.marginPreferences.columnGutter;
  var clWidth = (gridWidth - clGttr * (clCnt - 1)) / clCnt; // 1段の幅
  var xLefts = [roundFp(margin.left, 3)];
  var xRights = [roundFp(xLefts[0] + clWidth, 3)];
  // マージン設定は小数点以下3桁まで指定できる
  for (var i = 0, tmpCnt = clCnt - 1; i < tmpCnt; i++) {
    xLefts.push(roundFp(xLefts[i] + (clWidth + clGttr), 3));
    xRights.push(roundFp(xLefts[i + 1] + clWidth, 3));
  }
  var pInfo = [xLefts, xRights, yTop, yBottom];
  return pInfo;
}

function getOddPInfo(p) {
  var refP = doc.pages[p];
  var pBounds = refP.bounds; // [y1, x1, y2, x2]
  var pHeight = pBounds[2] - pBounds[0];
  var pWidth = pBounds[3] - pBounds[1];
  var margin = refP.marginPreferences.properties; // {top:0,left:0,bottom:0,right:0}
  var yTop = margin.top;
  var gridWidth = pWidth - (margin.left + margin.right);
  var clCnt = refP.marginPreferences.columnCount;
  var clGttr = refP.marginPreferences.columnGutter;
  var clWidth = (gridWidth - clGttr * (clCnt - 1)) / clCnt; // 1段の幅
  var xLefts = [roundFp(margin.right, 3)];
  var xRights = [roundFp(xLefts[0] + clWidth, 3)];
  for (var i = 0, tmpCnt = clCnt - 1; i < tmpCnt; i++) {
    xLefts.push(roundFp(xLefts[i] + (clWidth + clGttr), 3));
    xRights.push(roundFp(xLefts[i + 1] + clWidth, 3));
  }
  var pInfo = [xLefts, xRights, yTop];
  return pInfo;
}

function existInArr(arr, tgt) {
  var arrLen = arr.length;
  for (var p = 0; p < arrLen; p++) {
    if (arr[p] === tgt) {
      return true;
    }
  }
}
// 
function roundFp(num, digit) {
  var tmp = Math.pow(10, digit);
  result = Math.round(num * tmp) / tmp;
  return result;
}

メモ

分かったこと

  • marginPreferences.propertiesは四方のマージンを一括で設定することを可能にするもの。
    各要素の値はmarginPreferences.top/left/bottom/rightと同じ。

積み残しというかなんというか

  • びみょ~に版面からずれてるんだよね、みたいなのを拾いたかったんだが、丸め処理をかけたら拾えない。
    版面にフィットさせるスクリプトを書くべきだったのでは?
  • 縦組み対応

参考