AFormAut : Fields.AddDocJavascript メソッド

TOP > AFormAut > Fields.AddDocJavascript メソッド


説明

PDF に文書レベルのAcrobat JavaScript を追加します。

 

形式

void AddDocJavascript (LPCTSTR bstrScriptName, 
                       LPCTSTR bstrTheScript);

 

引数

  1. 第一引数 (LPCTSTR bstrScriptName) :
    文書レベルの関数名。
    半角の英数字の文字列。
  2. 第二引数 (LPCTSTR bstrTheScript) : 
    Acrobat JavaScript コードが入った文字列。
    タブはChr(9)、改行はChr(13)を使う。

 

戻り値

  • 無し。
    よって、追加が成功したかは判らない。

 

動作するバージョン

Adobe Acrobat
結果
備考
4
NO
Acrobat 4.0 ※Windows 98SE + Excel 2000 *1
※古いPDFのバージョンはOK!
5
NO
Acrobat 5.0.5 + Excel 2003 *1
※古いPDFのバージョンはOK
6
NO
Acrobat 6.0.6 Pro + Excel 2003 *1
※古いPDFのバージョンはOK
7
OK
Acrobat 7.1.4 Pro + Excel 2003
8
NO
Acrobat 8.3.1 Pro + Excel 2003
※当Acrobatバージョンでは全面的に不可
9
NO
Acrobat 9.5.2 Extended + Excel 2003
※当Acrobatバージョンでは全面的に不可
10
OK
Acrobat X (10.1.4) Extended + Excel 2003
11
OK
Acrobat XI (11.0) Extended + Excel 2003
  • OK : 正常処理する。
  • NO : 動作しない。 又は実行時にエラーになる。
  • *1 : 「PDF のバージョン」によっては正常処理出来ない場合がある。

 






サンプル:Excel のVBA

 

説明 : 特定のWEB(URL)のみしかPDF文書を表示出来ないようにします。

・PDF の全ページにページ全体を隠すようなテキストボックスを追加します。

・そして文書レベルのAcrobat JavaScript を追加して 、追加した全テキストボックスを制御させます。

 

Option Explicit

Const PDSaveFull = &H1
Const PDSaveLinearized = &H4
Const PDSaveCollectGarbage = &H20

Sub AddDocJavascript_Test_04()
On Error GoTo Err_AddDocJavascript_Test_04:

    Dim i               As Integer
    Dim iPageNum        As Integer
    Dim bRet            As Boolean
    Dim bEnd            As Boolean
    Dim strFilePath_new As String
    Dim objAFormApp     As AFORMAUTLib.AFormApp
    Dim objAFormFields  As AFORMAUTLib.Fields
    Dim objAFormField   As AFORMAUTLib.Field
    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
