OK、これがスクープです。郵便局からほぼ完全にロックダウンされた(表示のみ)PDFを持っています。PDFで正しいページを表示するブックマーク名をユーザーが入力できるWebアプリケーションを作成する必要があります。プログラムで特定のブックマークにジャンプする方法がないことを私は知っています。ドキュメントに名前付きの宛先はなく、それらを作成する方法もありません。JavaScriptを介してPDFドキュメントのブックマークからプログラムでページ番号を抽出する方法はありますか?ブックマークをループして正しいブックマークを見つけ、ページ番号を読み取ることはできますか?なぜこれはそれほど難しいのですか?
1 に答える
私の会社であるAtalasoftは、必要なことを実行する機能を備えたAjax/asp.netコントロールを作成しています。PDFを表示できるようになり、サーバー側では、ブックマークと宛先を取り出してクライアントコントロールに送信するのはそれほど難しくありません。
基本的に、Acrobat(または他の)ビューアを、サーバー側でPDFを分析し、ビューアにどこに行くかを指示できる画像ベースのビューアに置き換えます。
ブックマークを引き出すためのサンプルコードを次に示します。このコードは、思ったよりも複雑に見えます。これは、PDFのブックマークが完全なツリーであるためです。
delegate void BookmarkReceiver(PdfBookmark bookmark);
public void VisitBookmarks(PdfBookmarkList bookmarks, BookmarkReceiver receiever)
{
foreach (PdfBookmark mark in bookmarks)
{
receiver(mark);
VisitBookmarks(mark.Children);
}
}
// here's a matcher:
IList<PdfBookmark> FindBookmarksWithName(string s, PdfBookmarkTree tree)
{
List<PdfBookmark> marks = new List<PdfBookmark>();
VisitBookmarks(tree.Bookmarks, mark => if (mark.Text == s) marks.Add(mark));
return marks;
}
もちろん、1つだけを見つけたい場合は、訪問者を変更して述語を取得し、短絡させることができます。
ここで、特定のブックマークがある場合にどのページに移動するかを判断することは、ページインデックスを引き出すほど簡単ではありません。これは、ブックマークが特定のページに移動する必要がないためです。ブックマークにはアクションが関連付けられており、そのアクションは、ブックマークがクリックされたときに実行する操作のリストである場合があります。たとえば、最初に最初のページと最後のページを入れ替えてから最初のページに移動する2つのアクションのリストであるクリックアクションを作成できます。
つまり、クリックアクションを取得し、リストを繰り返し処理して「表示に移動」アクションを見つけてから、宛先をページインデックスとして識別し、それを取得します。
はい、PDFは必要以上に豊富に指定されているため、これはあなたが考えるよりもはるかに多くのステップです。宛先ページはインデックス付きページである可能性がありますが、ローカルファイルシステム上の別のドキュメントのページである可能性もあるため、すべてのステップで何が行われているかを確認する必要があります。