説明
PDFに文書レベルのAcrobat JavaScript を追加します。追加したAcrobat JavaScriptの実行はしません。
形式
void AddDocJavascript (LPCTSTR bstrScriptName,
LPCTSTR bstrTheScript);
引数
- 第一引数 (LPCTSTR bstrScriptName) :
文書レベルの関数名。半角の英数字の文字列。 - 第二引数 (LPCTSTR bstrTheScript) :
Acrobat JavaScript コードが入った文字列。タブはChr(9)、改行はChr(13)を使います。
戻り値
- 無し。よって、追加が成功したかは判らない。
動作するバージョン
| 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:https://pdf-file.nnn2.com/)のみしかPDF文書を表示出来ないようにします。PDF の全ページにページ全体を隠すようなテキストボックスを追加します。そして文書レベルのAcrobat JavaScript を追加して 、追加した全テキストボックスを制御させます。
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
実行結果: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 解説
OLE Automation / AFormAut / AddDocJavascript (公式サイト・英語)
< 戻る >


