【问题标题】:pdf.js not working with Safaripdf.js 不适用于 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.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,也是我们唯一工作过的)


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

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

【问题讨论】:

    标签: javascript safari pdf.js pdf-rendering


    【解决方案1】:

    我已经弄清楚了如何在 Mac Safari 上运行(不一定理解为什么)...

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

    2. 必须分配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 工作了!我修改了很多东西,我不知道我所做的工作的哪一部分。这是我做过的事情的清单。

      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. 之后
      4. 删除所有'use strict';

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

      6. 缩小了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 () 目的。我认为这是一个没有记录的限制。

          【讨论】:

            猜你喜欢
            • 2012-09-14
            • 2014-10-10
            • 1970-01-01
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 2015-09-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多