サイトマップ

▼ サイトの紹介

このサイトはExcel VBAから、Acrobat  アプリケーションをプログラミング操作するOLE機能について解説しています。

Adobe社はこのOLE機能の事を「IAC」と表現しています。

(注意:Adobe Readerだけでは使用出来ません)

Adobe社提供のSDK資料を元にサンプルを加えて説明をしています。

サイト管理人もご覧下さい。

▼ 当サイトの使い方

当サイトをうまく使う上での手順を以下に示します。

  1. 最初に「Acrobat SDK:OLE objects and methods図を入手する」にあるオブジェクト連携図を手に入れます。出来れば印刷する方が見やすいです。1頁です。
  2. 下記の「Excel」、「Acrobat」、「ダウンロード」、「SDK」、「備考」にサッと目を通します。「その他&メモ」は特に見なくてもイイです。
  3. 自分が目的とする処理を探しながら、印刷したオブジェクト連携図を元にサイト記「Object & List」下を上からクリックしてザックリと内容を見ます。各オブジェクトのメソッドの詳細は後にして全体で何が出来て、何が出来ない(サポートされていない)かを把握します。
    Acobat OLE 以外の選択」も見て下さい。
  4. 目的が解決出来ない時は、キッパリとあきらめてAdobe社の日本語「Acrobatフォーラムで相談します。当サイトより質が高い。
  5. それでもダメなら、当サイトにコメントを入れてみます。サイト管理人がある程度、判る範囲でお答えをします。
    (お願い:管理人を「様」での呼び方はご遠慮下さい。管理人さん、で十分です。)

▼ Excel

  1. Excel からAcrobatを操作する訳
  2. Excel から PDFファイル を作成&操作出来る
  3. Excel のオブジェクトブラウザ
  4. Excel からAcrobatを起動する
  5. Excel からPDFファイルを起動表示する
  6. Excel サンプル:PDFの文書プロパティを表示する
  7. 上記7のサンプルファイルの実行エラー
  8. Excel VBA 実行エラー時のメッセージ
  1. Excel でOLEの参照設定をする
  2. Excel でOLEの参照設定をする (AFormAut の追加)
  3. Excel でOLEの参照設定をする (Stream の追加)
  4. Excel でOLEの参照設定をする (MSXMLの追加)

▼ Acrobat

  1. Acrobat SDK:OLE objects and methods図を入手する
    ここで示す図は必ず入手する必要があります。
    これが無いとオブジェクト連携が判らなく、OLE(IAC)操作が出来ません。
  2. Acrobatアプリケーションを閉じる(実は簡単に出来ない)
  3. Acrobat OLEのエラーを防ぐVBAロジック
  4. Acrobat OLE 使用上の注意事項
  5. Acrobatプログラミングにおける技術上の制約やライセンス上の制約
  6. PDFファイルを作成、及び操作する開発者に対しての注意事項
  7. Windows のコマンドラインから Acrobat や Adobe Reader を使用して印刷する方法
  8. PDFドキュメントの文書フラグとは
  9. PDF バージョンとは
  10. PDFバージョンの変化
  11. ExportTask.xml
  12. 一括で複数ファイルを処理(アクション、バッチ処理)
  13. PDF の3つのパスワード
  14. PDFのパスワードは32文字まで
  15. 印刷の問題点を解決
  16. PDF内での座標の起点
  17. Acrobatとレジストリ
  18. PDF上のテキストとその座標

▼ ダウンロード

  1. 各種サンプルのダウンロード
  2. Adobe Acrobat 9.1 SDK のダウンロード
    SDKをダウンロードしてサンプル、解説PDF,HTML等を入手する必要があります。
    Adobe Acrobat X SDK のダウンロード情報も入ってます。
  3. Adobe Acrobat 8.1 SDK のダウンロード
    この 8.1 バージョンのSDKは現時点(2013/10/03)で一般公開されてません。
    情報が入り次第、掲載します。
  4. Acrobat製品別ダウンロード先 URL
  5. AcroPDFLib.AxAcroPDF:Excel VBAサンプル(A)
  6. AcroPDFLib.AxAcroPDF:Excel VBAサンプル(B)
  7. Adobe Readerの各種バージョンのダウンロード

