AFormAut : AddDocJavascript メソッド

TOP > AFormAut > *


説明

PDFに文書レベルのAcrobat JavaScript を追加します。追加したAcrobat JavaScriptの実行はしません。

形式

void AddDocJavascript (LPCTSTR bstrScriptName, 
                       LPCTSTR bstrTheScript);

引数

  1. 第一引数 (LPCTSTR bstrScriptName) :
    文書レベルの関数名。半角の英数字の文字列。
  2. 第二引数 (LPCTSTR bstrTheScript) : 
    Acrobat JavaScript コードが入った文字列。タブはChr(9)、改行はChr(13)を使います。

戻り値

  • 無し。よって、追加が成功したかは判らない。

動作するバージョン

Acrobat結果備考
4NO Acrobat 4.0 ※Windows 98SE + Excel 2000  *1
※古いPDFのバージョンはOK!
5 NO Acrobat 5.0.5 + Excel 2003  *1
※古いPDFのバージョンはOK
6 NO Acrobat 6.0.6 Pro + Excel 2003 *1
※古いPDFのバージョンはOK
7 OK Acrobat 7.1.4 Pro + Excel 2003
8 NO Acrobat 8.3.1 Pro + Excel 2003
※当Acrobatバージョンでは全面的に不可
9 NO Acrobat 9.5.2 Extended + Excel 2003
※当Acrobatバージョンでは全面的に不可
10 OK Acrobat X (10.1.4) Extended + Excel 2003
11 OK Acrobat XI (11.0) Extended + Excel 2003
  • OK : 正常処理します。
  • NO : 動作しない。 又は実行時にエラーになります。
  • *1 : 「PDF のバージョン」によっては正常処理出来ない場合があります。

サンプル:Excel のVBA

