PDF.js无法获得范围/流PDF的工作

时间:2019-12-05 14:12:25

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

我们有一个可以使用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检测到我们支持范围调用,但是它似乎无法正常工作。

当我进入PDFJS-dist/build/pdf.js23744)行中的v2.3.200文件时,我看到以下内容:

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的初始提取的原因吗?

2 个答案:

答案 0 :(得分:1)

这是因为当您进行跨域请求时,您只能获得7个简单的响应标头,其中不包括“接受范围”。因此,也许您应该配置服务器的Access-Control-Expose-Headers。

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

答案 1 :(得分:0)

我们已经开始使用它了,看来PDFjs的内部实现对标头相当挑剔。当您将它与CORS结合使用时(因此您首先要进行OPTIONS调用),似乎根本无法拾取正确的标头。这可能是一个错误,但是我没有花时间去研究并确保我们应该报告它。

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