【问题标题】:How to avoid downloading the entire PDF to display如何避免下载整个PDF显示
【发布时间】:2016-11-07 09:10:48
【问题描述】:

在我的网页中,您可以阅读 pdf 格式的书籍。问题是有些书大约有 1000 页,而且 PDF 非常大,所以即使用户只阅读 10 页,服务器也会下载完整的 pdf,所以这对我的托管帐户来说很糟糕,因为我有传输限制。

如何在不加载完整 PDF 的情况下显示 pdf。

我使用 pdf.js

您好。

【问题讨论】:

标签: javascript pdf hosting


【解决方案1】:

原帖:

PDF 文件的设计方式强制客户端下载整个文件以获取第一页。

PDF 文件的最后一行告诉 PDF 阅读器 PDF 文件的根字典所在的位置(根字典告诉阅读器页面目录 - 页面顺序 - 以及阅读器使用的其他数据)。

因此,如您所见,PDF 设计的局限性要求您使用服务器端解决方案,该解决方案将创建一个仅包含您要显示的页面的新 PDF。

最好的解决方案(在我看来)是创建一个“阅​​读器”页面(而不是下载页面),从服务器请求特定页面并允许用户逐页前进(使用 AJAX)。

服务器将需要创建一个仅包含请求页面的新 PDF(文件或流)并将其返回给阅读器。

如果您使用 Ruby(ruby on rails)运行服务器,则可以使用 combine_pdf gem 加载 pdf 并仅发送一页...

您可以定义如下所示的控制器方法:

def get_page
    # read the book
    book = CombinePDF.parse IO.read("book.pdf")
    # create empty PDF
    pdf_with_one_page = CombinePDF.new
    # add the page you want
    # notice that the pages array is indexed from 0,
    # so an adjustment to user input is needed...
    pdf_with_one_page << book.pages[ params[:page_number] - 1  ]
    # no need to create a file, just stream the data to the client.
    send_data pdf_with_one_page.to_pdf, type: 'application/pdf', disposition: 'inline'
end

如果您运行的是 PHP 或 node.js,则需要寻找不同的服务器端解决方案。

祝你好运!

编辑:

我正在查看 PDF.js 项目(看起来非常不错),并注意到对 Safari 的有限支持声明: “Safari(桌面和移动)缺乏许多功能或存在缺陷,例如在类型化数组或 HTTP 范围请求中”...

我从这个声明中了解到,在某些浏览器上,您可以管理基于 HTTP 字节服务协议的客户端解决方案。

这不适用于所有浏览器,但它会让您不必使用服务器端解决方案。

我找不到 PDF.js 功能的文档(也许它默认为范围,您只需要设置范围...?),但我会使用我知道的服务器端解决方案适用于所有浏览器。

编辑 2:

忽略编辑 1,正如 iPDFdev 指出的(感谢 iPDFdev),这需要 PDF 文件的特殊布局,并且不会解决浏览器下载整个文件的问题。

【讨论】:

  • 你确定你的第一个声明?我已经阅读了大型 pdf,它们允许我从第一页开始,然后在后面的页面上显示空白,直到它们被下载。
  • 我确信有关此事的 PDF 文件规范。这是文件格式中称为外部参照的数据的问题。我不知道他们是如何首先开始第一页的(也许他们有直接的文件系统访问权限,所以他们可以先读取最后一行)......
  • 是的,但是,例如,这个 pdf 显示了下载其余部分之前的第一页:nbb.be/DOC/BA/PDF7MB/2010/201009400082_1.PDF
  • 我认为这实际上是一个浏览器功能......它被称为字节服务,是在 HTTP 层上完成的。您可以查看此帖子以了解某人正在尝试的类似内容:stackoverflow.com/questions/17643851/…
  • 该 PDF 功能称为快速 Web 视图或线性化,它需要 PDF 文件内容的特殊布局。它确实使用字节服务来请求 PDF 文件的特定部分。它允许 Adob​​e Reader 执行增量下载并在下载页面后立即显示页面。问题是整个文件仍然在后台下载,所以如果你想最小化流量,就需要像上面那样的服务器端解决方案。
【解决方案2】:

您可以采取以下受功能支配的方法

  • 添加配置(即标志的种类)是否要显示整个 PDF。
  • 在呈现您的响应时,请阅读上述配置,如果设置了标志,则生成包含 20 页的最小 PDF,其中包含用于下载整个 PDF 的超链接,否则生成仅包含 20 页的最小 PDF
  • 当您准备网页的初始响应时,添加仅包含 20 页(最小 PDF)的 PDF 并处理响应

【讨论】:

  • 如何“添加配置”?你能举个例子吗?
  • 这是概念性的...您可以在响应中添加一个标志,指示是否可以显示/下载整个 PDF。这是您需要构建的服务器端逻辑
  • 你知道怎么做吗?
  • 好吧,乔纳森,这取决于你正在开发什么环境,你似乎对这个比 Fylux 更感兴趣!
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多