サイトマップ

▼ サイトの紹介

このサイトは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版)】

「サイトマップ」への203件のフィードバック

  1. 管理人さん
    またまた早々のご回答ありがとうございます。
    提供情報が足りないかったようですみません。
    おっしゃる通り1)の「ココ」で貼っていただいたサンプルを参考にしました。
    2)の方法は実施してみましたが、結果は同じでした。
    Acrobat9proでも確認してみました(「Acrobat JavaScriptを使用」はチェック済)。4)の表示は双方とも出ますが、JavaScriptの方だけ[許可」をクリックしても表示されませんでした。
    こちらの環境がどこかに問題があるのかもしれませんね。

    vbaで[Webリンクを開く]を設定するにはCPDFが必要でしょうか?

  2. M さんへ。
    検証中ですが。

    this.getURL('https://pdf-file.nnn2.com’);
    上記を以下に変更して確認をお願いします。
    app.launchURL("https://pdf-file.nnn2.com", true);

    ReaderとAcrobat共にテスト願います。
    詳細は後で。

  3. 管理人さん

    色々と情報ありがとうございます。
    app.launchURL、AcrobatReaderとAcrobat9Proで動作確認できました。
    AcrobatDCProは今確認できないので、明日改めて報告します。

  4. Mさんへ。
    以下はメーカーの公開情報では無く、当サイトのテスト結果です。
    環境:Acrobat XI Pro + Acrobat Reader DC + Win10 64bit Pro

    ▽現象
    Acrobat本体動作でしおりにAcrobat JavaScriptの
    this.getURL('http://~');
    を入れても処理しない。実行エラーになっていると思われる。
    Acrobat再起動、OS再起動、環境設定の変更等をしたが解決しない。
    Acrobat Readerでは問題なく動作する。

    ▽対処方法
    this.getURL('http://~');
    を、
    app.launchURL("http://~", true);
    に変更する。

    ▽this.getURLが動作しない件について。Acrobatのみ。
    マニュアルを見ると「ブラウザに表示する」機能とは書かれていない。
    但し、Acrobat Reader上では問題なく動作する。環境設定の「信頼性管理マネージャー」でthis.getURLを制御も出来る。
    this.getURLは使う環境によって、動作が変わるのかもしれない。バッグっぽいが、詳細は不明。

    ▽this.getURLとapp.launchURLの違い
    メーカーの公開マニュアルだけでは判断できない。
    Web表示はapp.launchURLを使用するが正解?と言う程度。

    ▽Web表示(URLリンク)へのセキュリティ警告
    PDFからURLリンク等でWebサイトを開くときにはデフォルトで以下のセキュリティ警告が表示される。

    [環境設定]->[信頼性管理マネージャー]->[設定の変更]で以下に変更すれば、上記画面を表示せずに無条件にWeb表示する事もできる。

    但し、これはセキュリティ上の問題となる。(みたい
    Acrobat ReaderもAdobe Acrobat共に同じ。

    ▽その他のメモ
    1) Acrobat JavaScriptがAcrobat Readerで動作して、Adobe Acrobatで動作しない事象は今回が初めて。
    2) Acrobat ReaderとAdobe Acrobatの環境設定の内容は別々の場所(=レジストリ)に保存される。よって、Acrobat ReaderとAdobe Acrobatの環境設定は相互に影響はしない。
    注意:全ての設定を確認したわけでは無く、過去の経験から。

    以上。
    Acrobat JavaScriptに精通している訳では無いので、結果はWebマニュアルとテストから出しました。
    ご検証ください。

  5. 管理人さん
    丁寧な説明ありがとうございました。
    細かい検証まですみません。
    コピペに頼る初心者で、どこがダメなのかわからず頭を悩ませていました。
    拙い質問に親切なご回答本当にありがとうございました。
    このサイトを今後も参考にさせていただきますので、宜しくお願いします。

  6. Excel vbaでpdfを操作して、印刷をしたいのですが、その際、通常のプリンターを切り替えて印刷がしたいです。
    しかし、以下のコードを動かしても、
    「DocuCentre-V 7080 (1) 」からしか印刷がされず困っており、ご連絡をいたしました。
    ご教示いただけますと幸いです。

    以下、各バージョンとなります。
    Adobe Acrobat standard 2017
    Excel 2013
    Windows8.1

  7. 先ほどコメントをさせていただいたものです。
    ・・・でコードを挟んだのですが
    コードをお送りすることができなくて困っております。

    ご教示いただけますと幸いです。
    ご迷惑をおかけし、申し訳ありません。

    もし可能であれば
    メールアドレスにご連絡をいただけますと大変助かります。

  8. Sub PDF_print()
    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    Dim lRet As Long
    Dim base As String
    Dim yobi As String
    Dim myPrinter As String
    Dim ActivePrinter As String
    myPrinter = "DocuCentre-V 7080 (1) on Ne13:"
    Application.ActivePrinter = "(両面短辺2UPホチ)"
    base = Sheets("入力シート").Cells(6, 2).Value
    yobi = base & Sheets("入力シート").Cells(6, 2).Value
    lRet = objAcroApp.Show
    lRet = objAcroAVDoc.Open(yobi)
    lRet = objAcroAVDoc.PrintPages(0, 0, 2, 0, 0)
    lRet = objAcroAVDoc.Close(1)
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing
    Application.ActivePrinter = myPrinter
    End Sub

  9. アオちゃん さんへ。

    ソースコードでやりたいことが分かりました。
    コチラにPDFを指定して印刷をするサンプルが在ります。プリンターも指定できます。本来の公開サイトは既に閉鎖していますが、シンプルな操作になっています。ダウンロードしてご利用下さい。

    それと、情報のやり取りは公開を前提にしているのでメールでのやり取りはしません。
    参考になれば幸いです。

    ▼2021年6月29日 8:08 追加
    Excel(=Excel VBA)にPDFを印刷する機能は無いです。
    よって、Excel VBAからAcrobat(=Acrobat OLE)に対して印刷をする命令を出します。
    >lRet = objAcroAVDoc.PrintPages(0, 0, 2, 0, 0)
    上記がそれです。
    また、これはOS上のデフォルトのプリンターにしか印刷できません。
    >Application.ActivePrinter = "(両面短辺2UPホチ)"
    上記はExcel内の印刷機能を使って印刷する時のプリンターを指定する物で、Acrobat(=Acrobat OLE)はこの設定を見ません。
    アオちゃんさんはこの点を勘違いしてるように見受けられます。

  10. 管理人さんへ

    こんにちは。
    シカオと申します。
    いつもこちらのサイトを参考にさせていただいております。

    現在、PDFの1ページ単位のカラー情報を取得する方法を模索しておりますが、なかなかいい方法が見つけられずにいます。
    バイナリデータまで解析すれば可能なのでしょうが、わたくしの知識不足で難しい為、出来れば参照せずに解決したいです。。。
    VBA以外の方法も選択肢に入れて調査しています。

    何かいい方法があったら教えて頂けないでしょうか。
    よろしくお願いいたします。

  11. こんばんは。

    教えていただきたいことがあります。

    以下のコードを使って
    pdfを印刷しているのですが、
    15ページあるpdfが2ページまでしか印刷されません。

    objAcroAVDoc.PrintPages(0, 0, 2, 0, 0)

    第2引数を変更すればいいとは思うのですが、
    繰り返し構文で複数のファイルを
    印刷にかけようとしているため、
    数字を決めて固定することは難しいです。

    何か良い解決策はないでしょうか。
    教えていただけますと幸いです。

  12. あおちゃん さん
    はじめまして。

    AcroExch.AVDoc: PrintPages メソッド」にコチラ「AcroExch.PDDoc: GetNumPages メソッド」のPDFのページ数を追加したサンプルが以下です。

    001 Private Sub CommandButton18_Click()
    002
    003 Const OutF = "I:\TEST\AAA.PDF"
    004
    005 Dim objAcroApp As New Acrobat.AcroApp
    006 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    007 Dim objAcroPDDoc As Acrobat.AcroPDDoc
    008 Dim lPageCount As Long
    009 Dim lRet As Long
    010
    011 'Acrobatアプリケーションを起動する。
    012 lRet = objAcroApp.Show
    013 'PDFファイルを開いて表示する。
    014 lRet = objAcroAVDoc.Open(OutF, "")
    015
    016 'PDDocを取得する
    017 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
    018 'ページ数を取得する
    019 lPageCount = objAcroPDDoc.GetNumPages()
    020
    021 'PDFファイルの頁を指定して印刷する。
    022 lRet = objAcroAVDoc.PrintPages(0, lPageCount - 1, 2, 0, 0)
    023
    024 'PDFファイルを閉じます。
    025 lRet = objAcroAVDoc.Close(1)
    026
    027 'Acrobatアプリケーションを終了する。
    028 lRet = objAcroApp.Hide
    029 lRet = objAcroApp.Exit
    030
    031 'オブジェクトを強制解放する
    032 Set objAcroAVDoc = Nothing
    033 Set objAcroPDDoc = Nothing
    034 Set objAcroApp = Nothing
    035
    036 End Sub

    行 019 で印刷するPDFの全ページ数を取得しています。
    行 022 で「- 1」しているのはページ番号の開始が1ではなく、ゼロの為です。
    上記で解決できるでしょうか。

  13. 管理人様

    ありがとうございます。
    調べてもなかなか出てこなくて
    困っていたところ
    助けていただいて本当に助かります。

    これでやってみようと思います!

    また教えていただけると幸いです!

  14. 管理人さん

    PrintPdf関数について質問です。

    以下のサイト(*)でAdobeReaderでの印刷方法について
    記載されていますが、
    Acrobat Standard 2017で印刷する場合には、
    どのようにコードを記載する必要があるのかを
    御教示いただければ幸いです。

    【*】
    http://pdf-file.nnn2.com/?p=752
    (もしくは
    http://web.archive.org/web/20150513101343/http://www.f3.dion.ne.jp/~element/msaccess/AcTipsAdobeReader.html#PrintPdf )

  15. あおちゃん さんへ。

    Acrobat Readerだけを起動する様にこの関数は作られています。
    Acrobatは起動できません。

    コチラコチラを参考にして、作ってみてはどうですか?

  16. 管理人様
    現在、ExcelVBAのコードで、下記の処理のマクロを作成したいのですが、方法がなかなか見つからず困っております。
    ---やりたい事
    Acrobat Pro DCをインストールした際に、Excelのリボンに増えるAcrobatタブのPDF作成→ページ指定して作成を実行
    ---

    なぜ上記の方法と同じ処理をしたいのかといいますと、
    エクセル内に設置したリンク(シート間を移動するリンクです)を保持したままPDFの作成を行いたいからです。

    管理人様は上記の方法を何かご存じでしょうか?
    もしご存じでしたら教えていただけますと幸いです。

  17. 774 さん はじめまして。

    質問は「Acrobat PDFMaker」のCOM(OLE)によるVBA操作と思われます。
    調べたところ、コレに関する情報はセキュリティに関連する部分が有るという事でメーカー側(Adobe社)が非公開扱いにしてる様です。それらしき表現の公式文書も見かけました。実際にいくつかの部分をネット検索しても、ほぼ無いに等しい状態です。
    但し、日本語で丁寧な解説をしているサイトを1つ見つけました。サイト管理者に問い合わせたところ、「10年前の記事で試行錯誤での内容」との事で、何かしらの技術資料をもとに書かれた内容では無いとのことです。よってコレ以上の質問は無理と思われます。海外のサイトも検索しましたが、現状ではココのサイトの内容が一番詳しいと見受けられます。
    この部分(PDFMaker、API)は以前から気になっていた部分なので、調査は続けたいと思っています。どこかに「転がってないか」と。
    現状で返答できる内容は以上です。
    (願:なんとか、技術文書を手に入れたい!)

    ▼追加
    ・無料のメーカーDeveloperサイトでも情報は無いです。

  18. 管理人様
    調べてくださりありがとうございます!
    頂いたサイトを参考に自分でももう少し調べてみます!

  19. Adobeが公開している、JavaScriptの公式リファレンスに載っている複数階層のBOOKMARKの情報をコンソールに出力するサンプルを、VBA化してくださった方がいらっしゃいまして。

    そのVBAのコードではしおりのテキストと移動先ページの情報は取り出せるのですが、複数階層のレベル情報の取り出しまでは考慮されていません。

    公式のサンプルはしおりのテキストの先頭に「+-」という文字列を付け加えて、コンソール内に疑似的なツリー状態を再現してます。

    VBAでも複数階層のレベルの情報も取り出したいのですが、そのVBAコードをいじってみたものの、知識がないので、レベル情報を取り出すコードを書けませんでした。

    本来なら作成者の方にお聞きするべきところなんですが、理由は不明なのですが、問い合わせたもののお返事がいただけませんでした。

    困り果てて、失礼ながら管理人さんにご相談させていただきました。
    よろしければ、ご教示いただければ幸いです。

    よろしくお願いします。

    公開されているコードは下記です。
    直リンクはまずいかもと思いまして、先頭のhを外しております。

    ttps://www.ka-net.org/blog/?p=13440

  20. 管理人さん、初めまして!
    ご挨拶のところをコピーし忘れて、挨拶もせずいきなりお願いだけ話し出す、失礼な行為を働いてしまいました。
    申し訳ありませんでした!

  21. ototoさん はじめまして。

    ご指摘のサイトのVBAコードにしおりの階層を追加したモノが以下です。変数「lLevNo」にしおりの階層が入っています。

    001 Option Explicit
    002
    003 '参照設定:Acrobat(Adobe Acrobat 10.0 Type Library)
    004
    005 Private lLevNo As Long
    006
    007 Public Sub Sample()
    008 Dim objAcroApp As New Acrobat.AcroApp
    009 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    010 Dim objAVPageView As Acrobat.AcroAVPageView
    011 Dim jso As Object
    012 Dim bkm As Object
    013 Const PdfFilePath = "I:\ABC.pdf"
    014
    015 If objAcroAVDoc.Open(PdfFilePath, "") Then
    016 lLevNo = 0
    017
    018 ' objAcroApp.Show 'アプリケーション表示
    019 Set objAVPageView = objAcroAVDoc.GetAVPageView
    020 Set jso = objAcroAVDoc.GetPDDoc.GetJSObject
    021 Set bkm = CallByName(jso, "bookmarkRoot", VbGet)
    022 Call DumpBookmark(bkm, objAVPageView)
    023
    024 objAcroAVDoc.Close 1
    025 objAcroApp.Exit
    026 objAcroApp.Hide
    027 End If
    028
    029 Set jso = Nothing
    030 Set bkm = Nothing
    031 Set objAcroAVDoc = Nothing
    032 Set objAVPageView = Nothing
    033 Set objAcroApp = Nothing
    034
    035 Debug.Print "End"
    036 Call TerminateAcrobat
    037 End Sub
    038
    039 ' 「しおり+ページ番号+階層番号」の情報を出力
    040 Private Sub DumpBookmark( _
    041 ByVal bkm As Object, _
    042 ByVal objAVPageView As Acrobat.AcroAVPageView)
    043 On Error Resume Next
    044 Dim cld As Variant
    045 Dim cld2 As Variant
    046 cld = CallByName(bkm, "children", VbGet)
    047 On Error GoTo 0
    048 If IsEmpty(cld) = False Then
    049 lLevNo = lLevNo + 1
    050 For Each cld2 In cld
    051 CallByName cld2, "execute", VbMethod 'しおり選択
    052 Debug.Print "(" & lLevNo & ") 名前:" & _
    053 CallByName(cld2, "name", VbGet) & _
    054 vbTab & "ページ:" & objAVPageView.GetPageNum + 1
    055 Call DumpBookmark(cld2, objAVPageView)
    056 Next
    057 lLevNo = lLevNo - 1
    058 End If
    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("Select * From Win32_Process " & _
    068 "Where Name = 'Acrobat.exe'")
    069 If items.Count > 0 Then
    070 For Each item In items
    071 item.Terminate
    072 Next
    073 End If
    074 End Sub
    075
    076 ' ★テスト結果
    077 ' (1) 名前:Test-1 ページ:1
    078 ' (2) 名前:Test-2 ページ:1
    079 ' (3) 名前:Test-3 ページ:1
    080 ' (3) 名前:Test-4 Web表示 ページ:1
    081 ' (4) 名前:Test-4-1 ページ:1
    082 ' (1) 名前:表紙 ページ:1
    083 ' (1) 名前:本FAQについて ページ:2
    084 ' (1) 名前:Acrobat ページ:3

    但し、上記はTerminateAcrobatの実行を忘れたり、エラーで処理が中断したりすると大変なことが起こります。

    次が「本当はコチラを使って欲しい」バージョンです。
    問題になっているプロセスがメモリ上に残るのを解消しました。VBAのCallByName関数がAcrobatの何らかのオブジェクトを開放しない状態になっていると予測しています。ならば、CallByName関数を使わなければイイと考えました。事前にコチラの参照設定の追加が必要です。

    001 Option Explicit
    002
    003 '参照設定:Acrobat(Adobe Acrobat 10.0 Type Library)
    004 '参照設定:AFormAut 1.0 Type Library
    005
    006 Sub sample_GetBookmark2()
    007
    008 Dim start As Double: start = Timer
    009 Debug.Print "sample_GetBookmark2 " & Time
    010
    011 Dim sFilePathIn As String
    012 Dim bRet As Boolean
    013 Dim sReturn As String
    014
    015 Dim objAcroApp As New Acrobat.AcroApp
    016 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    017 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
    018 Dim objAFormApp As New AFORMAUTLib.AFormApp
    019 Dim objAFormFields As New AFORMAUTLib.Fields
    020
    021 '前回、処理が中断した場合の安全対策を実行する
    022 objAcroApp.CloseAllDocs
    023 objAcroApp.Hide '稀に表示されるので隠す
    024
    025 'PDFファイルを開く
    026 sFilePathIn = "I:\ABC.pdf"
    027 bRet = objAcroAVDoc.Open(sFilePathIn, "")
    028 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
    029 Set objAFormFields = objAFormApp.Fields
    030
    031 Const sAcrobatJavaScript As String = _
    032 "function DumpBookmark(bkm, nLevel)" & _
    033 "{" & _
    034 " bkm.execute();" & _
    035 " var s = nLevel + '|' + (this.pageNum+1) + '|';" & _
    036 " outL += s + bkm.name + '||' ;" & _
    037 " if (bkm.children != null)" & _
    038 " for (var i = 0; i < bkm.children.length; i++)" & _
    039 " DumpBookmark(bkm.children[i], nLevel+1);" & _
    040 "}" & _
    041 "var outL='';" & _
    042 "DumpBookmark(this.bookmarkRoot, 0);" & _
    043 "event.value=outL;"
    044
    045 'Acrobat JavaScript の実行
    046 sReturn = objAFormFields.ExecuteThisJavascript(sAcrobatJavaScript)
    047 ' Debug.Print "sReturn = " & sReturn
    048
    049 Dim sWk1() As String
    050 Dim i1 As Long
    051 '実行結果を編集
    052 sWk1 = Split(sReturn, "||")
    053 For i1 = 0 To UBound(sWk1) - 1
    054 Debug.Print (i1 + 1) & "-" & sWk1(i1)
    055 Next i1
    056
    057 '変更しないで閉じる
    058 bRet = objAcroAVDoc.Close(False)
    059
    060 'Acrobatアプリケーションの終了
    061 objAcroApp.Hide
    062 objAcroApp.Exit
    063
    064 'オブジェクトの開放
    065 Set objAcroPDDoc = Nothing
    066 Set objAcroAVDoc = Nothing
    067 Set objAFormApp = Nothing
    068 Set objAFormFields = Nothing
    069 Set objAcroApp = Nothing
    070
    071 Debug.Print "処理時間 = " & Timer - start
    072 End Sub
    073
    074 ' ★テスト結果
    075 '
    076 ' sample_GetBookmark2 11:21:39
    077 ' 1-0|1|Root
    078 ' 2-1|1|Test-1
    079 ' 3-2|1|Test-2
    080 ' 4-3|1|Test-3
    081 ' 5-1|1|表紙
    082 ' 6-1|2|本FAQについて
    083 ' 7-1|3|Acrobat
    084 ' 8-2|378|All Platform
    085 ' 9-3|378|Plug-in API
    086 '
    087 ' 349-2|273|Acrobat ReaderでPlug-in
    088 ' 処理時間 = 1.70703125

    メモリ上にプロセスが残ると後々でトラブルが出る事が多々有ります。次回にうまく起動しない、処理結果が変だ、変な画面が表示される、等の原因を特定できない事が起こる可能性が有ります。
    できれば、後者のロジックをお勧めしたいです。
    なお、処理速度は後者が数倍は高速です。

    後者はAcrobat JavaScript部分が「何これ?」ですが、処理の流れは一方通行でシンプルです。

    ゆっくりと、ご検証、ご検討下さい。

    ▼2021/11/03 8:58 追加
    「2階層以上の飛び」&「連続の同一階層」も含めてのテスト検証をお願いします。

    ▼2021/11/03 10:11 追加
    しおりに「ページ移動」以外の動作指定が出来ます。稀に見ることがあります。例えばWebサイトの表示とか。この場合は前者、後者共に人間の手作業が入ってしまいます。よって、動作時は人の監視が必要かもしれません。余談ですが。

  22. 管理人さん、お礼と確認が大変遅くなりまして、申し訳ありませんでした!

    試させていただき、おすすめいただいたコードの高速さに感激しております。
    PDFに付けたしおりを後から修正したいけど、紙をスキャンして作成したPDFへのしおり点けや編集作業は本当に面倒で、常日頃、困り果てておりました。

    おかげさまで、作業効率が格段に上がります。
    本当に、ありがとうございました!

  23. ototo さんへ。
    参考になったみたいで嬉しいです。

    なお、今回の作業で数年前から問題になっていた不可解なエラーの(再現の)特定とその対策を発見しました。偶然にも。その内容は今回の「しおりの抽出処理」でも関係する部分です。ある特定のタイミングで特定の処理を実行すると必ずエラーが発生します。
    現在、その詳細をまとめている最中です。一週間ほどで公開する予定です。お手数ですが一週間後に、またコチラに起こし下さい。

    ▼2021/11/07 追加
    以下を見て、VBAの追加をお願いします。
    AFormAut特有のVBA実行エラー

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードの前後に <code> ・・・</code> タグを入れないとエラー(403)になります。それでもエラーが回避できない時はコメント下さい。個別に対処します。



お仕事で当サイトを見ている方へ
考え込んだら、ご質問下さい。
一緒に解決策を考えましょう。

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