好的,这是独家新闻。我从邮局得到一张几乎完全锁定(仅查看)的PDF文件。我必须创建一个Web应用程序,用户可以在其中键入书签名称,以便在PDF中显示正确的页面。我知道没有办法以编程方式跳转到特定书签。文档中没有命名目标,也无法创建它们。有没有办法通过JavaScript以编程方式从PDF文档中的书签中提取页码?我可以遍历书签找到正确的书签并阅读页码吗?为什么要这么严重?
答案 0 :(得分:1)
我的公司Atalasoft制作了一个Ajax/asp.net control,它有能力做你想做的事。它可以让你显示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;
}
当然,如果您只是想找到一个,可以修改访问者以获取谓词和短路。
现在要弄清楚如果你有一个特定的书签你想去哪个页面并不像拉出页面索引那么简单。这是因为书签不必转到特定页面。书签具有与其关联的动作,该动作可以是单击书签时要执行的操作的列表。例如,我可以进行单击操作,该操作是首先交换第一页和最后一页然后转到第一页的两个操作的列表。
所以你要做的是获取点击操作并迭代列表并尝试找到“转到视图”操作,然后将目标识别为页面索引并抓住它。
是的,这是比你想象的更多的步骤,因为PDF的指定比它需要的更丰富。目标页面可以是索引页面,但它也可以是本地文件系统上不同文档中的页面,因此我们需要检查以查看我们在每一步中的步骤。