特定のWEB(URL:https://pdf-file.nnn2.com/)のみしかPDF文書を表示出来ないようにします。PDF の全ページにページ全体を隠すようなテキストボックスを追加します。そして文書レベルのAcrobat JavaScript を追加して 、追加した全テキストボックスを制御させます。

  • 参照設定がコレコレが必要です。
  • F8 キーでステップ実行しながら動作確認します。
Download:  /p764_AFormAut-AddDocJavascript.zip ( 27.9 KB )

 

001 Option Explicit 002 003 Private msMsg As String 'メッセージ 004 ' VBA RunTime Error 対応用 005 Private miErrorNo As Long 'Err.Number の内容 006 Private msErrorMsg As String 'Err.Description の内容 007 008 Const PDSaveFull = &H1 009 Const PDSaveLinearized = &H4 010 Const PDSaveCollectGarbage = &H20 011 012 '************************************************** 013 ' 処理 :特定のWEB(URL)のみしかPDF文書を 014 ' 表示出来ないようにします。 015 ' AFormAut :AFormAut / 016 ' AddDocJavascript メソッドのサンプル 017 ' Create :2026/03/22 018 ' Update :2026/03/22 019 ' Vertion :1.0.1 020 '************************************************** 021 Sub AddDocJavascript_Test_04() 022 On Error GoTo Err_AddDocJavascript_Test_04: 023 024 '▼メモリ上のAcrobatプロセスを確認する 025 If iCheckAcrobat() > 0 Then 026 msMsg = "Acrobatが動いています。" _ 027 & vbCrLf & "処理を中断します。" & vbCrLf _ 028 & vbCrLf & "この後でAcrobatの終了を試みます。" 029 MsgBox msMsg, vbCritical, "実行の中断" 030 'Acrobat OLEの終了を試みる 031 Call EndAcrobat 032 Exit Sub 033 End If 034 035 Dim i As Integer 036 Dim iPageNum As Integer 037 Dim bRet As Boolean 038 Dim bEnd As Boolean 039 Dim strFilePath_new As String 040 Dim strJavaScript As String 041 Dim c9 As String 042 Dim c13 As String 043 044 '初期値 045 Const sFilePath = "D:\Work\sample.pdf" 046 c9 = Chr(9) 'タブ 047 c13 = Chr(13) '改行 048 bEnd = True 049 050 'Acrobatオブジェクトの定義&作成 051 Dim objAFormApp As New AFORMAUTLib.AFormApp 052 Dim objAFormFields As AFORMAUTLib.Fields 053 Dim objAFormField As AFORMAUTLib.Field 054 055 'Acrobat 4,5,6 の時 056 ' Dim objAcroApp As Acrobat.CAcroApp 057 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc 058 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc 059 ' Dim objAcroPDPage As Acrobat.CAcroPDPage 060 ' Dim objAcroPoint As Acrobat.CAcroPoint 061 ' Set objAcroAVDoc = CreateObject("AcroExch.App") 062 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 063 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc") 064 065 'Acrobat 7,8,9,10,11 の時 066 Dim objAcroApp As New Acrobat.AcroApp 067 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 068 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 069 Dim objAcroPDPage As Acrobat.AcroPDPage 070 Dim objAcroPoint As Acrobat.AcroPoint 071 072 '※[429 ActiveXコンポーネントはオブジェクトを作成できません。] 073 '※回避用 / メモリにAcrobatを強制ロードさせる 074 objAcroApp.CloseAllDocs 075 076 '事前チェック 077 If Dir$(sFilePath) = "" Then 078 MsgBox sFilePath & vbCrLf & _ 079 "ファイルが存在しません。", _ 080 vbOKOnly + vbCritical, "エラー" 081 bEnd = False 082 GoTo Skip_AddDocJavascript_Test_04: 083 End If 084 085 '------------------------------------------------- 086 '一旦、PDFファイルを別フォルダへ別名保存 087 088 strFilePath_new = Replace(sFilePath, "\work\", "\web\") 089 'PDFファイルのファイル名を変更する 090 strFilePath_new = Replace(strFilePath_new, ".pdf", "_new.pdf") 091 092 bRet = objAcroPDDoc.Open(sFilePath) 093 If bRet = False Then 094 MsgBox sFilePath & vbCrLf & _ 095 "ファイルが PDDoc.Open 出来ません。", _ 096 vbOKOnly + vbCritical, "エラー(S)" 097 bEnd = False 098 GoTo Skip_AddDocJavascript_Test_04: 099 End If 100 '別名で保存。存在する場合は上書き保存する。 101 bRet = objAcroPDDoc.Save(PDSaveFull, strFilePath_new) 102 If bRet = False Then 103 MsgBox "PDFファイルを PDDoc.Save 出来ません。", _ 104 vbOKOnly + vbCritical, "エラー(S)" 105 bEnd = False 106 GoTo Skip_AddDocJavascript_Test_04: 107 End If 108 '一旦閉じる 109 bRet = objAcroPDDoc.Close 110 If bRet = False Then 111 MsgBox "PDFファイルを PDDoc.Close 出来ません。", _ 112 vbOKOnly + vbCritical, "エラー(S)" 113 bEnd = False 114 GoTo Skip_AddDocJavascript_Test_04: 115 End If 116 117 '------------------------------------------------- 118 '処理対象のPDFファイルを開く 119 120 '※objAFormApp.Fieldsを実行するには 121 '※AVDocオブジェクトを開いておく必要がある。 122 bRet = objAcroAVDoc.Open(strFilePath_new, "") 123 If bRet = False Then 124 MsgBox strFilePath_new & vbCrLf & _ 125 "ファイルが AVDoc.Open 出来ません。", _ 126 vbOKOnly + vbCritical, "エラー" 127 bEnd = False 128 GoTo Skip_AddDocJavascript_Test_04: 129 End If 130 131 'PDFのページ数を取得 132 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc 133 iPageNum = objAcroPDDoc.GetNumPages 134 135 'Fieldsオブジェクトの作成 136 Set objAFormFields = objAFormApp.Fields 137 138 '------------------------------------------------- 139 For i = 0 To iPageNum - 1 140 141 'PDFページサイズを取得 142 Set objAcroPDPage = objAcroPDDoc.AcquirePage(i) 143 Set objAcroPoint = objAcroPDPage.GetSize 144 145 'PDFの指定ページにテキストフィールドを追加 146 '※ページ全体を覆うテキストボックス作成 147 Set objAFormField = _ 148 objAFormFields.Add("Text" & (i + 1), "text", _ 149 i, 0, objAcroPoint.y, objAcroPoint.x, 0) 150 151 'テキストフィールドの設定 152 With objAFormField 153 .SetBackgroundColor "RGB", 1, 1, 1, 0 154 .Alignment = "center" 155 .TextFont = "HeiseiMin-W3-UniJIS-UCS2-H" 156 .Value = "閲覧不可" '表示する文字 157 .IsReadOnly = True '読み込み専用 158 .IsHidden = False '表示する 159 End With 160 161 '設定後に開放 162 Set objAFormField = Nothing 163 164 Next 165 166 '------------------------------------------------- 167 'Acrobat JavaScriptを編集する 168 strJavaScript = _ 169 "//hogehidden(false); //保護用のテキスト表示" & c13 & _ 170 "var sPath = this.path;" & c13 & _ 171 "//app.alert(sPath); //デバッグ用" & c13 172 strJavaScript = strJavaScript & _ 173 "if(sPath.indexOf('https://pdf-file.nnn2.com/')==0){" & c13 & _ 174 c9 & "//このURL上なら閲覧可とする" & c13 & _ 175 c9 & "hogehidden(true); //保護用のテキスト非表示" & c13 & _ 176 c9 & "//app.alert('web表示'); //デバッグ用" & c13 & _ 177 "}else if(sPath.substr(0,7)=='/c/web/'){" & c13 & _ 178 c9 & "//VBAでJavaScript追加時" & c13 & _ 179 c9 & "//app.alert('VBAでJavaScript追加時'); //デバッグ用" & c13 & _ 180 "}else if(sPath.substr(0,7)=='/C/web/'){" & c13 & _ 181 c9 & "//PCの表示フォルダは閲覧可とする" & c13 & _ 182 c9 & "//ココは無くても良い" & c13 & _ 183 c9 & "hogehidden(true); //保護用のテキスト非表示" & c13 & _ 184 c9 & "//app.alert('PCの表示フォルダ'); //デバッグ用" & c13 & _ 185 "}else{" & c13 & _ 186 c9 & "app.alert('閲覧は許可されていません。');" & c13 & _ 187 c9 & "//強制的に閉じる" & c13 & _ 188 c9 & "this.closeDoc();" & c13 & _ 189 "}" & c13 190 strJavaScript = strJavaScript & _ 191 "//ページ上にある保護用テキストの表示を全制御" & c13 & _ 192 "//this.getField('Text*').hidden = true で非表示" & c13 & _ 193 "function hogehidden(sethidden){" & c13 & _ 194 c9 & "var iCnt = this.numPages; //総ページ数:1から" & c13 & _ 195 c9 & "for(var i=0;i<iCnt;i++){" & c13 & _ 196 c9 & c9 & _ 197 "if (this.getField('Text'+(i+1)).hidden != sethidden){" & c13 & _ 198 c9 & c9 & c9 & _ 199 "this.getField('Text'+(i+1)).hidden = sethidden;" & c13 & _ 200 c9 & c9 & "}" & c13 & _ 201 c9 & "}" & c13 & _ 202 "}" 203 204 'PDFへ文書レベルのJavaScriptを追加する 205 '注意:追加されたJavaScriptがこの時点で一度実行される 206 objAFormFields.AddDocJavascript "hoge", strJavaScript 207 208 '最適化して上書き保存する 209 '※追加されたJavaScriptはココでは実行されない 210 bRet = objAcroPDDoc.Save(PDSaveFull + _ 211 PDSaveLinearized + PDSaveCollectGarbage, _ 212 strFilePath_new) 213 If bRet = False Then 214 MsgBox "PDFファイルへ PDDoc.Save 出来ません。", _ 215 vbOKOnly + vbCritical, "エラー" 216 bEnd = False 217 End If 218 219 Skip_AddDocJavascript_Test_04: 220 On Error Resume Next 221 '強制でPDFを閉じます。 222 bRet = objAcroPDDoc.Close 223 bRet = objAcroAVDoc.Close(1) 224 bRet = objAcroApp.CloseAllDocs 225 'Acrobatアプリケーションの強制終了 226 objAcroApp.Hide 227 objAcroApp.Exit 228 'オブジェクトの強制開放 229 Set objAFormFields = Nothing 230 Set objAFormField = Nothing 231 Set objAFormApp = Nothing 232 Set objAcroAVDoc = Nothing 233 Set objAcroPDDoc = Nothing 234 Set objAcroPDPage = Nothing 235 Set objAcroPoint = Nothing 236 Set objAcroApp = Nothing 237 238 If bEnd = True Then 239 MsgBox "処理は正常に終了しました。", _ 240 vbOKOnly + vbInformation, "正常終了" 241 End If 242 Exit Sub 243 244 Err_AddDocJavascript_Test_04: 245 '実行時のエラーメッセージを表示 246 MsgBox Err.Number & vbCrLf & Err.Description, _ 247 vbOKOnly + vbCritical, "実行時のエラー" 248 bEnd = False 249 GoTo Skip_AddDocJavascript_Test_04: 250 End Sub 251 252 '********************************************* 253 ' メモリ上のAcrobatプロセスを数える。 254 '********************************************* 255 Private Function iCheckAcrobat() As Long 256 On Error GoTo skip_iCheckAcrobat: 'VBA実行時エラー 257 Dim items As Object 258 Set items = CreateObject("WbemScripting.SWbemLocator") _ 259 .ConnectServer.ExecQuery( _ 260 "Select * From Win32_Process " & _ 261 "Where Name = 'Acrobat.exe'") 262 '1以上はプロセス有り、0は無し 263 iCheckAcrobat = items.Count 264 Exit Function 265 skip_iCheckAcrobat: 266 miErrorNo = Err.Number 267 msErrorMsg = Err.Description 268 End Function 269 '********************************************* 270 ' メモリ上に残ったAcrobatプロセスを 271 ' 正常に終了させる為だけの処理です。 272 '********************************************* 273 Sub EndAcrobat() 274 On Error Resume Next 275 Dim objAcroApp As New Acrobat.AcroApp 276 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 277 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 278 Dim objAcroPDPage As Acrobat.AcroPDPage 279 Dim objAcroPoint As Acrobat.AcroPoint 280 Dim objAFormApp As New AFORMAUTLib.AFormApp 281 Dim objAFormFields As AFORMAUTLib.Fields 282 Dim objAFormField As AFORMAUTLib.Field 283 284 objAcroApp.CloseAllDocs 285 objAcroApp.Hide 286 objAcroApp.Exit 287 288 Set objAFormField = Nothing 289 Set objAFormFields = Nothing 290 Set objAFormApp = Nothing 291 Set objAcroPoint = Nothing 292 Set objAcroPDPage = Nothing 293 Set objAcroPDDoc = Nothing 294 Set objAcroAVDoc = Nothing 295 Set objAcroApp = Nothing 296 297 '上記の実行後にメモリ上から消える、はず。 298 MsgBox "Acrobat OLEの終了を試みました。" & _ 299 vbCrLf & "10秒後にメモリから消えたのを" & _ 300 vbCrLf & "タスクマネージャーで確認して下さい。", _ 301 vbSystemModal + vbInformation, "お知らせ" 302 End Sub

 

 


追加されたAcrobat JavaScript

//hogehidden(false); //保護用のテキスト表示 var sPath = this.path; //app.alert(sPath); //デバッグ用 if(sPath.indexOf('https://pdf-file.nnn2.com/')==0){ //このURL上なら閲覧可とする hogehidden(true); //保護用のテキスト非表示 //app.alert('web表示'); //デバッグ用 }else if(sPath.substr(0,7)=='/c/web/'){ //VBAでJavaScript追加時 //app.alert('VBAでJavaScript追加時'); //デバッグ用 }else if(sPath.substr(0,7)=='/C/web/'){ //PCの表示フォルダは閲覧可とする //ココは無くても良い hogehidden(true); //保護用のテキスト非表示 //app.alert('PCの表示フォルダ'); //デバッグ用 }else{ app.alert('閲覧は許可されていません。'); //強制的に閉じる this.closeDoc(); } //ページ上にある保護用テキストの表示を全制御 //this.getField('Text*').hidden = true で非表示 function hogehidden(sethidden){ var iCnt = this.numPages; //総ページ数:1から for(var i=0;i<iCnt;i++){ if (this.getField('Text'+(i+1)).hidden != sethidden){ this.getField('Text'+(i+1)).hidden = sethidden; } } }

 

※Acrobat JavaScript 編集画面 Acrobat 7.0 J

AFormAut : Fields.AddDocJavascript メソッド で追加されたJavaScript

実行結果:WEBブラウザで表示されたPDF

ココをクリックすると以下のPDFがWEBブラウザで表示されます。

※WEB ブラウザ 画面 : PDFの内容が見れます。

実行結果:WEBブラウザで表示されたPDF

※Windows PC内で表示 : PDFの内容は見れない。

Windows PC内で表示 : PDFの内容は見れない

注意

  1. 「CreateObject("AFormAut.App")」を実行するには事前にAcrobatアプリケーションをメモリ上にロードして置かないと実行エラー(ランタイムエラー)になりやすくなります。その為に早めに「objAcroApp.CloseAllDocs」を実行して、メモリにロードします。
    これはテスト結果で判った事です。SDKには無い情報です。
  2. 「Set objAFormFields = objAFormApp.Fields」を実行するには
    「objAcroAVDoc.Open」で該当するPDFファイルをオープンしておく必要があります。「objAcroPDDoc.Open」ではダメです。
  3. AddDocJavascript メソッド実行時に追加される文書レベルのAcrobat JavaScript がVBA上で実行されます。実行されても良いロジックにJavaScript コードをしておく必要があります。
  4. 備考にも書きましたが、JavaScript で
    「}else if(sPath.substr(0,7)=='/C/web/'){」
    の判断処理ロジック部分を削除する事により、特定のWEBのURLからしか表示できなくなります。

備考

  1. 既にPDFに同名称の文書レベルのAcrobat JavaScvript が存在すると上書きされます。
  2. 「objAFormFields.Add」は同じ名称のテキストフィールドが存在すると上書きされます。エラーにはなりません。
  3. 追加するAcrobat JavaScriptで
    「}else if(sPath.substr(0,7)=='/C/web/'){」
    の部分は判断は、運用上は必要無い部分と判断できれば、削除しても構いません。削除する事により、セキュリティ上のレベルは上がります。

Acrobat JavaScript メモ

  1. this.path プロパティの値はパソコンのドライブレター(C:ドライブ等)を取得する時は注意が必要です。
    • VBA内のAcrobat JavaScript 追加した時は
      “/c/web/sample_new.pdf” <- C ドライブ文字が文字
    • パソコンのフォルダからPDFを開く時は
      “/C/web/sample_new.pdf” <- C ドライブ文字が文字
  2. Acrobat JavaScript は事前にAcrobat 本体でデバッグ&テストをしておく事があります。

動作確認の環境

  • Acrobat 4.0 + Office 2000
    +  Windows98SE( + WindowsUpdate)
  • Acrobat 5.0.5 + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 6.0.6 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 7.1.4 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP2 + WindowsUpdate)
  • Acrobat 8.3.1 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 9.5.2 Extended + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat X (10.1.4) Extended + Office 2003( + SP3) 
    + WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat XI (11.0) Extended + Office 2003( + SP3)
    + WindowsXP Pro( + SP3 + WindowsUpdate)

Adobe Web 解説

OLE Automation / AFormAut / AddDocJavascript (公式サイト・英語)

戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



お仕事で当サイトを見ている方へ
考え込んだら、ご質問下さい。
一緒に解決策を考えましょう。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください