PDFをJavaScriptで(OLE)操作する

TOP > *      [...]


はじめに

Acrobat 本体ではAcrobat 専用のJavaScript が使える。

OLEオートメーションからその『Acrobat専用のJavaScript』にアクセスするJSObject オブジェクトが提供されている。

全ての機能が使える訳ではないことに注意が必要です。

一応、以下に各Acrobatに対するJavaScriptのコア部分のバージョンを表で示します。

 

Acrobat Version 3.01 4.0 5.0 6.0 7.0 8.0 9.0 10.0
JavaScript Version 1.2 1.2 1.5 1.5 1.5 1.6 1.7 1.8

 

Acrobat.JavaScriptに関するリファレンス説明はSDKにある「js_api_reference.pdf」を参考にする。

ネット(JSObject)でも公開されている。

 

  

注意事項

英語版Acrobat解説書(js_api_reference.pdf)には”JavaScriptオブジェクト”と言う表現は見当たらない。

JavaScript APIと表現している。

正確にはJSObject オブジェクト が正解らしい。

 

  

JavaScriptオブジェクトはExcelの開発環境に有るオブジェクト・ブラウザでプロパティやメソッドを見る事が出来ない。

よって必ず「js_api_reference.pdf」を参考にしてプログラミングする必要がある。

Excel(VBA)プログラミングの基本を以下に示す。

 

 





※Excel 2003使用時

'    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,11 の時
    Dim objAcroApp      As New Acrobat.AcroApp
    Dim objAcroAVDoc    As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc    As New Acrobat.AcroPDDoc
    
    '以降はAcrobat全て共通
    Dim lRet            As Long     '戻り値
    Dim jso             As Object
    
    'Acrobatアプリケーションを起動する。
    lRet = objAcroApp.Show
    'PDFファイルを開いて表示する。
    lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "")
    'PDDocオブジェクトを取得する。
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    'JavaScriptオブジェクトを作成する。
    Set jso = objAcroPDDoc.GetJSObject

・・・・・

 

TOPへ