▼ SDK

  1. AcrobatプログラミングにおけるMenu and Toolbar Button Names 一覧
  2. PDDocのGetJsObjectのオブジェクト構造図が見当たらない
  3. Acrobat SDK:正誤表
    Acrobat SDK v8.1ドキュメントに記載ミスが有ります。
  4. Acrobatに関するSDKが Acrobat Developer Center からダウンロード出来ます。
  5. Acrobat JavaScript における「Safe Path:セーフパス」についての注意事項
  6. Acrobat SDK公開Webサイト URLの取得方法

▼ 備考

  1. JavaScriptの解説はAcrobat v7 v8 共に英語版です。しかし、旧バージョンですがコメントを頂いた方から日本語版のAcrobat JavaScript解説PDFが見つかりました。以下がそのPDFです。
    http://www.adobe.com/jp/support/products/pdfs/acrojs_j.pdf
  2. [2009/1/7] AcroExch.AVDoc:Open メソッド でバグ?を発見しました。Acrobat v8.1.3 v9.0が対象です。

 

▼ その他&メモ

  1. OCR機能:読んde!ココと比較した結果
  2. アドビ(Adobe)製品に関するRSSの情報
  3. 添付ファイルの扱いには注意が必要
  4. AcrobatはPDF作成ソフトの標準では無くなる?
  5. Acrobat PDF は国際標準化された
  6. 手書きPDF入門」 リンク
  7. planet pdf (PDF関連の英語サイト) リンク
  8. デフォルトプリンタを一時的に変更する方法
  9. Delphi(デルファイ,デルフィ)言語からの使用方法
  10. Acrobat使用時のレジストリ変化を取得する方法
  11. オブジェクトは値では無く、参照情報を持つ
  12. Adobe Reader で PDF ファイルを表示 / 印刷する方法
  13. サンプル:RGB値の一覧(カラー番号)
  14. 「・・このバージョンの Acrobat ではサポートされていない新しい形式・・」警告メッセージへの対応

▼日本語の資料

日本語版で公開されている技術情報が非常に少なく、また対応バージョンも古く、作成年度も古いのが多いです。しかし、PDF 又はAcrobat のエンジニア向けの基本的な技術はこの10年間はそれ程進歩していません。よって思った以上に使える事に気がつくはずです。

公開されている情報は今後消滅すると予想されます。必要な情報はバックアップする事をお勧めします。

