AdobeProfessonalでpdfのしおりを抽出する方法

を探していたらこの辺javascriptのリファレンスがあることが判明した。
adobejavascriptの実装(特にオブジェクトやプロパティやメソッド)が全くわからなかったため読み進めてみると、なんということでしょう(棒読み)、上記実例がそのまま掲載されているではないか。

引用開始

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に対応