使 pdfjs 处理本地文件

Make pdfjs work on local files

我的任务是在本地环境中使用 PDFjs。一切正常,我可以使用 PDF 的绝对路径来规避同源策略,并且在 Firefox 中,可以像这样查看本地 PDF

<iframe class="pdf-viewer" src="viewer.html?file=file:///c/work/example-files/pdf/test.pdf"></iframe>

工作正常。问题是,只要我在 Internet Explorer 中尝试相同的操作,就会收到无法调用未定义或空引用的 getItem 的错误。

这归结为使用本地文件系统时,在 Internet Explorer 中 localStorageundefined

有没有办法让PDFjs使用本地存储,所以这在IE中也有效?

不幸的是,IE 的支持有限,如果您使用的版本不 HTML5 兼容,则需要包含 compatibility.js,它具有针对缺失功能的 polyfill

https://github.com/mozilla/pdf.js/wiki/Frequently-Asked-Questions#faq-support

https://github.com/mozilla/pdf.js/wiki/Required-Browser-Features

如果你真的想更深入地处理这个场景,你可以尝试修改PDF.js代码本身

https://github.com/mozilla/pdf.js

pdf.js 非常巧妙地使用带有 range headers 的 HTTP GET 请求来仅下载部分文件(随机文件访问),一旦文件加载过一次,从浏览器缓存完全满足 你可以通过网络监视器选项卡观察这个效果,看起来对同一个文件的多个请求实际上是不同的多个请求字节范围。因此,要加载 450 页文档的第 123 页,它只需要查看特定的字节范围,而不是将整个文件保存在浏览器内存中。

显然file://没有浏览器缓存,所以它不得不把文件数据放在某个地方,对于巨大的PDF文件,它根本无法将其全部保存在内存中。因此需要 localstorage。 如果您确定所有 PDF 文件都适合内存,您可以编写一个 localstorage polyfill 将 PDF 数据保存在内存中而不是真正的 localstorage。不过,在 32 位浏览器上,您的内存会非常受限。