PDFをJavaScriptで(OLE)操作する

TOP > *      [...]


はじめに

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

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

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

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

Acrobat Version3.014.05.06.07.08.09.010.0
JavaScript Version1.21.21.51.51.51.61.71.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使用時

001 ' Acrobatオブジェクトの定義&作成 002 'Acrobat 4,5,6 の時 003 ' Dim objAcroApp As Acrobat.CAcroApp 004 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc 005 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc 006 ' Set objAcroApp = CreateObject("AcroExch.App") 007 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 008 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc") 009 010 'Acrobat 7,8,9,10,11 の時 011 Dim objAcroApp As New Acrobat.AcroApp 012 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 013 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 014 015 '以降はAcrobat全て共通 016 Dim lRet As Long '戻り値 017 Dim jso As Object 018 019 'Acrobatアプリケーションを起動する。 020 lRet = objAcroApp.Show 021 'PDFファイルを開いて表示する。 022 lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "") 023 'PDDocオブジェクトを取得する。 024 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 025 'JavaScriptオブジェクトを作成する。 026 Set jso = objAcroPDDoc.GetJSObject 027 028 ・・・・・


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

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> タグを入れてください。

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