如何获取PDF页面的字节范围?

mk1*_*117 2 html javascript pdf viewer pdf.js

我正在尝试使用 mozilla pdf.js项目加载 PDF 文档,尽管我已经获得了足够的知识,了解如何将文档加载到页面和缩放级别 ( #page=10&zoom=page-fit),并且我检查了查看器的选项,并发现我也可以通过URL参数向PDF文件添加范围请求......我不知道这个功能如何,所以我想我会在这里问......

我有 2 个 PDF 文件,我的问题是,我可以将范围参数添加到页面上每个按钮的 PDF 的 URL 中,以便在单击时仅加载所需的 PDF 页面吗?

我目前在我的系统上使用 XAMPP,我不确定 XAMPP 是否支持范围请求(用于测试),尽管该站点稍后将在线上传。网络主机通常支持范围请求吗?

如何分别获取 2 个 PDF 文件中所有页面的字节范围?是否有 PHP 脚本或某些 Windows 实用程序可以从 PDF 中获取页面范围(以字节为单位)?

一旦找到,如何在加载 PDF 时将这些范围请求添加到 viewer.html 页面,以便不会首先加载整个文档,而是首先加载需要的页面,然后disableAutoFetch=false才能让查看器获取剩余的 PDF:

如果没有为 PDF 文件发送其他范围请求,则获取 PDF 的剩余内容

(在隐身搜索时在某个博客上阅读类似的内容,不记得该博客的 URL,但 pdf.js wiki 在网站上没有提到这一点)。

编辑:根据pdfinfo 实用程序优化了我的 PDF 文件。

pdf优化

Kur*_*fle 5

请求字节范围的功能不适用于最终用户。这是正确处理“线性化” PDF(通常也称为“网络优化” PDF)的隐含要求。

可以通过此命令检查线性化/网络优化的 PDF,例如:

 pdfinfo filename.pdf | grep Optimized:
Run Code Online (Sandbox Code Playgroud)

线性化 PDF 的内部结构确实有些不同。基本上,它们的制作是为了使符合标准的阅读器软件不需要下载完整的文件,因此它可以访问trailerxref表格部分(在标准 PDF 中,它们始终位于文件的末尾)。

需要拖车和 X/交叉参考表(这是一种内部 PDF 'ToC'),以便阅读器软件能够识别文件中根对象的位置,并从那里识别页面和所有其他对象.

相反,读者xref通过不同的方式获知根对象的位置,并且它可以开始渲染第一页(其对象需要在文件的开头),而其余的文件/对象/页面仍然存在下载。

这意味着用户可以点击书签、内部超链接,或在第一页可见时告诉读者“转到第 80 页”。阅读器然后从它已经处理的信息中知道它应该从符合标准的 Web 服务器请求哪个字节范围。

其他问题:

  • 不,在“标准”PDF 中,与特定页面相关的对象几乎从不连续(这将是一个非常罕见的例外)。

  • 是的,Web 服务器也需要支持字节范围传递(“字节服务”)。是的,所有现代 Web 服务器都可以配置为支持这一点。

  • 不,我不知道有任何实用程序可以向您报告 PDF 的页面范围(以字节为单位)(如果是,它仅适用于线性化 PDF)。

TL;DR: 在 PDF 上下文中要求字节范围下载是合理的,前提是您的 PDF 文档首先是“网络优化”的!(并且请求某个字节范围必须由查看者完成,将用户对某个页面的请求转换为正确的范围编号......)


更新

资源:

  • @mk117:正如我在答案中已经解释的那样:请求字节范围并不意味着直接最终用户使用。要测试查看器和 Web 服务器是否相应地工作,只需使用多于几页和/或缓慢(或人为限制)连接带宽的线性化 PDF。请求`http://server/file.pdf#page=104`。观察第 104 页是否显示 *before* 下载进度条完成。如果是,则字节范围服务有效。如果没有,就没有。(AFAIK,`pdf.js` 不支持它[还]。) (2认同)