如何在下载时部分显示 PDF 文件?

m-y*_*m-y 5 pdf random-access cross-reference

根据PDF 1.7 规范,第 90 页,第 3.4 节:

前面的部分描述了单个对象的语法。本节介绍如何在 PDF 文件中组织对象以实现高效的随机访问和增量更新。规范的 PDF 文件最初由四个元素组成(见图 3.2):

  • 标识文件符合的 PDF 规范版本的单行标题

  • 包含构成文件中包含的文档的对象的主体

  • 包含有关文件中间接对象信息的交叉引用表

  • 提供交叉引用表的位置和文件正文中某些特殊对象的位置的预告片

基本上,该结构具有标题,然后是正文内容,然后是交叉引用表,最后是给出外部参照表位置的尾部。这里的关键部分是trailerxref表位于文件末尾,该xref表包含正文内容的相关元数据(主要是 10 位字节偏移量)。

鉴于外部参照表本身位于PDF 文件的最末尾

  • 我的浏览器(谷歌浏览器)如何在整个文件下载完成之前部分显示 PDF 文件(前一百页左右)?

查看我部分下载的 PDF 文件的屏幕截图:

部分下载的PDF文件

Kur*_*fle 5

OP 描述的 PDF 文件类型也称为“网络优化”(营销术语)或“线性化”(PDF 术语中的技术术语)。

必须注意的是,它仅在满足两个额外条件(在文件的线性化特征之上)时才有效:

  1. PDF 查看器需要能够处理这些类型的 PDF 并利用线性化功能。
  2. 为线性化 PDF 提供服务的(远程)主机需要支持“字节流”

如果服务器不支持字节流或 PDF 文件未线性化,则需要完整下载整个文件,然后查看器才能显示任何页面。

OP引用的PDF文件结构的描述不适用于线性化的PDF文件。它们的组织方式略有不同:

  1. 对 PDF 对象的排序应用特殊规则(“标准”PDF 可以具有任意顺序的对象)。
  2. PDF 文档需要包含一些称为“提示表”的附加结构,以确保在其中进行有效导航(即使尚未完全下载)。

关于附加结构,线性化 PDF 将其对象分为两组:

  1. 第一组中是文档目录,所有文档级对象,以及属于第一个显示页面(不一定是“页面0”!)的所有对象。对象应按顺序编号。

  2. 第二组包含所有其他对象。

这些组应由两个 xref表部分索引。

  1. 第一个组的xref部分紧跟在第一个间接对象之后,非常接近文件的开头。
  2. 第二组的xref部分位于文件的末尾(就像在标准的非线性 PDF 中一样)。

紧接%PDF-1.x标题行之后的第一个对象应包含指示/Linearized文件属性的字典键。

这种整体结构允许符合标准的读者非常快速地了解对象地址的完整列表,而无需从头到尾下载完整的文件:

  • 在下载完整文件之前,查看器可以非常快地显示第一页。

  • 用户可以单击缩略图页面预览(或文件 ToC 中的链接),以便在第一页显示后立即跳转到第 445 页,然后查看者可以请求所有445 页所需的对象,通过字节范围请求向远程服务器发送这些“乱序”,以便查看者可以更快地显示此页面。(当用户乱序阅读页面时,整个文档的下载仍然会在后台继续......)

PDF“线性化”的技术细节可以在Adobe 原始 PDF 1.7 规范“规范性”附录 F 中找到(大约 11 兆字节——这本身就是这种线性化 PDF 文件的一个例子!)