▼ Acrobat SDK 関連

  1. Acrobat JavaScript Object Specification バージョン 5.0.5
    テクニカルノート# 5186 改訂日:2001年9月14日
    (297頁) Acrobat 5.0 JavaScript リファレンスマニュアル。
    PDF ドキュメントでJavaScript を使用するために必要なすべての情報。
    ※2018/10 リンク先は消滅しました。
  2. Developing Acrobat Applications Using JavaScript
    Adobe Acrobat SDK バージョン 8.0

    (220頁) JavaScript を使用してAdobe Acrobat での開発や拡張したりする方法について
    説明したマニュアル。必読!
  3. JavaScript for Acrobat 3D Annotations API Reference
    Adobe Acrobat SDK 2007年4月バージョン 8.1

    (105頁) 3D 機能(3D注釈のJavaScript API)をユーザに提供したい開発者を対象にしたマニュアル
  4. Parameters for Opening PDF Files(日本語版)
    Adobe Acrobat SDK Version 8.1 April 2007

    (8頁) PDF ファイルをURL やコマンドの中で開く際に使用できるパラメータについて説明したマニュアル
  5. Adobe Acrobat Workshop
    (78頁) Acrobat 7.0 JavaScript、API、IAC等の開発環境に関する概念の説明図
  6. Adobe Acrobat 7.0 Acrobat JavaScript Scripting Guide 2005年1月7日
    (276頁) Acrobat JavaScript を使用して開発したり拡張したりする方法について簡単に説明ししたもの
  7. Programming Acrobat JavaScript Using Visual Basic
    Technical Note #5417 バージョン:Acrobat 6.0 2003年5月

    (14頁) Acrobat 6.0 提供のJSObject と言うOLE オートメーション機能のプログラミング環境に関しての概念を説明したもの
  8. Acrobat JavaScript Scripting Guide
    Technical Note #5430 バージョン:Acrobat 6.0 2003年5月

    (90頁) Acrobat 6 Pro に搭載されている JavaScript 開発環境を使用して Acrobat アプリケーションを開発したり拡張したりする方法を簡単にまとめたもの
  9. Upgrading Plug-ins From Acrobat 5 to Acrobat 6
    Technical Note #5424 バージョン:Acrobat 6.0 2003年7月

    (28頁) Acrobat 6 API の概要を説明し、Acrobat 5 およびそれ以前のプラグインを Acrobat 6 にアップグレードする際に開発者が理解しておくべきことについて説明したマニュアル
  10. Adobe® Solutions Network Developer Program FAQ for Members
    Version 3.0 MAY 2002

    (461頁) ASNディベロッパーサポートプログラム会員から頂いたAcrobat Plug-in API,IAC,Readerに関する質問を整理した情報
  11. Acrobat Developer FAQ
    Adobe Developer Relations 改定:1999年9月2日

    (37頁) 質問および回答形式を整理した情報
  12. Parameters for Opening PDF Files(日本語版)
    Adobe Acrobat SDK Version 8.1 April 2007

    (24頁) Acrobat SDK でよくある質問と回答を整理したもの
  13. Adobe Acrobat 7.0 Acrobat SDK ユーザガイド 2004年12月14日
    (124頁) Acrobat SDKで提供されている機能、Acrobatで提供されている機能とその操作説明等
  14. JavaScript for Acrobat API Reference
    Adobe Acrobat SDK バージョン 8.0

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

▼ Acrobat 一般資料

  1. Adobe Acrobat Security ディベロッパーサポート 2005年4月7日
    (43頁) Acrobat 7.0 の各種セキュリティに関する概念

管理人の独り言

  • 2010/4/26 「Appメソッド一覧」移行完了。かなり見直したので、結構解説が難しくなってしまったかも・・。全部の移行が完了したら、再度見直す事にして、次に行きます。
  • 2010/5/14 データの移行と再リンクが終わりました(汗)。サイトマップの構成も少し見直して・・。後は見直し(リニューアル)する必要有り。OLE(IAC)の全貌が判った時点で細かい部分の追加が必要となった。各頁にかなりの追加と再テストが必要だが既に環境は出来あがっている。本当の踏ん張ると事はココからかもしれない。
  • 2010/5/18 Appオブジェクトの移行が完了しました。
  • 2012/11/12 AFormAut オブジェクトが IAC に含まれていない盲点に orz
  • 2013/10/14 JavaScriptAPIと言う当サイト独自の表現を JSObject と本来の表現に変更する。
  • 2015/5/9 サイトのレイアウトを変更。

▼ Acobat OLE 以外の選択

Adobe Acrobat OLE(IAC)以外で、PDFファイルをプログラミング操作する情報を以下に提供します。

VBA の Shell 関数(又はWscriptのExec関数)で起動する事により、IACには無い機能で複数ファイルの自動化処理が可能だと思われます。

  1. Qpdf
    PDF をコマンドラインで操作するツール
    セキュリティ(パスワード)の設定が出来る!
  2. Poppler
    PDF をコマンドラインで操作するツール
    Xpdf をペースした機能拡張版
    注意:公式サイトからはWin版EXEは配布されてません。
  3. pdf2htmlEX
    PDF をHTMLへ変換する高性能なツール
  4. Coherent PDF Command Line Tools
    非常に多機能なコマンドラインツール
    ライセンスに注意が必要
  5. Xpdf
    PDF をコマンドラインで操作するツール
    Popplerの旧バージョン。安定版。
  6. PDFtk *  ※検証予定(時期未定)
    PDF をコマンドラインで操作するツール  
  7. PDFill PDF Writer: PDF作成ツール
    コマンドラインの使用は有償版のみ。
    無償版と有償版。表示は英語。
  8. ★その他の各種ソフトとツール★
    各種のPDFソフトウェアを一覧でまとめたサイトです。
    たぶん、ココの情報が最新で内容も充実してると思われます。

