xlogI125’s blog

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

Acrobat JavaScript練習 注釈(Stamp)

メモ

  • スタンプの座標指定で困った場合の対応案
    • ページを再印刷するか書き出した画像からPDFを新規作成する
      • ページ回転を0度にしてページボックスも新規作成時の状態にする
  • 単純に複合機での印刷時の見た目だけを整えれば済む場合は透かしを検討する

使い捨てスクリプト

選択されたスタンプのAPを表示

  • app.response のテキストボックス部分に this.selectedAnnots[0].AP を表示する
// Acrobat Standard DC (2022年11月頃), Windows 11

// [保存先フォルダ]
//  %APPDATA%\Adobe\Acrobat\Privileged\DC\JavaScripts\
// [ファイル名]
//  testGetStampAP.js
// [エンコード]
//  ANSI

// 選択されたスタンプのAPを表示
var str = "(" + (() => {
  try {
    const annot = this.selectedAnnots[0];
    const rect = annot.rect.map(x => (25.4/72)*x);

    // APの文字列をコピーしやすいので app.response で表示する
    app.response({
      cTitle: "this.selectedAnnots[0]", 
      cQuestion: 
        "type:\r" + 
        annot.type + "\r\r" + 
        "ページ回転:\r" + 
        this.getPageRotation(this.pageNum) + "\r\r" + 
        "注釈回転:\r" + 
        annot.rotate + "\r\r" + 
        "(rect[0], rect[1]), (rect[2], rect[3]) [mm]:\r" + 
        util.printf(
          "(%.2f, %.2f), (%.2f, %.2f)", rect[0], rect[1], rect[2], rect[3]
        ) + "\r\r" + 
        "rect[2] - rect[0], rect[3] - rect[1] [mm]:\r" + 
        util.printf(
          "%.2f, %.2f", rect[2] - rect[0], rect[3] - rect[1]
        ), 
      cLabel: "AP:", 
      cDefault: annot.AP
    });
  }
  catch(e){
  }
}).toString() + ")();";

app.addMenuItem({
  cName: "TestGetNamedAppearanceOfTheStamp", 
  cUser: "選択されたスタンプのAPを表示", 
  cParent: "View", 
  nPos: 0, 
  cExec: str, 
  cEnable: "event.rc = (event.target != null)", 
  cMarked: "event.rc = false", 
  bPrepend: true
});

スタンプの貼り付け

  • default user space がよく分からないので次の内容を仮定する
    • ページは回転0度
    • 座標は注釈、MediaBox、CropBoxとで原点(0,0)の位置は同じ
// Acrobat Standard DC (2022年11月頃), Windows 11

// JavaScript デバッガー の
// コンソールから実行(範囲選択して Ctrl + Enter)

(() => {
  // AP
  const myAP = "Approved";

  // 注釈の座標 (default user space)
  const [x1, y1, x2, y2] = [10, 20, 110, 45.57].map(x => (72/25.4)*x);

  // 注釈の回転
  const myRotate = 0;

  const doc = this;
  const annotStamp = doc.addAnnot({
    page: 0, type: "Stamp", 
    AP: myAP, 
    rect: [x1, y1, x2, y2], rotate: myRotate, 

    // 表示方法
    strokeColor: ["RGB", 192/255, 0/255, 0/255], 
    opacity: 1.00, 

    // 一般
    author: "作成者", subject: "タイトル", 
    modDate: util.scand("yyyy/mm/dd HH:MM:ss", "2022/01/23 12:34:56"), 

    lock: false, readOnly: false, 
    hidden: false, noView: false, toggleNoView: false, 
    print: true, delay: false
  });
})()

VBAでパスを取得(app.getPath)

' Excel 2019, Acrobat Standard DC (2022年11月頃), Windows 11
' 参照設定: Acrobat (Adobe Acrobat 10.0 Type Library)

Option Explicit

Public Sub Main()
  ' Dim pdDoc As Acrobat.AcroPDDoc
  Dim pdDoc As Object

  Dim fileName As String
  Dim jso As Object
  Dim pathAcroUsrRoot As String
  Dim pathAcroUsrJS As String
  Dim pathAcroUsrStamp As String

  fileName = VBA.Interaction.Environ("USERPROFILE") & "\Desktop\文書.pdf"

  Set pdDoc = VBA.Interaction.CreateObject("AcroExch.PDDoc")

  ' PDFファイルを開く
  If Not pdDoc.Open(fileName) Then
    Set pdDoc = Nothing
    Exit Sub
  End If

  Set jso = pdDoc.GetJSObject()

  ' パスを取得
  pathAcroUsrRoot = jso.app.getPath("user", "root")
  pathAcroUsrJS = jso.app.getPath("user", "javascript")
  pathAcroUsrStamp = jso.app.getPath("user", "stamps")

  Set jso = Nothing

  ' PDFファイルを閉じる
  If Not pdDoc.Close() Then
    Debug.Print "pdDoc.Close(): False"
  End If

  Set pdDoc = Nothing

  Debug.Print "Root:" + VBA.Constants.vbCrLf + pathAcroUsrRoot
  Debug.Print "JavaScript:" + VBA.Constants.vbCrLf + pathAcroUsrJS
  Debug.Print "Stamps:" + VBA.Constants.vbCrLf + pathAcroUsrStamp

End Sub

過去記事

dy100ms.hatenadiary.jp