gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:32:47 25 4
gpt4 key购买 nike

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

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

我使用 pdf.js

问候。

最佳答案

原帖:

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

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

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

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

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

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

您可以定义一个如下所示的 Controller 方法:

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 字节服务协议(protocol)的客户端解决方案。

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

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

编辑 2:

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

关于javascript - 如何避免下载整个 PDF 来显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25871195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com