[コメント入力] <-をクリックするとページの最後にコメント入力が出来ます。
名前(ニックネーム)は必須。メールアドレス(非表示)も必須ですが、適当で結構です。

【更新日:2019/06/05 (11版)】

Acrobat OLEのエラーを防ぐVBAロジック

TOP > *      [...]


Good Smile Racing -Wonder Festival 2015 [Summer] (Makuhari, Chiba, Japan)

概要

AcrobatのOLE操作時に以下のエラーを出してしまう事が有ります。

  1. PDFファイルを開いたままで終了してしまった。
    • 原因:ロジックのミス
  2. 処理は全て終わったのにメモリ上からAcrobatプロセスが消えない。
    • 原因1:ロジックのミスで、処理途中のAcrobat OLEオブジェトが残ってしまった
    • 原因2:VBAのCallByName関数でAcrobatのOLEを使用した
    • 原因3:PCのスペックによる。メモリからプロセスが消えるのに数秒は掛かる場合がある。
  3. エラーメッセージ「・・オブジェクトを作成できません。」が出る
    • 原因:不明。メモリ上にプロセスが存在しないからと予測している。

この対処方法です。これ以外にエラーを減らす部分も紹介します。

基本ロジック(1)

Acrobat OLEのエラーに対処したVBAロジックの基本です。【x】の部分を見て下さい。後で理由を説明します。

001 Option Explicit
002
003 ' 【0】この位置での宣言は非推奨
004 'Private gobjAcroApp As New Acrobat.AcroApp
005 'Private gobjAcroAVDoc As New Acrobat.AcroAVDoc
006 'Private gobjAFormApp As New AFORMAUTLib.AFormApp
007 'Private gobjAFormFields As AFORMAUTLib.Fields
008
009 '***************************************************
010 ' Main
011 '***************************************************
012 Sub Main()
013 '【1】Acrobatプロセスの強制終了:事前
014 Call TerminateAcrobat
015
016 Dim i As Long
017 Dim sPDF(2) As String
018
019 sPDF(0) = "D:\A.PDF"
020 sPDF(1) = "D:\B.PDF"
021 sPDF(2) = "D:\C.PDF"
022
023 For i = 0 To UBound(sPDF)
024 Call Loop_Syori(sPDF(i))
025 Next i
026
027 '【2】Acrobatプロセスの強制終了:最後※非推奨
028 ' Call TerminateAcrobat
029 End Sub
030 '***************************************************
031 ' PDFの処理 ループで呼ばれる
032 '***************************************************
033 Sub Loop_Syori(sPDF As String)
034 Dim bRet As Boolean
035
036 '【3】 Acrobat OLE 変数の宣言
037 Dim objAcroApp As New Acrobat.AcroApp
038 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
039 Dim objAFormApp As New AFORMAUTLib.AFormApp
040 Dim objAFormFields As AFORMAUTLib.Fields
041
042 '【4】 Acrobatプロセスをメモリに乗せる
043 objAcroApp.CloseAllDocs '開いたPDFを全て閉じる
044 objAcroApp.Hide '稀に表示されるので隠す
045
046 'PDFの各種処理
047 bRet = objAcroAVDoc.Open(sPDF, "")
048 '
049 '
050 '
051 '続行不可能なエラーが発生「Goto Err_Skip:」
052 '
053 '
054 '
055 '閉じる
056 bRet = objAcroAVDoc.Close(False)
057
058 '【5】 エラー時のスキップ先
059 Err_Skip:
060 On Error Resume Next 'これ以降は強制実行
061
062 '【6】 Acrobatアプリケーションの終了
063 objAcroApp.Hide
064 objAcroApp.Exit
065
066 '【7】 オブジェクトの開放
067 Set objAFormApp = Nothing
068 Set objAFormFields = Nothing
069 Set objAcroAVDoc = Nothing
070 Set objAcroApp = Nothing
071 End Sub
072 '***************************************************
073 ' メモリ上に残っているAcrobatプロセスを強制終了する。
074 '***************************************************
075 Private Sub TerminateAcrobat()
076 Dim items As Object
077 Dim item As Object
078 Set items = CreateObject("WbemScripting.SWbemLocator") _
079 .ConnectServer.ExecQuery( _
080 "Select * From Win32_Process " & _
081 "Where Name = 'Acrobat.exe'")
082 If items.Count > 0 Then
083 For Each item In items
084 item.Terminate
085 Next
086 End If
087 End Sub

