Acrobat OLE 使用上の注意事項

TOP > *      [...]


当サイトが、Acrobat OLE機能(IAC)の紹介を始めて、3年以上経ちます。

最初は単なる興味から始まり、月日が経つにつれ、日本のエンジニア向けへの技術情報提供へと変わってきました。

その間に悪戦苦闘しながらも、やっとある程度は情報提供できる形にはなったと思っています。

ただ、時間的なものが邪魔をして不揃いな内容になっている事は申し訳なく思っています。

 

Acrobat OLE機能(IAC)の全貌が判った時点で、改めてここに使用上の注意事項を書かせて頂きます。

なお、これは当サイト管理人の判断であり、メーカーからの情報提供では有りません。

  1. Acrobat OLE機能(IAC)にはAcrobatアプリケーション本体が持っている機能の5%以下の機能しか提供されてない
  2. Acrobat OLE機能(IAC)にはAcrobat v6以降から機能の見直しをしていない
    注意)バージョンに関しては詳細な確認はしていない。v7かもしれない。
  3. Acrobat OLE機能(IAC)には単純なバグがあるにも関わらず、一向に修正がされない
  4. ユーザーが多い日本人のエンジニア向けの解説書(日本語版)SDKが提供されてない
  5. 機能は提供されて、解説が無いものも多数ある。つまり使い方が判らない

 

かなり悲観的な部分が有るが、誤解をしないで頂きたい。

当サイト管理人はこの機能を不定している訳ではありません。

OLE機能はこの手のソフトにとってエンジニア向けに提供されるの機能としては当然の機能であり、またアプリケーション本体と同程度の機能を提供するのはメーカーとしては当然の義務だと思っています。

しかい、バージョンアップを繰り返しても改善されません。

本当にAcrobat を使いこなすべきエンジニア達に対しての配慮が欠けていると思われます。

特に1と5の問題点はエンジニア泣かせと見ていいでしょう。

 

 

しかし、当サイトは今後も Acrobat OLE 機能(IAC) の情報提供を行っていきます。

まだ解説できてない部分の追加もします。

電子文書フォーマット「PDF」をエンジニアがプログラミング・コントロールする時の少しでも役に立つ情報提供に心がけたいと思っています。

 

以上、当サイト管理人より。   2013/10/11

 

TOPへ

