xlogI125’s blog

パソコン作業を効率化したい

Acrobat Reader: 長方形の対角線位置に直線を追加

バツ印に見える注釈を作成したいので、長方形の対角線位置に直線を追加する方法を考える。

// テスト環境: Acrobat Reader (2024年3月頃), Windows 11
// ファイル名: %APPDATA%\Adobe\Acrobat\Privileged\DC\JavaScripts\test.js
// エンコード: ANSI

// 起動時に毎回JavaScriptデバッガーを表示
console.show();
console.println("// コンソールでの実行はテキストを範囲選択して Ctrl + Enter");
console.println("// app.getPath('user', 'javascript');");
// #=> /C/Users/xxx/AppData/Roaming/Adobe/Acrobat/Privileged/DC/JavaScripts

// メニューに登録
app.addSubMenu({ cParent: "Help", nPos: 0, cName: "MyTest", cUser: "テスト" });
app.addSubMenu({ cParent: "Help", nPos: 1, cName: "-",      cUser: ""       });

app.addMenuItem({
  cParent: "MyTest", 
  cName  : "MyTestShowConsole", 
  cUser  : "コンソールを表示", 
  cEnable: "event.rc = true;", 
  cExec  : "(() => { console.show(); })();"
});

app.addMenuItem({
  cParent: "MyTest", 
  cName  : "-", 
  cExec  : ""
});

app.addMenuItem({
  cParent: "MyTest", 
  cName  : "MyTestShowAnnotProps", 
  cUser  : "注釈のプロパティを表示", 
  cEnable: "event.rc = (event.target != null);", 
  cExec  : util.printf("(%s)();", (() => {
    console.clear();
    const annots = this.selectedAnnots;
    if (annots === undefined) return;
    var str = "";
    annots.forEach((annot, i) => {
      const prop = annot.getProps();
      for (name in prop) {
        switch (name) {
          case "points":
            var x1mm = prop[name][0][0] * 25.4 / 72;
            var y1mm = prop[name][0][1] * 25.4 / 72;
            var x2mm = prop[name][1][0] * 25.4 / 72;
            var y2mm = prop[name][1][1] * 25.4 / 72;
            str += util.printf("%02d %s : [[%.1f, %.1f], [%.1f, %.1f]] // mm\r", i, name, x1mm, y1mm, x2mm, y2mm);
            break;
          case "popupRect":
          case "rect":
            if (prop[name] !== undefined) {
              var x1mm = prop[name][0] * 25.4 / 72;
              var y1mm = prop[name][1] * 25.4 / 72;
              var x2mm = prop[name][2] * 25.4 / 72;
              var y2mm = prop[name][3] * 25.4 / 72;
              str += util.printf("%02d %s : [%.1f, %.1f, %.1f, %.1f] // mm\r", i, name, x1mm, y1mm, x2mm, y2mm);
              break;
            }
          default:
            str += util.printf("%02d %s : %s\r", i, name, prop[name]);
        }
      }
    });
    console.println(str);
    console.show();
  }).toString())
});

app.addMenuItem({
  cParent: "MyTest", 
  cName  : "-", 
  cExec  : ""
});

app.addMenuItem({
  cParent: "MyTest", 
  cName  : "MyTestAddLine", 
  cUser  : "長方形の対角線位置に直線を追加", 
  cEnable: "event.rc = (event.target != null);", 
  cExec  : util.printf("(%s)();", (() => {
    // 選択された注釈を取得
    const annots = this.selectedAnnots;
    if (annots === undefined) return;
    annots.forEach(annot => {
      switch (annot.type) {
        case "Square"  : break; // 長方形
        case "FreeText": break; // テキストボックス
        default        : return;
      }
      // 形状が長方形である注釈のプロパティを取得
      const propRect = annot.getProps();
      // 線のプロパティを設定
      var propLine = {
        type        : "Line", 
        page        : propRect.page, 
        points      : [[0, 0], [1, 1]], 
        doCaption   : false, 
        leaderExtend: 0, 
        leaderLength: 0, 
        // 表示方法
        arrowBegin : "None", 
        arrowEnd   : "None", 
        style      : "S", 
        width      : propRect.width, 
        strokeColor: propRect.strokeColor, 
        fillColor  : propRect.fillColor, 
        opacity    : propRect.opacity, 
        // 一般
        author : propRect.author, 
        subject: propRect.subject, 
        modDate: propRect.modDate, 
        // ロックなど
        lock: false, readOnly: false, hidden: false, noView: false, toggleNoView: false, print: true, delay: false
      };
      // 線を追加
      const annotLine1 = this.addAnnot(propLine);
      const annotLine2 = this.addAnnot(propLine);
      // 線の座標を変更
      const [x1, y1, x2, y2] = propRect.rect;
      annotLine1.points = [[x1, y1], [x2, y2]];
      annotLine2.points = [[x1, y2], [x2, y1]];
    });
  }).toString())
});