AFormAut : ExecuteThisJavascript メソッド

TOP > AFormAut > ExecuteThisJavascript メソッド


説明

開いているPDFに対してAcrobat JavaScript を実行します。

Acrobat JavaScript は文字列として指定します。

 

形式

CString  ExecuteThisJavascript  ( LPCTSTR  bstrTheScript ) ;

 

引数

  1. 第一引数 (LPCTSTR bstrTheScript) :
    文字列の Acrobat JavaScript スクリプト。

  

戻り値

  • Acrobat JavaScript でイベントレベルに割り当てた結果を文字列として返す。 
    スクリプト 最後に"event.value= 99;" 等で記述すれば、結果を受け取れます。
    詳細はサンプル参照。

  

動作するバージョン

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 *2 
※レジストリ操作で全面的に可能になる
8
NO
Acrobat 8.3.1 Pro + Excel 2003
※当Acrobatバージョンでは全面的に不可
9
NO
Acrobat 9.5.5 Extended + Excel 2003
※当Acrobatバージョンでは全面的に不可
10
OK
Acrobat X (10.1.8) Extended + Excel 2003
11
OK
Acrobat XI (11.0.5) Extended + Excel 2003
  • OK : 正常処理する。
  • NO : 動作しない。 又は実行時にエラーになる。
  • *1 : 「PDF のバージョン」によっては正常処理出来ない場合がある。
  • *2 : 全ての「PDF のバージョン」での処理を可能にしたければ、
    処理前のレジストリに以下を追加する必要があります。
    [HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert]
    [HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert¥cCheckbox]
    "idocNewerVersionWarning"=dword:00000001

 






サンプル①:Excel のVBA

 

説明 :

Acrobat JavaScript でPDFドキュメントの総ページ数を取得する。

12ページあるPDFファイルを処理する。

 

Option Explicit

Sub ExecuteThisJavascript_test() 

    Dim strAcrobatJavaScript    As String
    Dim strReturn               As String
    Dim lRet                    As Long
    
    Const CON_PDF_FILE = "D:¥VBJavaScript.pdf"
    
    '*-----------------------------------------------------------
    '* PDFファイルを開く
    
    'Acrobatオブジェクトの定義&作成
    Dim objAcroApp      As New Acrobat.AcroApp
    Dim objAcroAVDoc    As New Acrobat.AcroAVDoc
     
    Dim objAFormApp     As AFORMAUTLib.AFormApp
    Dim objAFormFields  As AFORMAUTLib.Fields
    
    '※CreateObject("AFormAut.App")のエラー
    '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
    '※回避用 / メモリにAcrobatを強制ロードさせる
    objAcroApp.CloseAllDocs
    
    '処理対象のPDFファイルを開く
    '※AVDocでOpenしないと"AFormAut.App"で実行エラー
    lRet = objAcroAVDoc.Open(CON_PDF_FILE, "")
    If lRet = 0 Then
        MsgBox "AVDocオブジェクトはOpen出来ません" & vbCrLf & _
            CON_PDF_FILE, vbOKOnly + vbCritical, "処理エラー"
        GoTo Skip_ExecuteThisJavascript_test:
    End If
    
    '*-----------------------------------------------------------
    '* AFormオブジェクトの作成
    
    Set objAFormApp = CreateObject("AFormAut.App")
    Set objAFormFields = objAFormApp.Fields
    
    '*-----------------------------------------------------------
    '* PDFに対してAcrobat JavaScriptを実行
    
    'Acrobat JavaScriptの作成 ※ドキュメントの頁数の取得
    strAcrobatJavaScript = "var a = this.numPages;" & _
                           "event.value = a;"
    'Acrobat JavaScript の実行
    strReturn = objAFormFields.ExecuteThisJavascript(strAcrobatJavaScript)
    
Skip_ExecuteThisJavascript_test:

    '*-----------------------------------------------------------
    '* 終了処理
    
    '変更しないで閉じます
    lRet = objAcroAVDoc.Close(1)
    
    'Acrobatアプリケーションの終了
    objAcroApp.Hide
    objAcroApp.Exit
    
    'オブジェクトの開放
    Set objAFormFields = Nothing
    Set objAFormApp = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing
    
    MsgBox "End Sub ドキュメントの頁数(" & strReturn & ")"
End Sub

 

実行結果

AFormAut : ExecuteThisJavascript メソッドの実行結果①

 

 


サンプル②:Excel のVBA

  

テキストをハイライトにする

 

説明 :

指定文字列(単語)をハイライトのテキストにする。

実行するAcrobat JavaScript は外部からテキストファイルで読み込む。

ハイライト処理したPDFは別名で最適化して保存する。

 

 

