pdf.js 不适用于 Safari
Posted
技术标签:
【中文标题】pdf.js 不适用于 Safari【英文标题】:pdf.js not working with Safari 【发布时间】:2013-06-06 00:01:13 【问题描述】:我们正在测试pdf.js,虽然它看起来是一个很棒的项目,但我们无法让它在 Safari 中运行。
(在 PDF.JS 版本 = 0.8.229(最新)/Safari 5.1.9 - 6.0.4 / Mac OSX 10.6.8 - 10.8.3 上测试)
示例:
这是从我们的服务器提供的演示代码示例,其中包含适用于 Chrome/FFox 但不适用于 Safari 的示例 PDF: http://test.appgrinders.com/pdf_js/test.html
控制台输出:
Warning: Setting up fake worker.
Error: Invalid XRef stream (while reading XRef):
Error: Invalid XRef stream pdf.js:850undefined
Warning: Indexing all PDF objects
Error: Invalid XRef stream (while reading XRef):
Error: Invalid XRef stream pdf.js:850undefined
更多测试:
以下是我们测试的示例 PDF 列表(它们都来自我们的服务器,并且都在 Chrome/FFox/android 中运行)。唯一与 Safari 一起使用的是 pdf.js 项目本身提供的 PDF 文件:
在 SAFARI 中失败:http://samplepdf.com/sample.pdfhttp://forums.adobe.com/servlet/JiveServlet/previewBody/2041-102-1-2139/Sample.pdfhttps://github.com/prawnpdf/prawn/raw/master/data/pdfs/form.pdf
在 SAFARI 中工作:http://cdn.mozilla.net/pdfjs/helloworld.pdf(注意:这是来自 pdf.js 项目的示例 PDF,也是我们唯一工作过的)
我们已经提交了bug report,但开发人员似乎没有答案,所以我希望这里的人可能......
我们如何让 pdf.js 与 Safari 一起工作?
【问题讨论】:
【参考方案1】:我已经弄清楚了如何在 Mac Safari 上运行(不一定理解为什么)...
compatibility.js
必须包含在内。
必须分配PDFJS.workerSrc
。
我一直在测试的演示代码(来自JS Bin demos here) 不这样做,尽管其他一些在线示例可以(包括 hello world example 和提供的示例 @AndrewBenjamin - 谢谢)。其他浏览器似乎不需要这个, 但没有它 Safari 将无法工作。
<script type="text/javascript" src="compatibility.js"></script>
<script type="text/javascript" src="pdf.js"></script>
<!-- NEED THIS for Safari Mac to render work -->
<script type="text/javascript">
// Specify the main script used to create a new PDF.JS web worker.
// In production, change this to point to the combined `pdf.js` file.
PDFJS.workerSrc = 'pdf.worker.js';
</script>
同样,无法解释原因,但这就是我们让它为我们工作的方式。
【讨论】:
【参考方案2】:我的本地服务器上的 Safari 中的 PDF.js 工作正常,但是当我将它放在远程服务器上时,又出现了愚蠢的错误:
警告:设置假工人。 未处理的拒绝:错误:INVALID_STATE_ERR:DOM 异常 11
如果我碰巧打开了开发者控制台,它也会在我的本地计算机上显示此错误。关闭控制台,在 Safari 中显示 PDF;打开控制台,它不再工作了。
问题是:开发人员工具和远程服务器与在本地服务器上运行相比有何变化?这仍然是一个范围检查问题吗?
不过,我让 PDF.js 工作了!我修改了很多东西,我不知道我所做的工作的哪一部分。这是我做过的事情的清单。
添加了compatibility.js
- 将其中的最后一个函数修改为如下所示:
(function checkRangeRequests()
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
if (!isSafari)
return;
document.addEventListener('DOMContentLoaded', function (e)
if (isSafari)
PDFJS.disableRange = true;
);
)();
更改了xhr.open()
在pdf.js
中的调用顺序,以便xhr.setRequestHeader()
出现在 xhr.open()
删除所有'use strict';
行
在第 37272 和 41262 行的 xhr.open
之后添加了 xhr.setRequestHeader("Cache-control", "no-cache");
缩小了pdf.js
,而且它一直都在工作!
【讨论】:
感谢您的努力,但我应用了您描述的所有更改,但没有看到任何结果变化。你还能做些什么来让它工作吗?? 我测试过的唯一 Safari 版本是 5.1.7。我工作的 pdf.js 网站在这里:korenation.com/activities.html。看看它是否适用于您的 safari 并告诉我(如果有效,您会看到丑陋的“Rocks To The KORE”pdf 漂浮在右侧)。如果是这样,那么我会将我的文件按原样打包并提供给您。 @AndrewBenjamin- 是的,您的链接适用于我的 Safari。但是,当我下载您的 pdf.js 版本并尝试在本地演示中使用它时,在 Safari 上出现新错误:pdf.js:2107Unhandled reject: Unexpected server response (206) while retrieving PDF "mamp/tests/pdf_js/sample2.pdf". .. @Yarin- 我已将其全部简化为一个包并对其进行了测试。在线测试在 www.korenation.com/test 包在我的dropbox供你下载dropbox.com/s/e1kht0w5mmho8qi/testPDFJS.zip 在 Safari 中唯一不能工作的是下载。我正在慢慢缩小问题所在 - Safari 调试器甚至没有检测到错误 - 只是没有任何反应。要下载 pdf,任何其他浏览器都可以。 Firefox 做得最好。如果你能弄清楚为什么 safari 不会下载 pdf,那就太好了。总是 Safari 无法正常工作 - 在过去的两天里,我已将 Safari 开发人员称为天底下的每个名字。【参考方案3】:PDFJS.getDocument() 将接受 字符串链接或 Uint8Array。在我的客户端版本中,我传递 PDFJS.getDocument() 一个 Uint8Array,但如果我想要呈现现有文件,我只需传递文件的路径:
jspdf 第 965 行:
PDFJS.getDocument('..files/pdf/sample.pdf').then(function(pdf)
我不知道是什么让你的 safari 浏览器失败,但如果你能在我的 test site 上看到 sample.pdf,你必须非常接近解决这个问题。
【讨论】:
【参考方案4】:我已经知道如何在 Mac Safari 和 iPad 上运行 我删除了
开头的“严格模式”1. pdf.js/src/core/worker.js
2. pdf.js/web/download_manager.js
并且工作了!
【讨论】:
【参考方案5】:我在使用 Safari Mobile 时遇到了同样的问题...无法打开超过 1 Mb 的 PDF...我解决了将文件分段为 900 kb 的问题,将它们加入本地,然后作为 Uint8Array 注入 pdf.js () 目的。我认为这是一个没有记录的限制。
【讨论】:
以上是关于pdf.js 不适用于 Safari的主要内容,如果未能解决你的问题,请参考以下文章