4

我们正在测试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 文件:


野生动物园失败: http ://samplepdf.com/sample.pdf
http://forums.adobe.com/servlet/JiveServlet/previewBody/2041-102-1-2139/Sample.pdf
https://github.com/大虾pdf/prawn/raw/master/data/pdfs/form.pdf

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


我们已经提交了一个错误报告,但开发人员似乎没有答案,所以我希望这里有人可能......

我们如何让 pdf.js 与 Safari 一起工作?

4

5 回答 5

7

我已经想出了如何在 Mac Safari 上运行的东西(不一定理解为什么)......

  1. compatibility.js必须包括在内。

  2. PDFJS.workerSrc必须分配。

    我一直在测试的演示代码(来自此处的 JS Bin 演示)没有这样做,尽管其他一些在线示例可以(包括hello world 示例和@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>
    

同样,无法解释原因,但这就是我们如何让它为我们工作的方式。

于 2013-06-15T17:44:59.620 回答
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()发生 xhr.open()

  3. 删除了所有'use strict';

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

  5. 缩小pdf.js,一切都在工作!

于 2013-06-13T22:49:18.663 回答
0

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

jspdf第965行:

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

我不知道是什么让您的 safari 浏览器失败,但如果您可以在我的测试站点上看到 sample.pdf ,那么您必须非常接近解决这个问题。

于 2013-06-15T01:58:04.590 回答
0

我已经弄清楚如何在 Mac Safari 和 iPad 上运行我在开头删除了“严格模式”

1. pdf.js/src/core/worker.js
2. pdf.js/web/download_manager.js

并工作!

于 2017-01-06T23:52:02.057 回答
-1

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

于 2013-07-08T20:43:28.540 回答