Acrobat_JavaScript01.txt テキストファイルの内容

  

// 文書全体にわたって単語を検索し、その単語をハイライトにする
// 作成 2013-11-11 作成者 pdf-file.nnn2.com

var ckKey = "Acrobat";     // 検索キーワード
var ntotal = 0;         // 処理件数

for (var p = 0; p < this.numPages; p++)
{
    var numWords = this.getPageNumWords(p);
    for (var i=0; i<numWords; i++)
    {
        var ckWord = this.getPageNthWord(p, i, true);
        if ( ckWord == ckKey)
        {
             /* then highlight it */
             this.addAnnot({
                page: p,
                strokeColor: color.yellow,
                type: "Highlight",
                quads: this.getPageNthWordQuads(p, i),
             });
            ntotal++;
        }
    }
}
// 処理件数を返す
event.value=ntotal;

 

 

Excel VBA

 

Option Explicit
  
 
Public Const PDSaveFull = &H1
Public Const PDSaveLinearized = &H4
Public Const PDSaveCollectGarbage = &H20

' 実行するAcrobat JavaScript が入ったテキストファイル
Const CON_AJS_FILE = "D:¥PDF¥Acrobat_JavaScript01.txt"
' ハイライト処理する元のPDFファイル名
Const CON_PDF_FILE = "D:¥PDF¥VBJavaScript.pdf"
' 処理した後のPDFファイル名
Const CON_PDF_FILE_S = "D:¥PDF¥VBJavaScript-w.pdf"
  
 

Sub AddAnnot_Highlight_Main()
    Debug.Print Time()

    Dim strAcrobatPath            As String   '未使用
    Dim strAcrobatVersion       As String   'Acrobatバージョン
    Dim strMsg                       As String   'エラーメッセージ
    Dim strAcrobatJavaScript    As String   'Acrobat JavaScript
    Dim strReturn                  As String   'Acrobat JavaScriptの戻り値
    Dim lRet                         As Long     '処理結果
    Dim bRet                       As Boolean  '処理結果
    
    '*-----------------------------------------------------------
    '* 環境のAcrobatバージョンを事前チェックする
    
    bRet = Get_Adobe_App_Info_nnn2( _
                "Acrobat", _
                strAcrobatPath, _
                strAcrobatVersion, _
                strMsg)
    If bRet = False Then
        MsgBox "01:Acrobat バージョンの取得 エラー " & vbCrLf & strMsg, _
            vbOKOnly + vbCritical + vbApplicationModal, "エラー"
        Exit Sub
    End If
    If Not (CInt(strAcrobatVersion) = 7 Or _
            CInt(strAcrobatVersion) >= 10) Then
        MsgBox "02:このAcrobatバージョン(" & strAcrobatVersion & _
            ")では処理出来ません。" & vbCrLf & _
            "Acrobat 7 , X(10) , XI(11) が必要です。", _
            vbOKOnly + vbCritical + vbApplicationModal, "エラー"
            
        Exit Sub
    End If
    
    '*-----------------------------------------------------------
    '* Acrobat JavaScriptスクリプトをテキストで読み込む
    
    bRet = AddAnnot_Hl_AJSRead(strAcrobatJavaScript)
    If bRet = False Or strAcrobatJavaScript = "" Then
        MsgBox "03: ファイル読み込み時にエラー発生" _
            & vbCrLf & CON_AJS_FILE, _
            vbOKOnly + vbCritical + vbApplicationModal, "エラー"
        Exit Sub
    End If
    
    '*-----------------------------------------------------------
    '* PDFファイルを開く
    
    'Acrobatオブジェクトの定義&作成
    Dim objAcroApp      As New Acrobat.AcroApp
    Dim objAcroAVDoc    As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc    As New Acrobat.AcroPDDoc
     
    Dim objAFormApp     As AFORMAUTLib.AFormApp
    Dim objAFormFields  As AFORMAUTLib.Fields
    
    '※CreateObject("AFormAut.App")のエラー
    '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
    '※回避用 / メモリにAcrobatを強制ロードさせる
    objAcroApp.CloseAllDocs
    '※高速処理をする為に画面を隠す
    objAcroApp.Hide
    
    '処理対象のPDFファイルを開く
    '※AVDocでOpenしないと"AFormAut.App"で実行エラー
    lRet = objAcroAVDoc.Open(CON_PDF_FILE, "")
    If lRet = 0 Then
        MsgBox "04: AVDocオブジェクトはOpen出来ません" & vbCrLf & _
            CON_PDF_FILE, vbOKOnly + vbCritical, "処理エラー"
        GoTo Skip_AddAnnot_Highlight_Main:
    End If
    
    '*-----------------------------------------------------------
    '* AFormオブジェクトの作成
    
    Set objAFormApp = CreateObject("AFormAut.App")
    Set objAFormFields = objAFormApp.Fields
    
    '*-----------------------------------------------------------
    '* PDFに対してAcrobat JavaScriptを実行
    
    '検索キーワードの変更