'    Dim objAcroPDPage As Acrobat.CAcroPDPage
'    Dim objAcroPoint  As Acrobat.CAcroPoint
'    Set objAcroAVDoc = CreateObject("AcroExch.App")
'    Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
'    Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
     
    'Acrobat 7,8,9,10,11 の時
    Dim objAcroApp     As New Acrobat.AcroApp
    Dim objAcroAVDoc   As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc   As New Acrobat.AcroPDDoc
    Dim objAcroPDPage  As Acrobat.AcroPDPage
    Dim objAcroPoint   As Acrobat.AcroPoint
     
    '※CreateObject("AFormAut.App")のエラー
    '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
    '※回避用 / メモリにAcrobatを強制ロードさせる
    objAcroApp.CloseAllDocs
    
    '事前チェック
    If Dir$(sFilePath) = "" Then
        MsgBox sFilePath & vbCrLf & _
            "ファイルが存在しません。", _
            vbOKOnly + vbCritical, "エラー"
        bEnd = False
        GoTo Skip_AddDocJavascript_Test_04:
    End If

    '-------------------------------------------------
    
    '一旦、PDFファイルを別フォルダへ別名保存

    strFilePath_new = Replace(sFilePath, "\work\", "\web\")
    'PDFファイルのファイル名を変更する
    strFilePath_new = Replace(strFilePath_new, ".pdf", "_new.pdf")
    
    bRet = objAcroPDDoc.Open(sFilePath)
    If bRet = False Then
        MsgBox sFilePath & vbCrLf & _
            "ファイルが PDDoc.Open 出来ません。", _
            vbOKOnly + vbCritical, "エラー(S)"
        bEnd = False
        GoTo Skip_AddDocJavascript_Test_04:
    End If
    '別名で保存。存在する場合は上書き保存する。
    bRet = objAcroPDDoc.Save(PDSaveFull, strFilePath_new)
    If bRet = False Then
        MsgBox "PDFファイルを PDDoc.Save 出来ません。", _
            vbOKOnly + vbCritical, "エラー(S)"
        bEnd = False
        GoTo Skip_AddDocJavascript_Test_04:
    End If
    '一旦閉じる
    bRet = objAcroPDDoc.Close
    If bRet = False Then
        MsgBox "PDFファイルを PDDoc.Close 出来ません。", _
            vbOKOnly + vbCritical, "エラー(S)"
        bEnd = False
        GoTo Skip_AddDocJavascript_Test_04:
    End If

    '-------------------------------------------------

    '処理対象のPDFファイルを開く

    '※objAFormApp.Fieldsを実行するには
    '※AVDocオブジェクトを開いておく必要がある。
    bRet = objAcroAVDoc.Open(strFilePath_new, "")
    If bRet = False Then
        MsgBox strFilePath_new & vbCrLf & _
            "ファイルが AVDoc.Open 出来ません。", _
            vbOKOnly + vbCritical, "エラー"
        bEnd = False
        GoTo Skip_AddDocJavascript_Test_04:
    End If
     
    'PDFのページ数を取得
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
    iPageNum = objAcroPDDoc.GetNumPages
     
    'Fieldsオブジェクトの作成
    Set objAFormApp = CreateObject("AFormAut.App")
    Set objAFormFields = objAFormApp.Fields
     
    '-------------------------------------------------
    
    For i = 0 To iPageNum - 1
      
        'PDFページサイズを取得
        Set objAcroPDPage = objAcroPDDoc.AcquirePage(i)
        Set objAcroPoint = objAcroPDPage.GetSize
          
        'PDFの指定ページにテキストフィールドを追加
        '※ページ全体を覆うテキストボックス作成
        Set objAFormField = _
            objAFormFields.Add("Text" & (i + 1), "text", _
                i, 0, objAcroPoint.y, objAcroPoint.x, 0)
          
        'テキストフィールドの設定
        With objAFormField
            .SetBackgroundColor "RGB", 1, 1, 1, 0
            .Alignment = "center"
            .TextFont = "HeiseiMin-W3-UniJIS-UCS2-H"
            .Value = "閲覧不可" '表示する文字
            .IsReadOnly = True  '読み込み専用
            .IsHidden = False   '表示する
        End With
          
        '設定後に開放
        Set objAFormField = Nothing
          
    Next
    
    '-------------------------------------------------
    
    'Acrobat JavaScriptを編集する
    strJavaScript = _
        "//hogehidden(false); //保護用のテキスト表示" & c13 & _
        "var sPath = this.path;" & c13 & _
        "//app.alert(sPath); //デバッグ用" & c13
    strJavaScript = strJavaScript & _
        "if(sPath.indexOf('http://pdf-file.nnn2.com/')==0){" & c13 & _
        c9 & "//このURL上なら閲覧可とする" & c13 & _
        c9 & "hogehidden(true); //保護用のテキスト非表示" & c13 & _
        c9 & "//app.alert('web表示'); //デバッグ用" & c13 & _
        "}else if(sPath.substr(0,7)=='/c/web/'){" & c13 & _
        c9 & "//VBAでJavaScript追加時" & c13 & _
        c9 & "//app.alert('VBAでJavaScript追加時'); //デバッグ用" & c13 & _
        "}else if(sPath.substr(0,7)=='/C/web/'){" & c13 & _
        c9 & "//PCの表示フォルダは閲覧可とする" & c13 & _
        c9 & "//ココは無くても良い" & c13 & _
        c9 & "hogehidden(true); //保護用のテキスト非表示" & c13 & _
        c9 & "//app.alert('PCの表示フォルダ'); //デバッグ用" & c13 & _
        "}else{" & c13 & _
        c9 & "app.alert('閲覧は許可されていません。');" & c13 & _
        c9 & "//強制的に閉じる" & c13 & _
        c9 & "this.closeDoc();" & c13 & _
        "}" & c13
    strJavaScript = strJavaScript & _
        "//ページ上にある保護用テキストの表示を全制御" & c13 & _
        "//this.getField('Text*').hidden = true で非表示" & c13 & _
        "function hogehidden(sethidden){" & c13 & _
        c9 & "var iCnt = this.numPages; //総ページ数:1から" & c13 & _
        c9 & "for(var i=0;i<iCnt;i++){" & c13 & _
        c9 & c9 & _
        "if (this.getField('Text'+(i+1)).hidden != sethidden){" & c13 & _
        c9 & c9 & c9 & _
        "this.getField('Text'+(i+1)).hidden = sethidden;" & c13 & _
        c9 & c9 & "}" & c13 & _
        c9 & "}" & c13 & _
        "}"
    
    'PDFへ文書レベルのJavaScriptを追加する
    '注意:追加されたJavaScriptがこの時点で一度実行される
    objAFormFields.AddDocJavascript "hoge", strJavaScript

    '最適化して上書き保存する
    '※追加されたJavaScriptはココでは実行されない
    bRet = objAcroPDDoc.Save(PDSaveFull + _
        PDSaveLinearized + PDSaveCollectGarbage, _
        strFilePath_new)
    If bRet = False Then
        MsgBox "PDFファイルへ PDDoc.Save 出来ません。", _
            vbOKOnly + vbCritical, "エラー"
        bEnd = False
    End If

Skip_AddDocJavascript_Test_04:
On Error Resume Next
    '強制でPDFを閉じます。
    bRet = objAcroPDDoc.Close
    bRet = objAcroAVDoc.Close(False)
    bRet = objAcroApp.CloseAllDocs
     
    'Acrobatアプリケーションの強制終了
    objAcroApp.Hide
    objAcroApp.Exit
    
    'オブジェクトの強制開放
    Set objAFormFields = Nothing
    Set objAFormApp = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroPDPage = Nothing
    Set objAcroPoint = Nothing
    Set objAcroApp = Nothing
     
    If bEnd = True Then
        MsgBox "処理は正常に終了しました。", _
            vbOKOnly + vbInformation, "正常終了"
    End If
    Exit Sub
     
Err_AddDocJavascript_Test_04:
    '実行時のエラーメッセージを表示
    MsgBox Err.Number & vbCrLf & Err.Description, _
            vbOKOnly + vbCritical, "実行時のエラー"
    bEnd = False
    GoTo Skip_AddDocJavascript_Test_04:
End Sub

 

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

 

 


追加されたAcrobat JavaScript

  

//hogehidden(false); //保護用のテキスト表示
var sPath = this.path;
//app.alert(sPath); //デバッグ用
if(sPath.indexOf('http://pdf-file.nnn2.com/')==0){
    //このURL上なら閲覧可とする
    hogehidden(true); //保護用のテキスト非表示
    //app.alert('web表示'); //デバッグ用
}else if(sPath.substr(0,7)=='/c/web/'){
    //VBAでJavaScript追加時
    //app.alert('VBAでJavaScript追加時'); //デバッグ用
}else if(sPath.substr(0,7)=='/C/web/'){
    //PCの表示フォルダは閲覧可とする
    //ココは無くても良い
    hogehidden(true); //保護用のテキスト非表示
    //app.alert('PCの表示フォルダ'); //デバッグ用
}else{
    app.alert('閲覧は許可されていません。');
    //強制的に閉じる
    this.closeDoc();
}
//ページ上にある保護用テキストの表示を全制御
//this.getField('Text*').hidden = true で非表示
function hogehidden(sethidden){
    var iCnt = this.numPages; //総ページ数:1から
    for(var i=0;i<iCnt;i++){
        if (this.getField('Text'+(i+1)).hidden != sethidden){
            this.getField('Text'+(i+1)).hidden = sethidden;
        }
    }
}

 

※Acrobat JavaScript 編集画面 Acrobat 7.0 J

AFormAut : Fields.AddDocJavascript メソッド で追加されたJavaScript

 


実行結果:WEBブラウザで表示されたPDF

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

 

※WEB ブラウザ 画面 : PDFの内容が見れる。

実行結果:WEBブラウザで表示されたPDF

※Windows PC内で表示 : PDFの内容は見れない。

Windows PC内で表示 : PDFの内容は見れない


注意

  1. 「CreateObject("AFormAut.App")」を実行するには事前にAcrobatアプリケーションをメモリ上にロードして置かないと実行エラー(ランタイムエラー)になりやすくなります。
    その為に早めに「objAcroApp.CloseAllDocs」を実行して、メモリにロードします。
    これはテスト結果で判った事です。SDK等では未調査です。
  2. 「Set objAFormFields = objAFormApp.Fields」を実行するには
    「objAcroAVDoc.Open」で該当するPDFファイルをオープンしておく必要があります。
    「objAcroPDDoc.Open」ではダメです。
  3. AddDocJavascript メソッド実行時に追加される文書レベルのAcrobat JavaScript がVBA上で実行されます。
    実行されても良いロジックにJavaScript コードをしておく必要があります。
  4. 備考にも書きましたが、JavaScript で
    「}else if(sPath.substr(0,7)=='/C/web/'){」
    の判断処理ロジック部分を削除する事により、
    特定のWEBのURLからしか表示できなくなります。

  


備考

  1. 既にPDFに同名称の文書レベルのAcrobat JavaScvript が存在すると上書きされます。
  2. 「objAFormFields.Add」は同じ名称のテキストフィールドが存在すると上書きされます。
    エラーにはなりません。
  3. 追加するAcrobat JavaScriptで
    「}else if(sPath.substr(0,7)=='/C/web/'){」
    の部分は判断は、運用上は必要無い部分と判断できれば、
    削除しても構いません。
    削除する事により、セキュリティ上のレベルは上がります。

 

Acrobat JavaScript メモ

  1. this.path プロパティの値はパソコンのドライブレター(C:ドライブ等)を取得する時は注意が必要です。
    • VBA内のAcrobat JavaScript 追加した時は
      “/c/web/sample_new.pdf” <- C ドライブ文字が文字
    • パソコンのフォルダからPDFを開く時は
      “/C/web/sample_new.pdf” <- C ドライブ文字が文字
  2. Acrobat JavaScript は事前にAcrobat 本体でデバッグ&テストをしておく事があります。

 

動作確認の環境

  • Acrobat 4.0 + Office 2000
    +  Windows98SE( + WindowsUpdate)
  • Acrobat 5.0.5 + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 6.0.6 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 7.1.4 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP2 + WindowsUpdate)
  • Acrobat 8.3.1 Pro + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat 9.5.2 Extended + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat X (10.1.4) Extended + Office 2003( + SP3) 
    + WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat XI (11.0) Extended + Office 2003( + SP3)
    + WindowsXP Pro( + SP3 + WindowsUpdate)

 

Adobe Web 解説 URL(英語)

v10.0

  1. http://livedocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=IAC_API_FormsIntro.107.43.html&accessible=true
  2. http://partners.adobe.com/public/developer/en/acrobat/sdk/FormsAPIReference.pdf#nameddest=G14.1031319

 

戻る

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.