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

时间:2015-04-02 15:52:05

标签: pdf random-access cross-reference

根据PDF 1.7规范,第3.4节(http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf,第90页):

  

前面几节描述了各个对象的语法。这个   部分描述了如何在PDF文件中组织对象以提高效率   随机访问和增量更新。最初是一个规范的PDF文件   由四个元素组成(见图3.2):

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

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

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

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

  •   

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

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

  • 在整个文件下载完成之前,我的浏览器(谷歌浏览器)能够部分显示PDF文件(前一百页左右)是怎么回事?

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

Partially downloaded PDF file

1 个答案:

答案 0 :(得分:4)

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

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

  1. PDF查看器需要能够处理这些类型的PDF并利用线性化功能。
  2. 为线性化PDF提供服务的(远程)主机需要支持"字节流"
  3. 如果服务器不支持字节流,或者PDF文件未线性化,则整个文件 仍然 需要完全下载才能让观众查看显示任何页面。

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

    1. 对PDF对象的排序适用特殊规则("标准" PDF可以任意顺序包含对象)。
    2. PDF文档需要包含一些名为"提示表"的附加结构。这保证了它内部的有效导航(即使它尚未完全下载)。
    3. 关于其他结构,线性化PDF将其对象分为两组:

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

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

      3. 这些组应由 两个 xref表格部分编制索引。

        1. 第一个组xref部分紧跟在第一个间接对象之后,非常接近文件的开头。
        2. 第二组xref部分位于文件的末尾(就像标准的非线性化PDF一样)。
        3. %PDF-1.x标题行后面的第一个对象应包含一个字典键,指示文件的/Linearized属性。

          这个整体结构允许一致的读者非常快速地学习完整的对象地址列表,而无需从头到尾下载完整的文件:

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

          • 用户可以点击缩略图页面预览(或文件ToC中的链接),以便在显示第一页后立即跳转到第445页,并且然后,观察者可以通过请求远程服务器通过字节范围请求来提供这些"无序的请求,来请求页面445所需的所有对象。这样观众可以更快地显示这个页面。 (当用户不按顺序阅读页面时,完整文档的下载仍将在后台进行...)

          PDF"线性化的技术细节"可以在 Adobe's original PDF 1.7 Specification '规范' 附录F中找到(大约11 MByte - 这本身就是一个例子)线性化的PDF文件!)