「Acrobat OLE 使用上の注意事項」への14件のフィードバック

  1. いつも大変参考にさせて頂いております。ありがとうございます。
    Window10への切り替えのため、古かったソフトを新しくしようとしていますが、処理が動かなくなってしまいました。
    具体的には、Accessのvbaを利用して、既に作成済みのPDFに値を設定して保存するという処理です。
    値の取得はできるのですが、値の設定ができず、更新できない状態です。
    objPDDoc.GetJSObject.getField("us-request[0].ContentArea2[0].sfSignature[0].sfSig[0].signature[0]").Value = "Test"

    <旧環境>
    ・Windows7
    ・Acrobat7
    ・Access2003(Excel2010、Word2010)
    <新環境>
    ・Windows10
    ・Acrobat2017
    ・Access2019(Excel2019、Word2019)
    もしアドバイスして頂ける点がございましたら、よろしくお願い致します。

  2. 遠藤 さん はじめまして。

    あくまでも、予測ですが・・(汗

    新環境でのVBAの参照設定は、旧環境のAcrobat v.7を探そうとして見つからず、ひょっとしたらAcrobat Reader側のOLEを参照している可能性も予測できます。または、別の関係ない所を見ている。つまり、正常に参照設定が機能しない、と言う事です。

    >・・値の取得はできるのですが、値の設定ができず、更新できない状態・・

    過去にこの様な状態に遭遇しています。
    特に新環境とのバージョンの差(Acrobat v7 <-> Acrobat v2017)が大きいとうまく機能しない場合が有ります。

    対処方法としては、VBAの参照設定を一旦外して、OKボタンで閉じる。そして再度、参照設定を開いて、指定してみてください。
    この時に参照設定の画面の下に「場所」が表示されます。Acrobat2017のインストールフォルダになっていることに注意してください。


    ※上記はAcrobat XI(11.0)の場合

    それとVBAが入っていた旧・Access2003?ファイルをAccess2019ファイルにアップグレードした方がイイです。MSは下位互換を基本的に保証していますが、これもバージョン差が大きいとトラブルが出やすいです。
    MS Officeの2003バージョン以下はファイルの最適化が不適切で何度も更新をしていると、ファイルサイズが増えていってトラブルが出やすくなります。(経験談
    但し、注意点としてPDFの更新以外の機能が正常に動作するかの確認も必要になります。VBA+「その他モロモロ」もバージョンアップするからです。旧バージョンの2003でないと動かない、なんて事も予想できます。よって、旧Access2003ファイルはバックアップしてからアップデートしてください。

    それでも解決しない時は、再度コメントを下さい。

    (技術メモ:Acrobat 2017はデスクトップ向け永久ライセンスバージョン。手元に無いので動作は未確認です。基本的にDCバージョンとのライセンス違いだけと勝手に思っている。)

  3. 管理人様
    早速回答をして下さり、誠にありがとうございます。
    まずAccessのファイルですが、mdb→accdbにバージョンアップしておりました(分担して作業しており、記載が足りませんでした)。
    次に、参照設定ですが、既存のWin7+Access2003環境では、参照設定をせずに動作しておりました。
    そこで、Win10環境では、「Adobe Acrobat 10.0 Type Library」と表示されますが、「C:\Proguram Files (x86)\Adobe\Acrobat 2017\Acrobat\acrobat.tlb」を参照先として追加しました。
    しかし、結果としては同じ状態でした。
    このような情報で足りますでしょうか。
    そもそもOffice2019とAcrobat2017(もしくはDC)の環境で、vbaでの利用が可能なのかが、心配になっております。
    管理者様で動作確認がとれていらっしゃるなど、情報をお持ちだったりしますでしょうか。
    ※なお、Office2019は32bitバージョンをインストールしています。
    あいまいな質問で大変恐縮ですが、何卒よろしくお願い致します。

  4. 遠藤さんへ

    参照設定を使ってないと言う事は、たぶん以下の様な定義を使用していると思われます。

    Dim objPDDoc As Object
    Set objPDDoc = CreateObject("AcroExch.PDDoc")

    上記を以下の1行に変更してください。

    Dim objAcroPDDoc As New Acrobat.AcroPDDoc

    2行が1行で書けるようになります。これは参照設定をしてないと書けないです。また、参照設定しているOLEを見に行くようになります。
    Acrobat OLE(IAC)部分の文法チェックも掛かり、今まではエラーにならなかった部分がエラーになるかもしれません。

    「できればVBAソースを修正したくない」と言うかもしれませんが。
    これで一度、実行して見てください。
    うまく出来たら、その理由を次のコメントで書きます。

    >・・Office2019とAcrobat2017(もしくはDC)の環境で、vbaでの利用が可能なのかが、・・

    どちらも環境が無いので予想でしか返答できませんが。
    過去にMSのトップは「VBの動作は未来も保証する」と言っていました。(私はVB≒VBAとも思っています。) VBAを無くして、VB.NETに移行するみたいな気配も確かに昔は有りましたが、今はその話すら覚えている人もいません。
    VBAは未来も動作すると私は思っています。(真顔

    >・・Office2019は32bitバージョンをインストール・・

    その方がイイです。64ビット版にするとVBAから使うWindows API関連は目も当てられません。(経験談

    それと一つ教えてください。
    PDFファイルをエクスプローラーから開くと、Acrobat又はAcrobat Readerのどちらがデフォルトで開きますか?

  5. 管理者様
    定義については、まったくご指摘の通りでした。
    変更してみましたが、同じ状態でした。

    ちなみにPDFを開くと、Acrobatで開いています。
    なお、Actobat2017はStandardで、Actobat 7.0はProです。

    簡単なプログラムをお知らせしたいのですが、記入するとエラーになるため( <code> ・・・</code>を入れても)、本文だけですみません。

  6. 遠藤 さんへ

    >変更してみましたが、同じ状態でした。

    かなり自信は合ったのですが・・。
    (私のスキルは所詮、こんな物です:涙)

    >ちなみにPDFを開くと、Acrobatで開いています。

    Acrobat Readerがインストールされてないか、Acrobat Readerを先にインストールして、後でAcrobatをインストールしたかです。
    PDFの開くデフォルト設定はOS側で変更できますから。まあ、参考程度の話です・・。
    (インストール順は大事なのですが・・。今はもう関係ない。と思う。)

    >なお、Actobat2017はStandardで、Actobat 7.0はProです。

    一番重要な部分です。
    Acrobat 7.0 のStandardではOLEは使用できません。Pro版のみ有効です。公開マニュアルにも明記が有りました。これは実証&確認済みです。
    但し、Acrobat X?以降のバージョンから、StandardでもOLEが使用できると言う話(コメント)を頂いています。これに関してはコチラでは動作未確認です。Standard版の入手&検証ができなかったからです。
    Actobat2017もStandardの入手はできないので、検証は出来ません。Pro版は評価版として入手できます。

    >・・、記入するとエラーになるため・・

    すみません。ここのサイトは海外からの不審なアタックが非常に多いので、何重にもガードしています。
    今なら、 <code> ・・・</code> タグ無しでも入ります。

  7. Sub test_JSO_addWatermarkFromText()

    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroPDDoc As New Acrobat.AcroPDDoc
    Dim jso As Object
    Dim lRet As Long

    '透かしが追加されるPDFファイル
    Const CON_PDF_IN = "I:\透かしTest\VBJavaScript.pdf"

    'JSObjectオブジェクト作成時のNothingの回避策
    'Acrobatアプリを強制的にメモリにロードする
    lRet = objAcroApp.CloseAllDocs

    'PDFファイルを開く
    ******************************************

    Debug.Print "End: " & Date
    End Sub

  8. 管理者様
    早速ありがとうございます。

    プログラムは以下の通りです。
    Dim objPDF As New Acrobat.AcroApp
    Dim objAVDoc As New Acrobat.AcroAVDoc
    Dim objPDDoc As Acrobat.AcroPDDoc
    Dim wkText As String

    objPDF.CloseAllDocs

    If objAVDoc.Open("ファイルパス", "") = False Then
    MsgBox "ADS作成に失敗しました。" & vbCrLf & "情報システムにご連絡下さい。" & vbCrLf & Err.Number & ":" & Err.Description, vbCritical
    Exit Function
    End If

    Set objPDDoc = objAVDoc.GetPDDoc()

    With objPDDoc.GetJSObject
    wkText = .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value
    .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value = "Test"
    End With

    objPDDoc.Save "&H1", SakiPath
    objPDDoc.Close

    Set objPDDoc = Nothing
    objPDF.CloseAllDocs: objPDF.Hide: objPDF.Exit: Set objPDF = Nothing
    --------------------------
    途中でwkText に値が取れていることを確認の上、"Test"を設定しています。
    この直後にwkTextに取り出しても変更前の値がとれ、保存されたPDFでも変更前の値のままです。
    一度体験版のProの状態で、参照設定を追加する前のもとのコードで実行した際には、値の設定はできませんでした。
    値を設定してもエラーにならないので、何とか動かせないかなと思っております。

  9. 遠藤 さんへ

    >.getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]")

    上記の引数の内容について、公開できる範囲で説明をお願いします。参照先URLが有れば、それでも結構です。

    >一度体験版のProの状態で、参照設定を追加する前のもとの
    >コードで実行した際には、値の設定はできませんでした。

    「・・値の設定はできません」と言う事は、Pro版でもダメだった、と言うことですか?
    試用版でも起動できれば制限は全く無いはずなので、OLEは使えると思ったのですが。(困

    >値を設定してもエラーにならないので、

    JSObjectは特殊な変形OLEみたいで、結果でしか判断できない部分がほとんどです。

    少しお時間をください。
    最初からゆっくりと、見落としがないか、考えてみます。
    ・・環境の問題だと思うのです、・・。

  10. 管理者様
    ご確認頂きまして、ありがとうございます。
    この処理ですが、PDFは*****が作成した表形式+クリックにより入力項目の表示・非表示が切り替わる、動きのあるPDFになっています。
    値を設定したい項目は、記載しましたようなツリー状の階層になっていまして、[0]は1つ目の項目となっています。同じ項目を複数使用する場合は[1][2]とインデックスを変えて何番目の項目かを特定させています。
    ※動きのある項目の制御はできなかったので、入力したい人が1人用、2人用など、動かした後の状態でパターンごとにPDFを保存しておき、そこに値を設定していました。
    ※どのWebサイトかわからなくなってしまったのですが、Acrobat2017ぐらいから、Officeとの連携が変わったというような記載を見たように思い、実はそこが気になっております。Access2019+Acrobat7.0だと、元のプログラムのままでも動くのは確認しています。
    情報が後出しになってしまい、申し訳ございません。
    何卒よろしくお願い致します。

  11. 遠藤さんへ

    以下のテスト用ロジックを作りました。

    問題のJSObject部分と通常のOLE部分の2つのロジックが入っています。結果はDebug.Printで確認できるようにしました。

    001 Option Explicit
    002
    003 Sub Acrobat2017_Test1()
    004
    005 Dim sPath As String
    006 Dim sInFile As String
    007 Dim sOutFile As String
    008 Dim wkText As String
    009 Dim lRet As Long
    010
    011 Dim objPDF As New Acrobat.AcroApp
    012 Dim objAVDoc As New Acrobat.AcroAVDoc
    013 Dim objPDDoc As Acrobat.AcroPDDoc
    014
    015 '実行中の当ファイルが格納されたフォルダのパス
    016 sPath = ThisWorkbook.Path 'Excel
    017 'sPath = Application.CurrentProject.Path 'Access
    018 sPath = sPath & "\"
    019
    020 sInFile = sPath & "sample_old.pdf"
    021 sOutFile = sPath & "sample_new.pdf"
    022
    023 objPDF.CloseAllDocs
    024
    025 If objAVDoc.Open(sInFile, "") = False Then
    026 MsgBox "失敗しました。" & vbCrLf & _
    027 Err.Number & ":" & Err.Description, vbCritical
    028 Exit Sub
    029 End If
    030
    031 Set objPDDoc = objAVDoc.GetPDDoc()
    032
    033 '▼Update
    034 With objPDDoc.GetJSObject
    035 wkText = .getField("Text1").Value
    036 Debug.Print "wkText-更新前=(" & wkText & ")"
    037 .getField("Text1").Value = "Test"
    038 End With
    039 Debug.Print "Page=" & objPDDoc.GetNumPages()
    040
    041 '2ページ目のみ削除
    042 lRet = objPDDoc.DeletePages(1, 1)
    043
    044 objPDDoc.Save "&H1", sOutFile
    045 objPDDoc.Close
    046
    047 '▼Check
    048 objAVDoc.Open sOutFile, ""
    049 Set objPDDoc = objAVDoc.GetPDDoc()
    050 wkText = objPDDoc.GetJSObject.getField("Text1").Value
    051 Debug.Print "wkText-更新後=(" & wkText & ")"
    052 Debug.Print "Page=" & objPDDoc.GetNumPages()
    053 objPDDoc.Close
    054
    055 '▼End
    056 Set objPDDoc = Nothing
    057 objPDF.CloseAllDocs
    058 objPDF.Hide
    059 objPDF.Exit
    060 Set objAVDoc = Nothing
    061 Set objPDF = Nothing
    062
    063 End Sub

    ”Text1”はページ全体を覆い隠すテキストフィールドです。
    上記はテスト用PDF共に以下からダウンロード(Dropbox)できます。

    ダウンロード先:Acrobat2017-Test-002.zip

    【テスト-1】
    上記を遠藤さんのAccess2019+Acrobat 2017 Starndard版でテストお願いします。可能ならば試用版のPro版もお願いします。

    ・Acrobat2017への参照設定の再設定
    ・16、17行目はExcel用、Access用にコメント編集
    ・実行(VBA)ファイルと同じフォルダにsample_old.pdfを置く
    ・実行結果は Debug.Print でVBAイミディエイト上に表示

    以下はコチラでの実行結果です。
    Office 2019 + Acrobat 2017 の試用版のProバージョン(+Update 2017.011.30156:Acrobat2017Upd1701130156.msp)のみです。

    ※画像をクリックすると拡大表示します。

    1)PDFの更新前 (sample_old.pdf)

    2)PDFの更新後 (sample_new.pdf)

    3)Access 2019 のVBAでの実行結果

    4)Access 2019 の参照設定

    5)Excel 2019 のVBAでの実行結果

    6)Excel 2019 の参照設定

    【テスト-2】
    遠藤さんのVBAに変更を入れて再度テストもお願いします。

    1)変更前
    001 With objPDDoc.GetJSObject
    002 wkText = .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value
    003 .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value = "Test"
    004 End With

    2)変更後
    001 With objPDDoc.GetJSObject
    002 wkText = .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value
    003 Debug.Print "wkText-1=(" & wkText & ")"
    004 .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value = "Test"
    005 wkText = .getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]").Value
    006 Debug.Print "wkText-2=(" & wkText & ")"
    007 End With

    getFieldの動作をもう少し細かく見たいです。

    「テスト-1」が上手くいくことを祈って、「テスト-2」との違いを考えたいです。

    以上、遠藤さんのテスト結果から、次を検討したいと思っています。

  12. 管理者様
    詳細にご連絡を頂き、大変ありがとうございます。
    【テスト-1】
    頂いた「Database4.accdb」を実行したところ、sample_new.pdf、Debugの結果とも正しい結果が表示されました。またソースを自分のaccdbにコピーして実行しても同じように正しい状態でした。
    【テスト-2】
    こちらは、PDF、Debug結果とも、変更前の値が表示されていました。

    この結果から、現状の環境でも「PDFへの値設定はできる」ことが確認できました。誠にありがとうございました。
    この後、まずは頂いたサンプルのコーディングに合わせて修正してみようと思います。
    取り急ぎ、結果をご報告させて頂きます。

  13. 管理者様
    コーディングをサンプルに合わせて値を変えるイメージで修正しましたが(大きな変更はありませんでした)、NGでした。
    もしかしたらPDFに問題があるのかもしれません。
    Actobat7の時は、AcrobatDesignerという機能を使って、階層みたいな状態をみることができましたが、2017では同様の機能はなく、「LiveCycleDesignerで開く」と表示がでますが、ないので開けません。
    ※大変失礼なお願いとは承知しておりますが、もし可能でしたら、利用しているPDFを管理者様にお渡ししてみて頂くことは可能でしょうか。

  14. 遠藤さんへ
    ※1つ前のコメントは後で見ました。

    ココまでのテスト結果から判断させてもらうと

    1)Acrobat2017での通常のOLEとOLEからAcrobatへ直接接続?するJSObjectは問題なく動作する。

    2)Acrobat 2017で以下の階層構造フィールドは扱うと、エラー又は無効になっていると予測できる。
    getField("us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]")
    又は階層構造フィールドの指定が変わるのかもしれない。

    次に確認です。

    1)PDFの文書プロパティの「セキュリティ」部分の「文書に関する制限の概要」の内容が知りたいです。
    ※「Ctrl + D」で文書プロパティが表示されます。

    1.1) 全て「許可」なのか?

    1.2) Acrobat 7とAcrobat 2017で同じ内容となっているのか?
    もしかしたら同じPDFなのにセキュリティ面で異なる扱いになっているのかもしれない。つまり、参照(コピー)は許可だが、更新は不可とか。

    2)PDF内にAcrobat JavaScriptは存在するのか?
    環境が変わると更新を無効化するロジック等が存在するのかもしれない。(そんなロジックが作れるかは不明です)
    存在の確認は以下のURLを見ればやり方が分かります。
    http://ac-javascript.nnn2.com/?p=27
    存在したら、(可能ならば)その内容を知りたい。

    3)上記URLを参考にして以下を実行してください。

    3.1) sample_old.pdf をAcrobat2017で開いて、以下のAcrobat JavaScript(2行)を実行します。

    this.getField('Text1').value='Test-1';
    this.getField('Text2').value='Test-2';

    sample_old.pdfの1頁目に'Test-1'が、2頁目に'Test-2'が表示されたらOKです。

    3.2) 上記の 3.1 が出来たら、次は
    遠藤さんの問題のPDFをAcrobat2017で開いて、以下のAcrobat JavaScript(4行)を実行します。

    wk1=this.getField('us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]').value;
    this.getField('us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]').value = 'Test';
    wk2=this.getField('us-request[0].ContentArea1[0].sfApplicantInformation[0].sfApplicantName[0].lastName[0]').value;
    app.alert('wk-1=(' + wk1 + ') wk-2=(' + wk2 + ')');

    正常ならば、ダイアログが表示され、変更前と変更後の内容が表示されます。
    実行エラーになれば、階層構造に何らかの問題(違い)が存在する事になります。(又はこのスクリプトの文法エラーかもしれない。)

    以上で、何かが見えてくることを祈ってます。

    遠藤さんへ。
    コチラのお願い(調査)は全てやる必要は無いです。遠藤さんの判断とペースで運んで下さい。

    >・・可能でしょうか。

    23:56 頃に送り先を送りました。

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

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

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