如何避免下载整个PDF来显示

时间:2014-09-16 14:17:23

标签: javascript pdf hosting

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

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

我使用pdf.js

问候。

2 个答案:

答案 0 :(得分:2)

原始帖子:

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

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

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

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

服务器需要创建一个仅包含所请求页面的新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 Byte Serving协议管理客户端解决方案。

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

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

编辑2:

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

答案 1 :(得分:-1)

您可以采取以功能为主的以下方法

  • 添加配置(即标记类型)是否要显示整个PDF。
  • 在呈现您的响应时,如果设置了标志,则会生成最小的PDF,其中包含20页,其中包含超链接以下载整个PDF,其他只有20页的PDF文件
  • 当您准备网页的初始回复时,添加仅包含20页(最小PDF)的PDF并处理回复