AFormAut : Fields.AddDocJavascript メソッド

TOP > AFormAut > Fields.AddDocJavascript メソッド


説明

PDF に文書レベルのAcrobat JavaScript を追加します。

形式

void AddDocJavascript (LPCTSTR bstrScriptName, 
                       LPCTSTR bstrTheScript);

引数

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

戻り値

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

動作するバージョン

Adobe 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)のみしかPDF文書を表示出来ないようにします。

・PDF の全ページにページ全体を隠すようなテキストボックスを追加します。

・そして文書レベルのAcrobat JavaScript を追加して 、追加した全テキストボックスを制御させます。

変数の宣言 Integer は Long でご使用ください。

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


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 


追加されたAcrobat JavaScript

//hogehidden(false); //保護用のテキスト表示
var sPath = this.path;
//app.alert(sPath); //デバッグ用
if(sPath.indexOf('http://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 解説 URL(英語)

v10.0

  1. http://livedocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=IAC_API_FormsIntro.107.43.html&accessible=true
  2. http://partners.adobe.com/public/developer/en/acrobat/sdk/FormsAPIReference.pdf#nameddest=G14.1031319

戻る

コメントを残す

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

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

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

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

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