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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pdf.js 将每个用户上传的 pdf 文件的第一页显示为 Django 中的预览?

用于添加注释的PDF JS包装器

Mozilla 的 pdf.js 可以修改 PDF 吗?

pdf.js 使用

如何在网页中显示PDF文件

pdfjs获取渲染结束