「PDFをJavaScriptで(OLE)操作する」への10件のフィードバック

  1. JavaとJavaScriptの違いをご存じない方もけっこういらっしゃるので、
    "Javaオブジェクト"より"JavaScriptオブジェクト"の方が適切かと思います。

  2. 梅茶漬け様。初めまして。
    確かに御指摘の通りかもしれません。
    実際に私も最初にJavaを知った時はJavaとJavaScriptの違いが判りませんでした。
    実は今でも”Javaオブジェクト”という表現に悩んでいます。
    本来の”JavaScript API”に戻すべきか?
    しかし、Excelから使うOLEオートメーションと言う見方からでは本来の言い方”JavaScript API”は異物の様な感じを受けます。
    もう少し考えてみます。
    御助言、ありがとうございました。

  3. 管理人 様

    初めまして。
    こちらのサイトを参考にして、プログラムを作っています。

    以下のコードで、テキストのハイライトを行っていますが、
    quadsをセットしているところで、run-time errorで、
    "Automation error.Invalid access to memory location"が出ます。

    quadsはアクセスできないものでしょうか?
    ご教示頂けましたら幸いです。
    よろしくお願いします。

    -------------------------------------------
    Set jso = objAcroPDDoc.GetJSObject
    If Not jso Is Nothing Then
    Set annot = jso.AddAnnot
    Set props = annot.getProps
    props.Type = "Highlight"
    annot.setProps props

    Set props = annot.getProps
    props.page = page
    props.strokeColor = jso.Color.red
    props.quads = jso.getPageNthWordQuads(page, i)
    annot.setProps props

    End If

  4. shuangさん。初めまして。

    Acrobat JavaScriptに関しては未分野ですが、
    一応調べてみました。

    以下の古いマニュアルを見る限りquadsオブジェクトは存在しません。

    Programming Acrobat JavaScript Using Visual Basic
    バージョン:Acrobat 6.0
    http://kb2.adobe.com/jp/cps/511/511296/attachments/511296_VBJavaScriptJ.pdf

    以下のサンプルを作ってみましたが
    「実行時エラー '-2147417851 (80010105)':
    オートメーション エラーです。
    サーバーによって例外が返されました。」
    が表示されます。

    Sub Test-js()

    'Acrobat 7,8,9の時
    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc As New Acrobat.AcroPDDoc

    '以降はAcrobat全て共通
    Dim lRet As Long '戻り値
    Dim Page As Long
    Dim i As Long
    Dim props As Object

    Page = 0
    i = 0
    'PDFファイルを開いて表示する。
    lRet = objAcroAVDoc.Open("E:\Test01.pdf", "")
    'Acrobatアプリケーションを起動する。
    lRet = objAcroApp.Show
    'PDDocオブジェクトを取得する。
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()

    Set jso = objAcroPDDoc.GetJSObject
    If Not jso Is Nothing Then
    Set annot = jso.AddAnnot
    Set props = annot.getProps
    'props.Type = "Highlight"
    props.Type = "Text"
    annot.setProps props

    Set props = annot.getProps
    props.Page = Page
    props.strokeColor = jso.Color.red
    props.quads = jso.getPageNthWordQuads(Page, i)
    annot.setProps props
    End If

    lRet = objAcroPDDoc.Close
    lRet = objAcroAVDoc.Close(0)
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit

    Set jso = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing

    End Sub

    どのマニュアルを見たのでしょうか?

  5. 管理人 様

    調べて頂いて、ありがとうございます。
    私が見たマニュアルはバージョン7.0.5のProgramming Acrobat JavaScript Using Visual Basicです。
    Text注釈追加のサンプルですが、Highlite注釈も追加できると思い、
    プログラムを書きました。
    プログラム実行時に、watchウィンドウでprops.quadsの値が見えていますが、
    それに値セットしようとすると、run-timeエラーが出ます。
    JavaScriptではHighlite注釈の場合、quadsを指定しないと、
    Highlite注釈がうまく作成できないですが、
    なぜExcelからではエラーが出るのかわかりません。
    制限がかかっているのでしょうか?

  6. shuangさんへ。

    今度は
    「実行時エラー'438'
    オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
    です。

    現在のコチラの環境は
    ・OS:Windows 7 ※マルチOSでWinXPも有り
    ・Excel : Office 2007
    ・Acrobat:Pro v8.2.6

    >バージョン7.0.5 ・・

    7からサポートしていますか。

    ひとつだけ確実に言えることがあります。
    Adobe社のマニュアルは「Using Visual Basic」であって「Using VBA」では無いと言うことです。
    「Visual Basic」又は「VB.NET」はサポートしているみたいですが、Excel内で使えるVBAに関しては記述がありません。
    GetJSObject メソッドはAcrobat JavaScriptへの入り口みたいな記述がありますが、かなり限定的な部分があります。
    別の言い方をすれば、『手抜き』ではないかと思う時もあります。
    一部が使えて、別が使えない。
    しかもGetJSObject メソッドのサンプルはどれも似たり寄ったりのモノばかりです。

    ここの解説が途中で中断しているのは、その壁が見えないからです。

  7. 管理人 様

    いろいろ試して頂いて、ありがとうございます。
    Excelからquadsを使えないということですね!
    他の方法を検討してみます。

    ご回答していただき、本当にありがとうございました。

  8. shuangさんへ。

    正確には、使えるかは判らないです。
    テスト結果が正解となります。

  9. はじめまして。
    とても参考になるサイトですね。
    感謝しています。

    さて、
    ‘JavaScriptオブジェクトを作成する。
    Set jso = objAcroPDDoc.GetJSObject
    の後に
    Dim wd as string
    Dim ret as variant
    wd = inputbox("検索キー")
    ret = jso.search.query(wd, "ActiveDoc", "/F/")
    で文字列検索をさせたいのですが、
    JAVAスクリプトデバッガーに

    GeneralError: 操作は失敗しました。
    Search.query:0:
    No active document

    と表示されます。
    queryメソッドの第一引数のみでやってみると
    検索ウィンドウが表示されますが、やはり検索結果を表示してもらいたいものです。
    なぜ"ActiveDoc"ではだめなのでしょう。
    JAVAのデバッガーにべた打ちして試すと問題なく行くのですが。。。
    ご教授くださいますとうれしいです。

    当方の環境:WinXp SP3  Office2000 Acrobat pro X

  10. jinさん。初めまして。
    話の前に少し以前の調査結果からです。

     Adobe社はGetJSObjectメソッドで作成されたオブジェクトがAcrobat JavaScriptにアクセス出来るように書かれていますが、実際には出来ないことが多いです。つまりOLE経由では全ての命令を実行できるとは限らない、みたいです。
     実際に当サイトでもいろいろと試しましたが、出来ない事の方が多くて挫折しました。
     しかしAcrobat JavaScriptをよく知っている人から見れば使える部分が結構あるみたいです。実際の「jso.***」で検索するといろいろと出てきます。実行してみると動かないことが多いですが。(汗

    質問の内容ですが。

    >なぜ”ActiveDoc”ではだめなのでしょう。

    だぶんですが、OKと思われます。
    以下でも出てきました。※動作未確認
    http://www.mrexcel.com/forum/showthread.php?p=2357529
    第三引数は上記では無いです。

    >JAVAのデバッガーにべた打ちして試すと・・

    JAVAのデバッガーで出来るからVBAからOLE経由で出来る訳では無いです。
    それがOLE経由で操作するゆえの障害部分です。
    あくまでも勘ですが、OLE経由では引数のタイプや順番、引数の数が異なる様に感じます。

    >当方の環境:・・ Office2000

    以前に質問を頂いた方でOffice2000のみですが、ActiveXコントロールで不可解な動作を起こす現象に出くわしています。
    Office2003では問題無く動作しました。
    Office2000はくせ者です。
    Access 2000もくせ者です。<-これは不良品です。

    Adobe社のAcrobat日本語フォーラムがあります。
    上記はタマにですがAdobe社の人らしき解答者がいます。

    こちらからご提供できる情報は(残炎ですが)以上です。

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

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

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