を探していたらこの辺にjavascriptのリファレンスがあることが判明した。
adobeのjavascriptの実装(特にオブジェクトやプロパティやメソッド)が全くわからなかったため読み進めてみると、なんということでしょう(棒読み)、上記実例がそのまま掲載されているではないか。
引用開始
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);
引用終了
console(デバッガ?)に書き出すという内容であるが、consoleの場合吐き出せる量に限度があるようだ(それを超えるとオーバーフロー)。また、せっかくのしおりなのに、ページ番号が抜き出せない。さらに、階層記号(上記では+-)が付加されているのでプレーンテキストにしたい。
いろいろ調べたが、しおり(bookmark)にはpageNum的なプロパティがねえ。あればそれをコード上に追記すればいいだけなんだが。
きわめていやな方法だが、しおりを逐一実行し、現在の頁を取得して吐き出すというリソースを食いそうな方法で実装してみた(カンマ区切り)。
オーバーフロー対策としては、結果をそのままPDFとして書き出せることが判明。それを採用した。
function DumpBookmark(bm, nLevel, rep) { var s = ""; for (var i = 0; i < nLevel; i++) s+=" "; bm.execute(); rep.writeText(s + bm.name + "," + this.pageNum); if (bm.children != null) for (var i = 0; i < bm.children.length; i++) DumpBookmark(bm.children[i], nLevel + 1, rep); } rep = new Report(); DumpBookmark(this.bookmarkRoot, 0, rep); rep.open("bookmarkList.pdf");
このJavascriptを実行すると、しおり名+頁番号が出力された「bookmarkList.pdf」というファイルが出力される(保存はされない)。ただし、実行には結構な時間がかかるので注意。
バージョン6と7で動作確認した。
2010/06/16にAcrobat9に対応