【问题标题】:Access PDF Bookmarks from Browser with Javascript使用 Javascript 从浏览器访问 PDF 书签
【发布时间】:2013-03-19 18:21:17
【问题描述】:

好的,这是独家新闻。我有一份来自邮局的几乎完全锁定(仅查看)的 PDF。我必须创建一个 Web 应用程序,用户可以在其中键入一个书签名称,该名称将在 PDF 中显示正确的页面。我知道没有办法以编程方式跳转到特定书签。文档中没有命名的目的地,也无法创建它们。有没有办法通过 JavaScript 以编程方式从 PDF 文档中的书签中提取页码?我可以循环浏览书签以找到正确的书签并阅读页码吗?为什么要这么难?

【问题讨论】:

  • 您是否习惯于使用 Acrobat Reader 和特定的服务器解决方案?
  • 嗨,底座。我们将 IIS 用于所有主要内容,但 Apache 可用。 PDF 将由 Oracle 数据库提供。我正计划编写某种 ASP 页面,或者相反,直接从 Oracle 提供网页 - 在这种情况下很难将页面与数据分开,但这是可行的。 Reader 是我们的默认设置,但我在 Firefox 中使用了 PDF.js 和 Sumatra 插件。不知道如何处理 IE,这是我们的默认浏览器。仅在对象或嵌入标签中显示基本 PDF 给我带来了麻烦。

标签: javascript pdf web


【解决方案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 的指定比它需要的更丰富。目标页面可以是索引页面,但也可以是本地文件系统上不同文档中的页面,因此我们确实需要检查每一步都有什么。

【讨论】:

  • 这看起来可能有效,但正如您所说,Adobe 让它变得比它需要的更复杂。此外,这可能是一个困难的销售 - 我正在与我们的软件霸主核对,看看我们目前是否正在从您那里获得软件许可。再看看这个问题,我在想一个比每次扫描书签更好的主意可能是在处理 PDF 时提取书签页码并将其存储在数据库中 - 这应该会使整个马戏团变得更简单.副手,你知道是否有办法使用 GhostScript 或其他一些脚本机制来做到这一点?
  • 与我的老板和我们的客户交谈 - 我想我试图提供比他们实际需要的更多的功能。感谢 Plinth 和所有为我研究这个问题的人。
猜你喜欢
  • 2015-03-19
  • 2011-02-27
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多