【问题标题】:PDF.js unable to get range/streaming PDF's workingPDF.js 无法获得范围/流式 PDF 的工作
【发布时间】:2020-08-27 01:31:44
【问题描述】:

我们有一个应用程序可以在我们使用 PDF 的地方使用,但是由于客户使用的 PDF 的大小,我们遇到了缓存问题。决定随时检查流式传输/使用范围请求以下载 PDF。

这是我所看到的:

accept-ranges: bytes
access-control-allow-credentials: true
access-control-allow-headers: Authorization, Content-Type, body, Content-Length, Accept-Ranges, Range
access-control-allow-methods: GET,POST,PUT,DELETE
access-control-allow-origin: http://example.test
access-control-max-age: 1000
cache-control: max-age=31536000
content-length: 185124353
content-type: application/pdf
date: Thu, 05 Dec 2019 14:03:42 GMT
etag: "some-etag-that-works-nicely"

有很多 CORS,因为我现在在本地运行它,甚至在我考虑将它推到开发环境之前。我认为我们已经添加了所有必需的标头以使 PDF.js 检测到我们支持范围调用,但它似乎无法正常工作。

当我深入了解23744 (v2.3.200) 线上的PDFJS-dist/build/pdf.js 文件时,我看到了:

if (getResponseHeader('Accept-Ranges') !== 'bytes') {
 return returnValues;
}

这让我思考;也许这个getResponseHeader() 是区分大小写的,由于某种原因,我无法让API 以我们习惯的整洁的混合大小写来响应它的标题。所以我决定稍微修改一下,让它的 returnValues 返回allowRangeRequests = true

这可以解决问题,因为然后我看到一个 200 OK 具有与上面相同的标题(在本地工作时在 OPTIONS 之后),它应该被取消但不是,然后是一堆新的调用206 PARTIAL 与增量 range: byte=0-65000 等标题看起来像这样:

REQUEST
range: bytes=0-65535
//...and other headers of course, omitted for brevity.
RESPONSE
accept-ranges: bytes
access-control-allow-credentials: true
access-control-allow-headers: Authorization, Content-Type, body, Content-Length, Accept-Ranges, Range
access-control-allow-methods: GET,POST,PUT,DELETE
access-control-max-age: 1000
cache-control: max-age=31536000
content-length: 65536
content-type: application/pdf

等等,这也为我在视图中提供了一个实际工作的 PDF(或至少几页);所以这表明它至少部分有效。

现在为什么我需要“破解”这个,我缺少什么标头以供 PDF.js 检测我们实际上支持范围,因为它似乎已正确实施?这也是为什么它不会因为“范围支持检测”的另一部分而在没有range: bytes=0-65535 的情况下取消初始提取的原因吗?

【问题讨论】:

    标签: pdf.js response-headers pdfjs-dist


    【解决方案1】:

    我们已经让它工作了,看起来 PDFjs 内部实现对标题非常挑剔。当您将它与 CORS 结合使用时(因此您首先有一个 OPTIONS 调用),它似乎根本没有拾取正确的标题。这可能是一个错误,但我没有花时间调查并确保我们应该报告它。

    其次,HTTP2 SPDY 协议使所有标头都小写,而且 PDFJS 所依赖的内部实现似乎对区分大小写的标头很挑剔。当我们禁用 HTTP2 SPDY 并在没有 CORS 的情况下重试时,我们让它正常工作。

    【讨论】:

      【解决方案2】:

      这是因为当你进行跨域请求时,你只能得到 7 个简单的响应头,其中不包括 'Accept-Ranges'。所以也许你应该配置你的服务器的 Access-Control-Expose-Headers。

      https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-27
        • 2016-04-02
        • 2016-11-17
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        相关资源
        最近更新 更多