当サンプルの流用は運用上に注意点が有ります。
当記事の下部にある<注意>の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を保存させないようにする」を参照。
変数の宣言 Integer は Long でご使用ください。
001 Option Explicit
002
003 Sub AddDocJavascript_Test_01()
004 On Error GoTo Err_AddDocJavascript_Test_01:
005
006 Dim i As Integer
007 Dim iPageNum As Integer
008 Dim bRet1 As Boolean
009 Dim bRet2 As Boolean
010 Dim bEnd As Boolean
011 Dim strFilePath_new As String
012 Dim objAFormApp As AFORMAUTLib.AFormApp
013 Dim objAFormFields As AFORMAUTLib.Fields
014 Dim strJavaScript As String
015
016 Dim c9 As String
017 Dim c13 As String
018
019 '初期値
020 Const sFilePath = "c:¥work¥sample.pdf"
021 c9 = Chr(9) 'タブ
022 c13 = Chr(13) '改行
023 bEnd = True
024
025 'Acrobatオブジェクトの定義&作成
026 'Acrobat 4,5,6の時
027 ' Dim objAcroApp As Acrobat.CAcroApp
028 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc
029 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc
030 ' Set objAcroApp = CreateObject("AcroExch.App")
031 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
032 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
033
034 'Acrobat 7,8,9,10 の時
035 Dim objAcroApp As New Acrobat.AcroApp
036 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
037 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
038
039 '※CreateObject("AFormAut.App")のエラー
040 '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
041 '※回避用 / メモリにAcrobatを強制ロードさせる
042 objAcroApp.CloseAllDocs
043
044 '処理対象のPDFファイルを開く
045 If Dir$(sFilePath) = "" Then
046 MsgBox sFilePath & vbCrLf & _
047 "ファイルが存在しません。", _
048 vbOKOnly + vbCritical, "エラー"
049 bEnd = False
050 GoTo Skip_AddDocJavascript_Test_01:
051 End If
052
053 bRet1 = objAcroAVDoc.Open(sFilePath, "")
054 If bRet1 = False Then
055 MsgBox sFilePath & vbCrLf & _
056 "ファイルがOPEN出来ません。", _
057 vbOKOnly + vbCritical, "エラー"
058 bEnd = False
059 GoTo Skip_AddDocJavascript_Test_01:
060 End If
061
062 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
063 'PDFのページ数を取得
064 iPageNum = objAcroPDDoc.GetNumPages
065
066 Set objAFormApp = CreateObject("AFormAut.App")
067 Set objAFormFields = objAFormApp.Fields
068
069 'PDFへ文書レベルのJavaScriptを追加する
070
071 strJavaScript = _
072 "//TextNはテキストフィールド名" & c13 & _
073 "var arr = [""Text1"",""Text2"",""Text3"",""Text4""];" & c13 & _
074 "//初期化" & c13 & _
075 "hogehidden(false);" & c13 & _
076 "//this.URL 実行時にAcrobat 8以上で「セキュリティ警告」" & c13 & _
077 "var sURL = this.URL;" & c13 & _
078 "//app.alert(sURL); //デバッグ用" & c13
079 strJavaScript = strJavaScript & _
080 "if(sURL.indexOf(""http://hoeghoge.com/"")==0){" & c13 & _
081 c9 & "//このURL上なら閲覧可とする" & c13 & _
082 c9 & "hogehidden(true);" & c13 & _
083 c9 & "//app.alert(""web表示""); //デバッグ用" & c13 & _
084 "}else if(sURL.indexOf(""file:///c|/work/"")==0){" & c13 & _
085 c9 & "//PDFにJavaScriptを追加時" & c13 & _
086 c9 & "hogehidden(true);" & c13 & _
087 c9 & "//app.alert(""JavaScriptが追加されました""); //デバッグ用" & c13 & _
088 "}else if(sURL.indexOf(""file:///C|/web/"")==0){" & c13 & _
089 c9 & "//HDの表示フォルダは閲覧可とする" & c13 & _
090 c9 & "hogehidden(true);" & c13 & _
091 c9 & "//app.alert(""HDの表示フォルダ""); //デバッグ用" & c13 & _
092 "}else{" & c13 & _
093 c9 & "hogehidden(false);" & c13 & _
094 c9 & "app.alert(""保存しての閲覧は許可されていません。"")" & c13 & _
095 "}" & c13
096 strJavaScript = strJavaScript & _
097 "//ページ上にあるテキストフィールドの閲覧を制御する" & c13 & _
098 "function hogehidden(sethidden){" & c13 & _
099 c9 & "for(var i=0;i<arr.length;i++){" & c13 & _
100 c9 & c9 & "this.getField(arr[i]).hidden = sethidden;" & c13 & _
101 c9 & "}" & c13 & _
102 "}"
103
104
105
106
107 '注意:追加されたJavaScriptがこの時点で一度実行される
108 objAFormFields.AddDocJavascript "hoge", strJavaScript
109
110 'PDFファイルを別フォルダへ保存
111 strFilePath_new = Replace(sFilePath, "¥work¥", "¥web¥")
112 'PDFファイルのファイル名を変更する
113 strFilePath_new = Replace(strFilePath_new, ".pdf", "_new.pdf")
114 '※追加されたJavaScriptはココでは実行されない
115 bRet2 = objAcroPDDoc.Save(1, strFilePath_new)
116 If bRet2 = False Then
117 MsgBox "PDFファイルへ保存出来ませんでした", _
118 vbOKOnly + vbCritical, "エラー"
119 bEnd = False
120 End If
121
122 'PDFファイルを閉じる
123 bRet2 = objAcroAVDoc.Close(False)
124 If bRet2 = False Then
125 MsgBox "AVDocオブジェクトはClose出来ませんでした", _
126 vbOKOnly + vbCritical, "処理エラー"
127 bEnd = False
128 End If
129
130
131 Skip_AddDocJavascript_Test_01:
132 On Error Resume Next
133 '変更しないで閉じます。※必須
134 bRet1 = objAcroAVDoc.Close(False)
135
136 'Acrobatアプリケーションの終了
137 objAcroApp.Hide
138 objAcroApp.Exit
139
140 'オブジェクトの開放 ※必須
141 Set objAFormFields = Nothing
142 Set objAFormApp = Nothing
143 Set objAcroPDDoc = Nothing
144 Set objAcroAVDoc = Nothing
145 Set objAcroApp = Nothing
146
147 If bEnd = True Then
148 MsgBox "処理は正常に終了しました。", _
149 vbOKOnly + vbInformation, "正常終了"
150 End If
151 Exit Sub
152
153 Err_AddDocJavascript_Test_01:
154 '実行時のエラーメッセージを表示
155 MsgBox Err.Number & vbCrLf & Err.Description, _
156 vbOKOnly + vbCritical, "実行時のエラー"
157 bEnd = False
158 GoTo Skip_AddDocJavascript_Test_01:
159 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
追加された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("http://hoeghoge.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 結果 備考 4OKAdobe Reader 4.0.5c ※Windows 98SE 5OKAdobe Reader 5.0.5 *1 6OKAdobe Reader 6.0.6 7OKAdobe Reader 7.1.4 8OK*Adobe Reader 8.3.1 9OK*Adobe Reader 9.5.2 10OK*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コンポーネントはオブジェクトを作成できません。
< サンプル一覧 >
サイト管理人のメモ
Acrobat JavaScript メモ
以下の情報はサイト管理人のメモです。 ※Acrobat JavaScript 初心者!
質問を受けても返答できません。
アドバイスは、お願いします。
- 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