当サンプルの流用は運用上に注意点が有ります。 当記事の下部にある<注意>の4と5を参照してください。
「AFormAut : Fields.AddDocJavascript メソッド」のサンプルを御覧ください。
説明
PDF をWEBブラウザでしか表示できないようにします。
- PDF を指定のURL 又は特定のフォルダからしか見れないようにします。パソコンに保存しても全ページをテキストフィールドで隠して見れないようにします。

- 但し、動作確認出来るよう(デバッグ時用)に指定フォルダのみからは見れるようにします。 (このデバッグ用の機能を外すことも可能です。) 完全に保護出来る訳では無いです。PDF自体にパスワード保護を追加すれば保護は強化されます。
見れない場合の例 ※「表示不可」はページ全体のテキストフィールド
※PDFファイル 全ページへのテキスト・フィールド設定はAFormAut : Fields.Add メソッド のサンプルを参照して下さい。
動作の結果
あくまでも当サイトでの結果です。必ず自分のパソコン環境で動作確認をしてください。
| Adobe Acrobat | 結果 | 結果 備考 |
|---|---|---|
| 4 | NO | Acrobat 4.0 ※Windows 98SE + Excel 2000 *1 |
| 5 | NO | Acrobat 5.0.5 + Excel 2003 |
| 6 | NO | Acrobat 6.0.6 Pro + Excel 2003 |
| 7 | OK | Acrobat 7.1.4 Pro + Excel 2003 *4 |
| 8 | NO | Acrobat 8.3.1 Pro + Excel 2003 *2 *E7 |
| 9 | NO | Acrobat 9.5.2 Extended + Excel 2003 *2 |
| 10 | OK | Acrobat X (10.1.4) Extended + Excel 2003 *3 |
| 11 | OK | Acrobat XI (10.0) Extended + Excel 2003 *3 |
- OK : 正常処理します。
- NO : 動作しない。 又は実行時にエラー(Runtime Error)になります。
- *1 : PDFへ JavaScript の追加は出来ました。しかし JavaScript が実行時にエラーとなります。Acrobat 4.0 バージョンでは「this.URL」JavaScript は「this.URL has no properties」エラーで使えません。
- *2 : 実行時のエラー(Runtime Error)になります。当バージョンではFiledsオブジェクトが作成できません。
-2147220991 現在 Acrobat で文書が開いていません。
- *3 : VBAは正常処理され、PDF は作成されます。
しかしVBAでJavaScript追加時に以下の「・・セキュリティ・・・」画面が表示され、VBAの処理が一時停止します。
この文書は次のサイトに接続しようとしています: このサイトを信頼する場合は「許可」を選択します。信頼しない場合は「ブロック」を選択します。すべてのPDF文書に関してこのサイトに対する操作を記憶
これに関してはAcrobat 本体の環境設定の「セキュリティ(拡張)」に「C:¥work¥」を追加すれば出なくすることが出来ます。
詳細は <注意>の5 を参照して下さい。
- *E4 : 処理前のレジストリに以下を追加する必要があります。
[HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert]
[HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert¥cCheckbox]
"idocNewerVersionWarning"=dword:00000001
上記のレジストリに追加しないとVBA処理中に以下のダイアログボックスが表示され、処理が中断する場合があります。
Adobe Acrobat このファイルには、この Viewer でサポート可能なものより新しい情報が含まれている可能性があります。正しく開いたり表示できない可能性があります。Adobe では、Acrobat 製品の最新バージョンにアップグレードするようおすすめします。http://www.adobe.co.jp/acrobat 以後、このメッセージを表示しない
- *E7 : Windows 7 + Excel 2007 環境で実行エラーになりました。
サンプル:Excel VBA
- F8キーでステップ実行しながら動作確認して下さい。
- 事前に 参照設定(AFormAutの追加版) が必要です。
- サンプルの内容:
- 元のsample.pdf はPDFバージョン 1.3 (Acrobat 4.0互換) を使用
- sample.pdf はC:¥work¥ フォルダに置く
- JavaScript が追加された PDF は C:¥web¥sample_new.pdf に保存する
- JavaScript は文書レベルで追加する
- テストする前に当記事下部の「<注意>」を事前参照。
- 当サンプルを見る前に「
pdfを保存させないようにする」を参照。
/p757_AFormAut-AddDocJavascript.zip ( 25.0 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 '**************************************************
009 ' 処理 :PDFをWEBブラウザでしか表示出来ない様
010 ' する (this.URL使用)のサンプル
011 ' Create :2026/03/22
012 ' Update :2026/03/22
013 ' Vertion :1.0.1
014 '**************************************************
015 Sub AddDocJavascript_Test_01()
016 On Error GoTo Err_AddDocJavascript_Test_01:
017
018 '▼メモリ上のAcrobatプロセスを確認する
019 If iCheckAcrobat() > 0 Then
020 msMsg = "Acrobatが動いています。" _
021 & vbCrLf & "処理を中断します。" & vbCrLf _
022 & vbCrLf & "この後でAcrobatの終了を試みます。"
023 MsgBox msMsg, vbCritical, "実行の中断"
024 'Acrobat OLEの終了を試みる
025 Call EndAcrobat
026 Exit Sub
027 End If
028
029 Dim i As Integer
030 Dim iPageNum As Integer
031 Dim bRet1 As Boolean
032 Dim bRet2 As Boolean
033 Dim bEnd As Boolean
034 Dim strFilePath_new As String
035 Dim strJavaScript As String
036
037 Dim c9 As String
038 Dim c13 As String
039
040 '初期値
041 Const sFilePath = "D:\work\sample.pdf"
042 c9 = Chr(9) 'タブ
043 c13 = Chr(13) '改行
044 bEnd = True
045
046 'Acrobatオブジェクトの定義&作成
047 Dim objAFormApp As New AFORMAUTLib.AFormApp
048 Dim objAFormFields As AFORMAUTLib.Fields
049
050 'Acrobat 4,5,6の時
051 ' Dim objAcroApp As Acrobat.CAcroApp
052 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc
053 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc
054 ' Set objAcroApp = CreateObject("AcroExch.App")
055 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
056 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
057
058 'Acrobat 7,8,9,10 の時
059 Dim objAcroApp As New Acrobat.AcroApp
060 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
061 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
062
063 '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
064 '※回避用 / メモリにAcrobatを強制ロードさせる
065 objAcroApp.CloseAllDocs
066 objAcroApp.Hide
067
068 '処理対象のPDFファイルを開く
069 If Dir$(sFilePath) = "" Then
070 MsgBox sFilePath & vbCrLf & _
071 "ファイルが存在しません。", _
072 vbOKOnly + vbCritical, "エラー"
073 bEnd = False
074 GoTo Skip_AddDocJavascript_Test_01:
075 End If
076
077 bRet1 = objAcroAVDoc.Open(sFilePath, "")
078 If bRet1 = False Then
079 MsgBox sFilePath & vbCrLf & _
080 "ファイルがOPEN出来ません。", _
081 vbOKOnly + vbCritical, "エラー"
082 bEnd = False
083 GoTo Skip_AddDocJavascript_Test_01:
084 End If
085
086 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
087 'PDFのページ数を取得
088 iPageNum = objAcroPDDoc.GetNumPages
089
090 Set objAFormFields = objAFormApp.Fields
091 'PDFへ文書レベルのJavaScriptを追加する
092 strJavaScript = _
093 "//TextNはテキストフィールド名" & c13 & _
094 "var arr = [""Text1"",""Text2"",""Text3"",""Text4""];" & c13 & _
095 "//初期化" & c13 & _
096 "hogehidden(false);" & c13 & _
097 "//this.URL 実行時にAcrobat 8以上で「セキュリティ警告」" & c13 & _
098 "var sURL = this.URL;" & c13 & _
099 "//app.alert(sURL); //デバッグ用" & c13
100 strJavaScript = strJavaScript & _
101 "if(sURL.indexOf(""https://pdf-file.nnn2.com/"")==0){" & c13 & _
102 c9 & "//このURL上なら閲覧可とする" & c13 & _
103 c9 & "hogehidden(true);" & c13 & _
104 c9 & "//app.alert(""web表示""); //デバッグ用" & c13 & _
105 "}else if(sURL.indexOf(""file:///c|/work/"")==0){" & c13 & _
106 c9 & "//PDFにJavaScriptを追加時" & c13 & _
107 c9 & "hogehidden(true);" & c13 & _
108 c9 & "//app.alert(""JavaScriptが追加されました""); //デバッグ用" & c13 & _
109 "}else if(sURL.indexOf(""file:///C|/web/"")==0){" & c13 & _
110 c9 & "//HDの表示フォルダは閲覧可とする" & c13 & _
111 c9 & "hogehidden(true);" & c13 & _
112 c9 & "//app.alert(""HDの表示フォルダ""); //デバッグ用" & c13 & _
113 "}else{" & c13 & _
114 c9 & "hogehidden(false);" & c13 & _
115 c9 & "app.alert(""保存しての閲覧は許可されていません。"")" & c13 & _
116 "}" & c13
117 strJavaScript = strJavaScript & _
118 "//ページ上にあるテキストフィールドの閲覧を制御する" & c13 & _
119 "function hogehidden(sethidden){" & c13 & _
120 c9 & "for(var i=0;i<arr.length;i++){" & c13 & _
121 c9 & c9 & "this.getField(arr[i]).hidden = sethidden;" & c13 & _
122 c9 & "}" & c13 & _
123 "}"
124
125 '注意:追加されたJavaScriptがこの時点で一度実行される
126 objAFormFields.AddDocJavascript "hoge", strJavaScript
127
128 'PDFファイルを別フォルダへ保存
129 strFilePath_new = Replace(sFilePath, "\work\", "\web\")
130 'PDFファイルのファイル名を変更する
131 strFilePath_new = Replace(strFilePath_new, ".pdf", "_new.pdf")
132 '※追加されたJavaScriptはココでは実行されない
133 bRet2 = objAcroPDDoc.Save(1, strFilePath_new)
134 If bRet2 = False Then
135 MsgBox "PDFファイルへ保存出来ませんでした", _
136 vbOKOnly + vbCritical, "エラー"
137 bEnd = False
138 End If
139
140 'PDFファイルを閉じる
141 bRet2 = objAcroAVDoc.Close(False)
142 If bRet2 = False Then
143 MsgBox "AVDocオブジェクトはClose出来ませんでした", _
144 vbOKOnly + vbCritical, "処理エラー"
145 bEnd = False
146 End If
147
148 Skip_AddDocJavascript_Test_01:
149 On Error Resume Next
150 '変更しないで閉じます。※必須
151 bRet1 = objAcroAVDoc.Close(False)
152 'Acrobatアプリケーションの終了
153 objAcroApp.Hide
154 objAcroApp.Exit
155 'オブジェクトの開放 ※必須
156 Set objAFormFields = Nothing
157 Set objAFormApp = Nothing
158 Set objAcroPDDoc = Nothing
159 Set objAcroAVDoc = Nothing
160 Set objAcroApp = Nothing
161
162 If bEnd = True Then
163 MsgBox "処理は正常に終了しました。", _
164 vbOKOnly + vbInformation, "正常終了"
165 End If
166 Exit Sub
167
168 Err_AddDocJavascript_Test_01:
169 '実行時のエラーメッセージを表示
170 MsgBox Err.Number & vbCrLf & Err.Description, _
171 vbOKOnly + vbCritical, "実行時のエラー"
172 bEnd = False
173 GoTo Skip_AddDocJavascript_Test_01:
174 End Sub
175
176 '*********************************************
177 ' メモリ上のAcrobatプロセスを数える。
178 '*********************************************
179 Private Function iCheckAcrobat() As Long
180 'On Error GoTo skip_iCheckAcrobat: 'VBA実行時エラー
181 Dim items As Object
182 Set items = CreateObject("WbemScripting.SWbemLocator") _
183 .ConnectServer.ExecQuery( _
184 "Select * From Win32_Process " & _
185 "Where Name = 'Acrobat.exe'")
186 '1以上はプロセス有り、0は無し
187 iCheckAcrobat = items.Count
188 ' Exit Function
189 'skip_iCheckAcrobat:
190 ' miErrorNo = Err.Number
191 ' msErrorMsg = Err.Description
192 End Function
193
194 '*********************************************
195 ' メモリ上に残ったAcrobatプロセスを
196 ' 正常に終了させる為だけの処理です。
197 '*********************************************
198 Sub EndAcrobat()
199 On Error Resume Next
200 Dim objAcroApp As New Acrobat.AcroApp
201 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
202 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
203 Dim objAFormApp As New AFORMAUTLib.AFormApp
204 Dim objAFormFields As AFORMAUTLib.Fields
205
206 objAcroApp.CloseAllDocs
207 objAcroApp.Hide
208 objAcroApp.Exit
209
210 Set objAFormFields = Nothing
211 Set objAFormApp = Nothing
212 Set objAcroPDDoc = Nothing
213 Set objAcroAVDoc = Nothing
214 Set objAcroApp = Nothing
215
216 '上記の実行後にメモリ上から消える、はず。
217 MsgBox "Acrobat OLEの終了を試みました。" & _
218 vbCrLf & "10秒後にメモリから消えたのを" & _
219 vbCrLf & "タスクマネージャーで確認して下さい。", _
220 vbSystemModal + vbInformation, "お知らせ"
221 End Sub
222
追加されたAcrobat JavaScript
PDFに追加された Acrobat JavaScript は以下です。
//TextNはテキストフィールド名
var arr = ["Text1","Text2","Text3","Text4"];
//初期化
hogehidden(false);
//this.URL 実行時にAcrobat 8以上で「セキュリティ警告」
var sURL = this.URL;
//app.alert(sURL); //デバッグ用
if(sURL.indexOf("https://pdf-file.nnn2.com/")==0){
//このURL上なら閲覧可とする
hogehidden(true);
//app.alert("web表示"); //デバッグ用
}else if(sURL.indexOf("file:///c|/work/")==0){
//PDFにJavaScriptを追加時
hogehidden(true);
//app.alert("JavaScriptが追加されました"); //デバッグ用
}else if(sURL.indexOf("file:///C|/web/")==0){
//HDの表示フォルダは閲覧可とする
hogehidden(true);
//app.alert("HDの表示フォルダ"); //デバッグ用
}else{
hogehidden(false);
app.alert("保存しての閲覧は許可されていません。")
}
//ページ上にあるテキストフィールドの閲覧を制御する
function hogehidden(sethidden){
for(var i=0;i<arr.length;i++){
this.getField(arr[i]).hidden = sethidden;
}
}
WEBブラウザで表示されたPDF
ココをクリックすると以下のPDFがWEBブラウザで表示されます。但し、パソコンに保存して見ることは出来ません。
備考
- 「AFormAut : Fields.AddDocJavascript メソッド」のサンプルを御覧ください。
- 各ページへのテキストフィールドの自動作成方法はの「AFormAut : Fields.Add メソッド」サンプルを参考にしてください。
- Acrobat JavaScript はChr(9) タブ文字、Chr(13) 改行文字 を使って、後での見栄えを良くしています。 ネット上には「'function Hallo()¥r{¥r¥tapp."Hallo!",1,1);Hallo();¥r}'」 で ¥r や ¥t を使った例もありますが、当サンプル上では出来ませんでした。
- サンプルはC ドライブを使っていますが、C ドライブ以外を推奨します。
Adobe Reader での動作結果を以下に示します。Adobe Reader 4 以外は Windows XP で動作確認しました。
| Adobe Reader | 結果 | 備考 |
|---|---|---|
| 4 | OK | Adobe Reader 4.0.5c ※Windows 98SE |
| 5 | OK | Adobe Reader 5.0.5 *1 |
| 6 | OK | Adobe Reader 6.0.6 |
| 7 | OK | Adobe Reader 7.1.4 |
| 8 | OK* | Adobe Reader 8.3.1 |
| 9 | OK* | Adobe Reader 9.5.2 |
| 10 | OK* | Adobe Reader X (10.0.4) |
- OK : 正常処理します。
- OK* : 正常処理します。但し、起動時に「セキュリティ警告」が表示される。
- *1 : テキストフィールドの文字が表示されず、四角いボックが4つ代わりに表示される。
注意
- 上記VBAコードをVBA開発環境にコピー&ペーストすると一部の文字が全角文字、又は文字化け(ハイフン文字が?)します。コピーして使う場合は手修正してください。
- 正常終了、又は異常処理でも objAcroAVDoc.Close(False) は強制実行してください。実行しないとAcrobatプロセスがメモリに残り、次回処理時にエラーになる場合があります。Nothinmg 処理も同様です。
- F8 でステップ実行すると、以下のステートメントでメッセージが表示される場合があります。
objAFormFields.AddDocJavascript "hoge", strJavaScript
原因と対処方法は ココ と ココ とを参照してください。F5 での実行では出ません。
別のプログラムで OLE の操作が完了するまで待機を続けます。
- Acrobat 8 , Acrobat 9 , Acrobat X(10) でJavaScriptを追加したPDFを開く時に以下の「セキュリティ警告」が表示される。更にAcrobat X(10) を使ってVBAで
objAFormFields.AddDocJavascript "hoge", strJavaScript
を実行した時も表示されます。

※上記「すべてのPDF文書に関してこのサイトに対する操作を記録(R)」とあるが、実際はチェック・オフしないと記録されない。Acrobat X のバグ?みたいです。
- Acrobat X(10) では 上記のセキュリティダイアログのVBA 対策にとして、Acrobat 本体の環境設定を以下に変更します。

- 運用上は JavaScript の最初に
app.alert(“警告画面が表示されたら「許可(A)」ボタンをクリックしないとPDFは閲覧できません。”)
を更に追加する方が、イイかもしれません。 - 全OLEを実行する前に
objAcroApp.CloseAllDocs
で強制的にAcrobat アプリケーションをメモリ上にロードしないと
Set objAFormApp = CreateObject("AFormAut.App")
で実行エラー(ランタイムエラー)が発生する場合があります。
429 ActiveXコンポーネントはオブジェクトを作成できません。
< サンプル一覧 >
サイト管理人の技術メモ
これ以降はサイト管理者が当サイト又は当ページを維持&管理するためのメモです。見る必要も無く公開用にも書いてません。
- this.URL の URL プロパティは Acrobat 5.0 から提供されている新機能。
・「テクニカルノート# 5186 Acrobat JavaScript Object Specification バージョン 5.0.5」より。
つまりAcrobat JavaScript 1.5 以降から提供されている事になります。
・SDK の acrojs_j.pdf より、又は以下の公開情報を参照。http://www.adobe.com/jp/support/products/pdfs/acrojs_j.pdf#page=44http://www.adobe.com/jp/support/products/pdfs/acrojs_j.pdf#nameddest=G4.41795 - this.URL プロパティの値はパソコンのドライブレター(Cドライブ等)を取得する時は注意が必要です。
・VBA内のAcrobat JavaScript 追加した時は
“file:///c|/work/” <- C ドライブ文字が小文字
・パソコンのフォルダから開く時は
“file:///C|/web/” <- C ドライブ文字が大文字 - JavaScript は「 }elseif{ 」と書くがAcrobat JavaScript は「 }else if{ 」と間に半角の空白を入れて書く。
- デバッグ時用に「//app.alert(“..”)」を追加しています。
- Acrobat JavaScript の各バージョンを示します。(
ネット(JavaScript API)より)Acrobat 3.01 4 5 6 7 8 9 10 11 JavaScript 1.2 1.2 1.5 1.5 1.5 1.6 1.7 1.8 ??
感謝
当記事の作成にあたり、以下の情報を使用させて頂きました。
この場を借りて感謝にかえさせて頂きます。
- iga50 さんのコメント
pdfを保存させないようにする
< サンプル一覧 >



管理人さん、先日は大変お世話になり、ありがとうございました。
JavaScript埋め込み方法があるのですね。
ただ自分のところは、Acrobat10体験版ですが、
Set objAFormApp = CreateObject("AFormAut.App")
ここでエラーが発生してしまい検証ができませんでした。すみません。
(ActiveXはコンポーネントを作成できません)
管理人さんも書いてらっしゃる、
>PDF自体にパスワード保護を追加すれば保護は強化されます。
についてご相談させてください。
IACでPDFをパスワード保護するには、VC++プラグインが必要で、
私はVC++の技術がなく却下となりました。
http://kb2.adobe.com/jp/cps/511/511063.html
そこで先日管理人さんにおそわった手法を流用しようと試しておりました。
空のPDFにパスワード保護しておきます。
この空PDFを開き、実際のPDFをページ追加し、空ページを削除して、保存する手法です。
ですが、パスワード保護したPDFにはページ追加することができませんでした。
パスワード解除する方法を探しておりましたが、
これまたVC++によるプラグインが必要そうでして。
http://kb2.adobe.com/jp/cps/511/511104.html
パスワード保護したPDFを保護解除するメソッド等存在するかご存知でしょうか?
よろしくお願いいたします。
以下は別件になります。
上記情報のAcrobat10の動作結果として、
>*3 : PDFは作成される。
>しかしVBAでJavaScript追加時に「・・セキュリティ・・・」画面が表示される。VBA処理が一時停止する
こちらですが、逃げの設定?があります。
Acrobat→メニュー→編集→環境設定→セキュリティ(拡張)→セキュリティ特権の場所
ここに、実行時のフォルダパスを設定しておくと、セキュリティ警告画面が
表示されなくなりました。
すでにご存じの内容でしたらすみません。
iga50 さんへ。
返答が大変遅くなりました。
>Set objAFormApp = CreateObject(“AFormAut.App”)
>ここでエラーが発生してしまい検証ができませんでした。
以下の参照設定を再確認して下さい。
参照設定(AFormAutの追加版)
「AFormAut 1.0 Type Library」のチェックオン部分です。
Acrobat X(10)試用版でも動作するのを確認しています。
>パスワード保護したPDFにはページ追加することができませんでした。
これに関しては最近動作確認をしています。
Acrobatを手動での結合時にパスワード要求されます。
よってプログラミングによる動作がエラーなるのは当然かと思いました。
>パスワード保護したPDFを保護解除するメソッド等・・
現在では該当する物は見つかりません。
Adobeフォーラムに書かれている様にプラグインによる操作しか手は無いと思われます。
>http://kb2.adobe.com/jp/cps/511/511063.html
>http://kb2.adobe.com/jp/cps/511/511104.html
管理人も C の経験は無いに等しいですが、興味が合ったので上記の1つのコンパイルにトライしました。
しかし、サンプルは古く、それと同じSDKが無い為に該当するHヘッダーが無く、上位バージョンHヘッダーだと、別のHヘッダーに変更?する記述が有り、それもトライしましたが、コンパイル完了にいたっていません。
近々限りなく近い環境を作成予定していますが、他で手がいっぱいなのでいつになるかは不明です。
>・・実行時のフォルダパスを設定しておくと、セキュリティ警告画面が・・
ありがとうございます。
「セキュリティ警告」が出なくなりました。
別のサイトでは「信頼性管理マネージャー」と書かれていたのですが。
当ページへの反映は後日させて頂きます
返答が遅くなった事をお詫びします。 m(_._)m