当サンプルの流用は運用上に注意点が有ります。
当記事の下部にある<注意>の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を保存させないようにする 」を参照。
Option Explicit
Sub AddDocJavascript_Test_01()
On Error GoTo Err_AddDocJavascript_Test_01:
Dim i As Integer
Dim iPageNum As Integer
Dim bRet1 As Boolean
Dim bRet2 As Boolean
Dim bEnd As Boolean
Dim strFilePath_new As String
Dim objAFormApp As AFORMAUTLib.AFormApp
Dim objAFormFields As AFORMAUTLib.Fields
Dim strJavaScript As String
Dim c9 As String
Dim c13 As String
'初期値
Const sFilePath = "c:¥work¥sample.pdf"
c9 = Chr(9) 'タブ
c13 = Chr(13) '改行
bEnd = True
'Acrobatオブジェクトの定義&作成
'Acrobat 4,5,6の時
' Dim objAcroApp As Acrobat.CAcroApp
' Dim objAcroAVDoc As Acrobat.CAcroAVDoc
' Dim objAcroPDDoc As Acrobat.CAcroPDDoc
' Set objAcroApp = CreateObject("AcroExch.App")
' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
'Acrobat 7,8,9,10 の時
Dim objAcroApp As New Acrobat.AcroApp
Dim objAcroAVDoc As New Acrobat.AcroAVDoc
Dim objAcroPDDoc As New Acrobat.AcroPDDoc
'※CreateObject("AFormAut.App")のエラー
'※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
'※回避用 / メモリにAcrobatを強制ロードさせる
objAcroApp.CloseAllDocs
'処理対象のPDFファイルを開く
If Dir$(sFilePath) = "" Then
MsgBox sFilePath & vbCrLf & _
"ファイルが存在しません。", _
vbOKOnly + vbCritical, "エラー"
bEnd = False
GoTo Skip_AddDocJavascript_Test_01:
End If
bRet1 = objAcroAVDoc.Open(sFilePath, "")
If bRet1 = False Then
MsgBox sFilePath & vbCrLf & _
"ファイルがOPEN出来ません。", _
vbOKOnly + vbCritical, "エラー"
bEnd = False
GoTo Skip_AddDocJavascript_Test_01:
End If
Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
'PDFのページ数を取得
iPageNum = objAcroPDDoc.GetNumPages
Set objAFormApp = CreateObject("AFormAut.App")
Set objAFormFields = objAFormApp.Fields
'PDFへ文書レベルのJavaScriptを追加する
strJavaScript = _
"//TextNはテキストフィールド名" & c13 & _
"var arr = [""Text1"",""Text2"",""Text3"",""Text4""];" & c13 & _
"//初期化" & c13 & _
"hogehidden(false);" & c13 & _
"//this.URL 実行時にAcrobat 8以上で「セキュリティ警告」" & c13 & _
"var sURL = this.URL;" & c13 & _
"//app.alert(sURL); //デバッグ用" & c13
strJavaScript = strJavaScript & _
"if(sURL.indexOf(""http://hoeghoge.com/"")==0){" & c13 & _
c9 & "//このURL上なら閲覧可とする" & c13 & _
c9 & "hogehidden(true);" & c13 & _
c9 & "//app.alert(""web表示""); //デバッグ用" & c13 & _
"}else if(sURL.indexOf(""file:///c|/work/"")==0){" & c13 & _
c9 & "//PDFにJavaScriptを追加時" & c13 & _
c9 & "hogehidden(true);" & c13 & _
c9 & "//app.alert(""JavaScriptが追加されました""); //デバッグ用" & c13 & _
"}else if(sURL.indexOf(""file:///C|/web/"")==0){" & c13 & _
c9 & "//HDの表示フォルダは閲覧可とする" & c13 & _
c9 & "hogehidden(true);" & c13 & _
c9 & "//app.alert(""HDの表示フォルダ""); //デバッグ用" & c13 & _
"}else{" & c13 & _
c9 & "hogehidden(false);" & c13 & _
c9 & "app.alert(""保存しての閲覧は許可されていません。"")" & c13 & _
"}" & c13
strJavaScript = strJavaScript & _
"//ページ上にあるテキストフィールドの閲覧を制御する" & c13 & _
"function hogehidden(sethidden){" & c13 & _
c9 & "for(var i=0;i<arr.length;i++){" & c13 & _
c9 & c9 & "this.getField(arr[i]).hidden = sethidden;" & c13 & _
c9 & "}" & c13 & _
"}"
'注意:追加されたJavaScriptがこの時点で一度実行される
objAFormFields.AddDocJavascript "hoge", strJavaScript
'PDFファイルを別フォルダへ保存
strFilePath_new = Replace(sFilePath, "¥work¥", "¥web¥")
'PDFファイルのファイル名を変更する
strFilePath_new = Replace(strFilePath_new, ".pdf", "_new.pdf")
'※追加されたJavaScriptはココでは実行されない
bRet2 = objAcroPDDoc.Save(1, strFilePath_new)
If bRet2 = False Then
MsgBox "PDFファイルへ保存出来ませんでした", _
vbOKOnly + vbCritical, "エラー"
bEnd = False
End If
'PDFファイルを閉じる
bRet2 = objAcroAVDoc.Close(False)
If bRet2 = False Then
MsgBox "AVDocオブジェクトはClose出来ませんでした", _
vbOKOnly + vbCritical, "処理エラー"
bEnd = False
End If
Skip_AddDocJavascript_Test_01:
On Error Resume Next
'変更しないで閉じます。※必須
bRet1 = objAcroAVDoc.Close(False)
'Acrobatアプリケーションの終了
objAcroApp.Hide
objAcroApp.Exit
'オブジェクトの開放 ※必須
Set objAFormFields = Nothing
Set objAFormApp = Nothing
Set objAcroPDDoc = Nothing
Set objAcroAVDoc = Nothing
Set objAcroApp = Nothing
If bEnd = True Then
MsgBox "処理は正常に終了しました。", _
vbOKOnly + vbInformation, "正常終了"
End If
Exit Sub
Err_AddDocJavascript_Test_01:
'実行時のエラーメッセージを表示
MsgBox Err.Number & vbCrLf & Err.Description, _
vbOKOnly + vbCritical, "実行時のエラー"
bEnd = False
GoTo Skip_AddDocJavascript_Test_01:
End Sub
追加された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=44
http://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 ??
感謝
当記事の作成にあたり、以下の情報を使用させて頂きました。
この場を借りて感謝にかえさせて頂きます。
< サンプル一覧 >
管理人さん、先日は大変お世話になり、ありがとうございました。
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