'    strAcrobatJavaScript = Replace$( _
'        strAcrobatJavaScript, "Acrobat", "Adobe")
    'Acrobat JavaScript の実行
    strReturn = objAFormFields.ExecuteThisJavascript(strAcrobatJavaScript)
'    Debug.Print "strReturn=" & strReturn
    
    '*-----------------------------------------------------------
    '* PDFを最適化して別名保存する
    
    'PDFファイルを別名で保存
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
    lRet = objAcroPDDoc.Save( _
        PDSaveFull + PDSaveCollectGarbage + PDSaveLinearized, _
        CON_PDF_FILE_S)
    If lRet = 0 Then
        MsgBox "05: PDFファイルへ保存出来ませんでした" & vbCrLf & _
            CON_PDF_FILE_S, vbOKOnly & vbCritical, "エラー"
        GoTo Skip_AddAnnot_Highlight_Main:
    End If
    
Skip_AddAnnot_Highlight_Main:

    '*-----------------------------------------------------------
    '* 終了処理
    
    '変更しないで閉じます
    lRet = objAcroPDDoc.Close
    '変更しないで閉じます
    lRet = objAcroAVDoc.Close(1)
    
    'Acrobatアプリケーションの終了
    objAcroApp.Hide
    objAcroApp.Exit
    
    'オブジェクトの開放
    Set objAFormFields = Nothing
    Set objAFormApp = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing
    
    Debug.Print Time()
    MsgBox "End Sub (" & strReturn & ")"
End Sub

'**************************************************
'
' Acrobat JavaScript を別ファイルから読み込む
'

Private Function AddAnnot_Hl_AJSRead( _
    ByRef strAJS As String) As Boolean
    
On Error GoTo Err_AddAnnot_Hl_AJSRead:
    
    Dim lFileNO         As Long
    Dim strInputData    As String
    Dim lCnt            As Long
    
    lFileNO = FreeFile
    Open CON_AJS_FILE For Input As #lFileNO
    
    strAJS = ""
    lCnt = 0
    
    Do Until EOF(lFileNO)
    Line Input #lFileNO, strInputData
        strAJS = strAJS & strInputData & vbCrLf
        lCnt = lCnt + 1
    Loop
    
    Close #lFileNO
    AddAnnot_Hl_AJSRead = True
'    Debug.Print "Input Text =" & lCnt
    Exit Function
    
Err_AddAnnot_Hl_AJSRead:
    AddAnnot_Hl_AJSRead = False
End Function

'**************************************************
'
Public Function Get_Adobe_App_Info_nnn2( _
            ByVal strApp As String, _
            ByRef strPath As String, _
            ByRef strVersion As String, _
            ByRef strMsg As String) As Boolean

’※当ロジックは
関数:Acrobat , Adobe Reader のインストールパスとバージョンを取得
http://pdf-file.nnn2.com/?p=767
’から持ってくる。

End Function

 

 

実行結果

AFormAut : ExecuteThisJavascript メソッドの実行結果②

 

 


備考

  1. Acrobat JavaScript の機能が基本的に全て 使用できます。(のはずです。
  2. サンプル①もサンプル②もJSOjectオブジェクトを使っても出来ますが、
    制約が少なく、高速処理が可能、また応用範囲も広いと考えています。
  3. 一般的に「テキストのハイライト」と表現しますが、Acrobat SDK では
    「Highlight 注釈」、単に「ハイライト」と表現する場合があります。
  4. Acrobat JavaScript に関しては以下の日本語リファレンスを参照。
    JavaScript for Acrobat API Reference
    Adobe Acrobat SDK バージョン 8.0

    (765頁) Acrobat JavaScript の詳細な解説書/リファレンス

   

Acrobat JavaScript メモ

  1. 戻り値は「イベントレベルに割り当てた結果を文字列と返す」 と書いていますが、
    サンプルの様にスクリプトの最後に「"event.value = a;"」 という感じで書けば
    文字列として戻り値が受け取れます。

 

動作確認の環境

  • 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.5 Extended + Office 2003( + SP3)
    +  WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat X (10.1.8) Extended + Office 2003( + SP3) 
    + WindowsXP Pro( + SP3 + WindowsUpdate)
  • Acrobat XI (11.0.5) Extended + Office 2003( + SP3)
    + WindowsXP Pro( + SP3 + WindowsUpdate)

 

Adobe Web 解説 URL(英語)

  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