原帖:
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 文件的特殊布局,并且不会解决浏览器下载整个文件的问题。