在我的网页上,您可以阅读pdf格式的书籍。问题是有些书有大约1000页,PDF很大,所以即使用户只读10页服务器下载完整的pdf,所以这对我的托管帐户来说很糟糕,因为我有转移限制。
如何在不加载完整PDF的情况下显示pdf。
我使用pdf.js
问候。
答案 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)
您可以采取以功能为主的以下方法