pdf.js无法使用Safari

时间:2013-06-10 10:45:43

标签: javascript safari pdf.js pdf-rendering

我们正在测试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.pdf
http://forums.adobe.com/servlet/JiveServlet/previewBody/2041-102-1-2139/Sample.pdf
https://github.com/prawnpdf/prawn/raw/master/data/pdfs/form.pdf

在SAFARI工作:
http://cdn.mozilla.net/pdfjs/helloworld.pdf
(注意:这是来自pdf.js项目的示例PDF,也是我们唯一一个工作过的PDF)


我们已经提交了bug report,但开发人员似乎没有答案,所以我希望有人在这里......

我们如何让pdf.js与Safari一起使用?

5 个答案:

答案 0 :(得分:7)

我已经想出如何在Mac Safari上运行(不必理解原因)...

    必须包含
  1. compatibility.js

  2. 必须指定
  3. 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>
    
  4. 再一次,无法解释原因,但这就是我们如何让它为我们工作。

答案 1 :(得分:3)

我已经在我的本地服务器上的Safari中使用了PDF.js,但是当我把它放在远程服务器上时,出现了愚蠢的错误:

  

警告:设置假工作人员   未处理的拒绝:错误:INVALID_STATE_ERR:DOM例外11

如果我碰巧打开开发者控制台,它也会在我的本地计算机上显示此错误。关闭控制台,在Safari中显示PDF;打开控制台,它不再起作用了。

问题是:开发人员工具和远程服务器的变化与在本地服务器上运行的变化有何关系?这仍然是范围检查问题吗?

我让PDF.js工作了!我修改了很多东西,我不知道我做了什么工作。这是我做过的事情清单。

  1. 添加了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;
            }
        });
    })();
    
  2. 更改了xhr.open()pdf.js次来电的顺序,以便在 xhr.setRequestHeader()

    之后发生<{1}}
  3. 删除了所有xhr.open()

  4. 在第37272行和第41262行'use strict';之后添加xhr.setRequestHeader("Cache-control", "no-cache");

  5. 缩小xhr.open,这一切都有效!

答案 2 :(得分:0)

PDFJS.getDocument()将接受 字符串链接或Uint8Array。在我的客户端版本中,我将PDFJJ.getDocument()传递给Uint8Array,但如果我想要渲染现有文件,我只需将路径传递给文件:

jspdf第965行:

PDFJS.getDocument('..files/pdf/sample.pdf').then(function(pdf) {

我不知道是什么让你的Safari浏览器失败,但如果你能在我的test site上看到sample.pdf,你必须非常接近解决这个问题。

答案 3 :(得分:0)

我已经弄清楚如何在Mac Safari&amp; iPad的 我删除了严格模式&#39;在

的开头
1. pdf.js/src/core/worker.js
2. pdf.js/web/download_manager.js

并且工作!!

答案 4 :(得分:-1)

我在Safari Mobile遇到同样的问题...无法打开超过1 Mb的PDF ...我解决了部分900 kb的文件碎片,将它们加入到本地,然后作为Uint8Array注入pdf.js ()对象。我认为这是一个没有记录的限制。