TOP > AFormAut > Fields.AddDocJavascript メソッド
説明
PDF に文書レベルのAcrobat JavaScript を追加します。
形式
void AddDocJavascript (LPCTSTR bstrScriptName,
LPCTSTR bstrTheScript);
引数
- 第一引数 (LPCTSTR bstrScriptName) :
文書レベルの関数名。
半角の英数字の文字列。 - 第二引数 (LPCTSTR bstrTheScript) :
Acrobat JavaScript コードが入った文字列。
タブはChr(9)、改行はChr(13)を使う。
戻り値
- 無し。
よって、追加が成功したかは判らない。
動作するバージョン
Adobe Acrobat | 結果 | 備考 |
---|---|---|
4 | NO | 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 を追加して 、追加した全テキストボックスを制御させます。
- F8 キーでステップ実行しながら動作確認します。
- 事前に 参照設定(AFormAutの追加版) が必要です。
変数の宣言 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('https://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('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
実行結果:WEBブラウザで表示されたPDF
ココをクリックすると以下のPDFがWEBブラウザで表示されます。
※WEB ブラウザ 画面 : PDFの内容が見れる。
※Windows PC内で表示 : PDFの内容は見れない。
注意
- 「CreateObject("AFormAut.App")」を実行するには事前にAcrobatアプリケーションをメモリ上にロードして置かないと実行エラー(ランタイムエラー)になりやすくなります。
その為に早めに「objAcroApp.CloseAllDocs」を実行して、メモリにロードします。
これはテスト結果で判った事です。SDK等では未調査です。 - 「Set objAFormFields = objAFormApp.Fields」を実行するには
「objAcroAVDoc.Open」で該当するPDFファイルをオープンしておく必要があります。
「objAcroPDDoc.Open」ではダメです。 - AddDocJavascript メソッド実行時に追加される文書レベルのAcrobat JavaScript がVBA上で実行されます。
実行されても良いロジックにJavaScript コードをしておく必要があります。 - 備考にも書きましたが、JavaScript で
「}else if(sPath.substr(0,7)=='/C/web/'){」
の判断処理ロジック部分を削除する事により、
特定のWEBのURLからしか表示できなくなります。
備考
- 既にPDFに同名称の文書レベルのAcrobat JavaScvript が存在すると上書きされます。
- 「objAFormFields.Add」は同じ名称のテキストフィールドが存在すると上書きされます。
エラーにはなりません。 - 追加するAcrobat JavaScriptで
「}else if(sPath.substr(0,7)=='/C/web/'){」
の部分は判断は、運用上は必要無い部分と判断できれば、
削除しても構いません。
削除する事により、セキュリティ上のレベルは上がります。
Acrobat JavaScript メモ
- this.path プロパティの値はパソコンのドライブレター(C:ドライブ等)を取得する時は注意が必要です。
- VBA内のAcrobat JavaScript 追加した時は
“/c/web/sample_new.pdf” <- C ドライブ文字が小文字 - パソコンのフォルダからPDFを開く時は
“/C/web/sample_new.pdf” <- C ドライブ文字が大文字
- VBA内のAcrobat JavaScript 追加した時は
- 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
http://livedocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=IAC_API_FormsIntro.107.43.html&accessible=truehttp://partners.adobe.com/public/developer/en/acrobat/sdk/FormsAPIReference.pdf#nameddest=G14.1031319
< 戻る >