PDFをWEBブラウザでしか表示出来ない様する (this.URL使用)

TOP > サンプル / 関数 > *      [...]


当サンプルの流用は運用上に注意点が有ります。

当記事の下部にある<注意>の4と5を参照してください。

AFormAut : Fields.AddDocJavascript メソッド」のサンプルを御覧ください。

説明

PDF をWEBブラウザでしか表示できないようにします。

  1. PDF を指定のURL 又は特定のフォルダからしか見れないようにします。
    パソコンに保存しても全ページをテキストフィールドで隠して見れないようにします。
     
    警告:保存しての閲覧は許可されていません。

     
  2. 但し、動作確認出来るよう(デバッグ時用)に指定フォルダのみからは見れるようにします。
    (このデバッグ用の機能を外すことも可能です。)
    完全に保護出来る訳では無いです。
    PDF自体にパスワード保護を追加すれば保護は強化されます。
     

見れない場合の例 ※「表示不可」はページ全体のテキストフィールド

※PDFファイル 全ページへのテキスト・フィールド設定はAFormAut : Fields.Add メソッド のサンプルを参照して下さい。

PDFをWEBブラウザでしか表示出来ない様にします (Excel VBAサンプル)

動作の結果

あくまでも当サイトでの結果です。

必ず自分のパソコン環境で動作確認をしてください。

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
OKAcrobat 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 で文書が開いていません。
    -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 以後、このメッセージを表示しない
    サポート対象外PDFへの警告メッセージ

     
  • *E7 : Windows 7 + Excel 2007 環境で実行エラーになりました。 
     

サンプル:Excel VBA

  1. F8キーでステップ実行しながら動作確認して下さい。
  2. 事前に 参照設定(AFormAutの追加版) が必要です。
  3. サンプルの説明:
    • 元のsample.pdf はPDFバージョン 1.3 (Acrobat 4.0互換) を使用
    • sample.pdf はC:¥work¥ フォルダに置く
    • JavaScript が追加された PDF は C:¥web¥sample_new.pdf に保存する
    • JavaScript は文書レベルで追加する
  4. テストする前に当記事下部の「<注意>」を事前参照。
  5. 当サンプルを見る前に「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;
    }
}

JavaScript エディタ

WEBブラウザで表示されたPDF

ココをクリックすると以下のPDFがWEBブラウザで表示されます。

但し、パソコンに保存して見ることは出来ません。

WEBブラウザで表示されたPDFファイル

備考

  1. AFormAut : Fields.AddDocJavascript メソッド」のサンプルを御覧ください。
  2. 各ページへのテキストフィールドの自動作成方法は以下のサンプルを参考にしてください。
    AFormAut : Fields.Add メソッド
  3. Acrobat JavaScript はChr(9) タブ文字、Chr(13) 改行文字 を使って、後での見栄えを良くしています。
    ネット上には「'function Hallo()¥r{¥r¥tapp."Hallo!",1,1);Hallo();¥r}'」
    で ¥r や ¥t を使った例もありますが、当サンプル上では出来ませんでした。
  4. サンプルはC ドライブを使っていますが、C ドライブ以外を推奨します。
  5. 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つ代わりに表示される。
  6. ※動作確認をお願いする知人等が減っているので、確認が難しい!(困

注意

  1. 上記VBAコードをVBA開発環境にコピー&ペーストすると一部の文字が全角文字、又は文字化け(ハイフン文字が?)します。
    コピーして使う場合は手修正してください。
     
  2. 正常終了、又は異常処理でも objAcroAVDoc.Close(False) は強制実行してください。
    実行しないとAcrobatプロセスがメモリに残り、次回処理時にエラーになる場合があります。
    Nothinmg 処理も同様です。
     
  3. F8 でステップ実行すると、以下のステートメントでメッセージが表示される場合があります。
    objAFormFields.AddDocJavascript  "hoge", strJavaScript
    原因と対処方法は ココココ とを参照してください。
    F5 での実行では出ません。
     
    別のプログラムで OLE の操作が完了するまで待機を続けます。
    別のプログラムで OLE の操作が完了するまで待機を続けます。

       
  4. Acrobat 8 , Acrobat 9 , Acrobat X(10) でJavaScriptを追加したPDFを開く時に以下の「セキュリティ警告」が表示される。
    更にAcrobat X(10) を使ってVBAで
    objAFormFields.AddDocJavascript "hoge", strJavaScript
    を実行した時も表示されます。
     
    セキュリティ警告

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

     
  6. 運用上は JavaScript の最初に
    app.alert(“警告画面が表示されたら「許可(A)」ボタンをクリックしないとPDFは閲覧できません。”)
    を更に追加する方が、イイかもしれません。 
  7. 全OLEを実行する前に
    objAcroApp.CloseAllDocs
    で強制的にAcrobat アプリケーションをメモリ上にロードしないと
    Set objAFormApp = CreateObject("AFormAut.App")
    で実行エラー(ランタイムエラー)が発生する場合があります。
     
    429 ActiveXコンポーネントはオブジェクトを作成できません。
    429 ActiveXコンポーネントはオブジェクトを作成できません。

     

サンプル一覧


サイト管理人のメモ

Acrobat JavaScript メモ

以下の情報はサイト管理人のメモです。 ※Acrobat JavaScript 初心者!

質問を受けても返答できません。

アドバイスは、お願いします。

  1. 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
  2. this.URL プロパティの値はパソコンのドライブレター(Cドライブ等)を取得する時は注意が必要です。
    ・VBA内のAcrobat JavaScript 追加した時は
    “file:///c|/work/” <- C ドライブ文字が文字
    ・パソコンのフォルダから開く時は
    “file:///C|/web/” <- C ドライブ文字が文字
  3. JavaScript は「 }elseif{ 」と書くがAcrobat JavaScript は「 }else if{ 」と書く。
  4. デバッグ時用に「//app.alert(“..”)」を追加している。
  5. 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 ??

感謝

当記事の作成にあたり、以下の情報を使用させて頂きました。

この場を借りて感謝にかえさせて頂きます。


サンプル一覧

「PDFをWEBブラウザでしか表示出来ない様する (this.URL使用)」への2件のフィードバック

  1. 管理人さん、先日は大変お世話になり、ありがとうございました。
    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→メニュー→編集→環境設定→セキュリティ(拡張)→セキュリティ特権の場所
    ここに、実行時のフォルダパスを設定しておくと、セキュリティ警告画面が
    表示されなくなりました。
    すでにご存じの内容でしたらすみません。

  2. 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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください