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
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 で文書が開いていません。
    -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を保存させないようにする 」を参照。

 

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

 

※ソースコードHTML変換:SourceConverter

 


追加された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等) バージョン