「On Error ・・」と「bRet:終了コードの確認」も必要と思われるところには入れて下さい。

【0】 モジュールレベルでの変数宣言

Option Explicit

' 【0】この位置での宣言は非推奨。
'Private gobjAcroApp As New Acrobat.AcroApp
'Private gobjAcroAVDoc As New Acrobat.AcroAVDoc
'Private gobjAFormApp As New AFORMAUTLib.AFormApp
'Private gobjAFormFields As AFORMAUTLib.Fields

モジュールレベルでAcrobat OLEのオブジェクト変数の宣言は高速処理につながる様に見えます。しかし、実際は不可解なトラブルが多発します。詳細は省略。Sub 又は Function 内での宣言にして下さい。

引数での使用には問題ないです。

【1】Acrobatプロセスの強制終了:事前

Call TerminateAcrobat

AFormAutオブジェクト使用時は、開始処理で事前に1回だけ実行する必要が有ります。これはAcrobatプロセスがメモリ上に残っている場合に強制終了させる処理です。詳細は以下を御覧ください。

AFormAutオブジェクト未使用時は不要です。

【2】Acrobatプロセスの強制終了:最後

Call TerminateAcrobat

コールバック関数(CallByName)内でAcrobat OLEオブジェクトを使用するとAcrobatプロセスが終了しない現象が出ています。使用は非推奨です。理由は以下を御覧ください。

【3】Acrobat OLE 変数の宣言

Dim objAcroApp As New Acrobat.AcroApp
Dim objAcroAVDoc As New Acrobat.AcroAVDoc
Dim objAFormApp As New AFORMAUTLib.AFormApp
Dim objAFormFields As AFORMAUTLib.Fields

上記のように「・・As Acrobat.Xxxxxx」の宣言を使用していると、以下のようなピリオドの後に入力候補を表示する事ができます。可能な限りのエラーを減らせます。

ピリオドの後の入力候補

ネット上の古いサンプルを見ると以下のような宣言を見かけます。

Dim objAcroApp As Object
Dim objAcroAVDoc As Object
Set objAcroApp = CreateObject("AcroExch.App")
Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")

「・・As Object」の使用は可能な限り減らしましょう。

【4】開いたままのPDFファイルを閉じる

objAcroApp.CloseAllDocs

何らかなプログラムの異常終了、又はプログラムミスやエラーによる中断で、PDFファイルが開いたままになった状態を解消します。全ての開いたPDFファイルを CloseAllDocs で閉じます。

