Acrobatフォーラムの下記スレッドで当ブログへのリンクが貼られていることに気が付きました。
VBAでPDFの複数階層のしおり情報を取得したいとのことで、下記記事を参考にされたようです。
上記記事のコードは一番上の階層のしおりしか想定しておらず、下位のしおりの情報は取得できませんので、コードを一部修正する必要が有ります。
Acrobatの操作を行う際、最も参考になるのは公式のリファレンスですが、Bookmarkオブジェクトのページを見てみると、下記のサンプルコードが載っていました。
function DumpBookmark(bkm, nLevel) { var s = ""; for (var i = 0; i < nLevel; i++) s += " "; console.println(s + "+-" + bkm.name); if (bkm.children != null) for (var i = 0; i < bkm.children.length; i++) DumpBookmark(bkm.children[i], nLevel + 1); } console.clear(); console.show(); console.println("Dumping all bookmarks in the document."); DumpBookmark(this.bookmarkRoot, 0);
なるほど。
再帰で列挙していけば良いわけですね!
上記サンプルを参考に修正したコードが下記になります。
(相変わらずAcrobatのプロセスが残り続けてしまう問題が発生してしまうようだったので、強制終了する処理を入れてあります。)
Option Explicit Public Sub Sample() Dim app As Object 'AcroApp Dim avdoc As Object 'AcroAVDoc Dim avpv As Object 'AcroAVPageView Dim jso As Object Dim bkm As Object Const PdfFilePath = "C:\Test\テスト用文書(見出し).pdf" Set app = CreateObject("AcroExch.App") Set avdoc = CreateObject("AcroExch.AVDoc") If avdoc.Open(PdfFilePath, "") = True Then app.Show 'アプリケーション表示 Set avpv = avdoc.GetAVPageView Set jso = avdoc.GetPDDoc.GetJSObject Set bkm = CallByName(jso, "bookmarkRoot", VbGet) DumpBookmark bkm, avpv avdoc.Close 1 app.Hide: app.Exit End If TerminateAcrobat 'プロセスが残った場合強制終了 End Sub Private Sub DumpBookmark(ByVal bkm As Object, ByVal avpv As Object) 'しおりの情報を出力 Dim cld As Variant, cld2 As Variant On Error Resume Next cld = CallByName(bkm, "children", VbGet) On Error GoTo 0 If IsEmpty(cld) = False Then For Each cld2 In cld CallByName cld2, "execute", VbMethod 'しおり選択 Debug.Print "名前:" & CallByName(cld2, "name", VbGet) & vbTab & "ページ:" & avpv.GetPageNum + 1 DumpBookmark cld2, avpv Next End If End Sub Private Sub TerminateAcrobat() 'Acrobatのプロセス強制終了 Dim items As Object Dim item As Object Set items = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer.ExecQuery("Select * From Win32_Process Where Name = 'Acrobat.exe'") If items.Count > 0 Then For Each item In items item.Terminate Next End If End Sub
簡単な修正ですが、一先ずこれでPDFの複数階層のしおり情報を取得できるようになりました。
この記事へのコメントはありません。