それと稀に「オブジェクトを作成できません」と言う不可解な実行エラーが出る場合が有ります。CloseAllDocsを事前に実行するとかなり回避できる事が確認されています。多分、Acrobat OLEプロセスのメモリへのロードが遅い時に発生するのではないかと、勝手に予測しています。(勘

CloseAllDocsを無条件に実行しても、この位置では特に悪さはしないと思っているので入れて下さい。

objAcroApp.Hide

稀にですが、ロジックミス等でAcrobat本体が画面上に表示されることが有ります。それを Hide で隠します。この方が処理速度も上がります。おまけのロジックです。

【5】続行不可能なエラー後の処理

途中でランタイムエラー以外の続行不可能なエラーが発生しても、これ以降の処理【6】と【7】は強制実行「On Error Resume Next」します。こうすることで開発性の向上とAcrobatプロセスの未終了をかなり防げます。

CloseAllDocs も追加して無条件実行すれば更にイイです。

【6】Acrobatアプリケーションの終了

objAcroApp.Hide
objAcroApp.Exit

Acrobat OLEの処理が済んだら、Acrobat OLEを終了します。 HideExit は順番も固定です。以下も御覧ください。

【7】オブジェクトの開放

Set objAFormApp = Nothing
Set objAFormFields = Nothing
Set objAcroAVDoc = Nothing
Set objAcroApp = Nothing

Acrobat OLEを終了する時の約束事です。全てのAcrobat OLEオブジェクトをNothingする必要が有ります。以下も御覧ください。

Nothingをせずに、次の操作の処理で使いまわそうとすると思わぬトラブルに遭遇します。必ず最後はメモリから消す為の操作(命令)が必要です。ループ中の処理(Sub Loop_Syori)の連続処理で実際はメモリから消えなくてもです。

基本ロジック(2)

Acrobat OLEの操作に慣れたら、以下の形も可能です。1~2割は処理速度を上げれます。

001 Option Explicit
002
003 '***************************************************
004 ' Main & PDFの処理
005 '***************************************************
006 Sub Main()
007 Dim bRet As Boolean
008
009 '【1】Acrobatプロセスの強制終了:事前
010 Call TerminateAcrobat
011
012 '【3】 Acrobat OLE 変数の宣言
013 Dim objAcroApp As New Acrobat.AcroApp
014 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
015 Dim objAFormApp As New AFORMAUTLib.AFormApp
016 Dim objAFormFields As AFORMAUTLib.Fields
017
018 '【4】 Acrobatプロセスをメモリに乗せる
019 objAcroApp.CloseAllDocs '開いたPDFを全て閉じる
020 objAcroApp.Hide '稀に表示されるので隠す
021
022 Dim i As Long
023 Dim sPDF(2) As String
024
025 sPDF(0) = "D:\A.PDF"
026 sPDF(1) = "D:\B.PDF"
027 sPDF(2) = "D:\C.PDF"
028
029 For i = 0 To UBound(sPDF)
030 'PDFの各種処理
031 bRet = objAcroAVDoc.Open(sPDF(i), "")
032 '
033 '
034 '
035 '続行不可能なエラーが発生「Goto Err_Skip:」
036 '
037 '
038 '
039 '閉じる
040 bRet = objAcroAVDoc.Close(False)
041 Next i
042
043 '【5】 エラー時のスキップ先
044 Err_Skip:
045 On Error Resume Next 'これ以降は強制実行
046
047 '【6】 Acrobatアプリケーションの終了
048 objAcroApp.Hide
049 objAcroApp.Exit
050
051 '【7】 オブジェクトの開放
052 Set objAFormApp = Nothing
053 Set objAFormFields = Nothing
054 Set objAcroAVDoc = Nothing
055 Set objAcroApp = Nothing
056
057 '【2】Acrobatプロセスの強制終了:最後※非推奨
058 ' Call TerminateAcrobat
059 End Sub
060 '***************************************************
061 ' メモリ上に残っているAcrobatプロセスを強制終了する。
062 '***************************************************
063 Private Sub TerminateAcrobat()
064 Dim items As Object
065 Dim item As Object
066 Set items = CreateObject("WbemScripting.SWbemLocator") _
067 .ConnectServer.ExecQuery( _
068 "Select * From Win32_Process " & _
069 "Where Name = 'Acrobat.exe'")
070 If items.Count > 0 Then
071 For Each item In items
072 item.Terminate
073 Next
074 End If
075 End Sub

ループ内でのエラー処理は忘れないで下さい。

経験上、 基本ロジック(1) をお勧めします。理由は

  1. テストとデバッグがしやすい
  2. 再利用がしやすい

Acrobat プロセスの監視

テスト中はタスクマネージャーを起動して、処理が終了したらタスクマネージャーから消えることを確認して下さい。

タスクマネージャーでAcrobatプロセスを監視

メモリに残っていると次の処理で予期せぬ結果になります。その場合は上記で「Adobe Acrobat」プロセスの「タスクの終了」を実行して下さい。

備考

  • 全て経験上の内容です。メーカー公式的な部分は無いです。
  • 宣言の New ではメモリ上にAcrobat プロセスはロードされません。Acrobat OLEのメソッドの実行時に初めてロードされます。

< TOPへ >

VBA(Excel)からAcrobat経由でPDFをプログラミング操作(OLE:IAC)する