2013-06-10 2 views
4

Мы тестируем pdf.js, и, хотя это похоже на потрясающий проект, мы не можем заставить его работать в Safari.pdf.js не работает с Safari

(Проверено на pdf.js версии = 0.8.229 (последняя)/Safari 5.1.9 - 6.0.4/Mac OSX 10.6.8 - 10.8.3)

Пример:

Это пример демо-кода подается с нашего сервера с образцом PDF, который работает на Chrome/FFox, но не Safari: выход 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 служил с самого проекта pdf.js:

неудовлетворением 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 из проекта pdf.js и единственный один мы когда-либо были работать)


Мы представили bug report, но разработчики, кажется, не имеют ответ, поэтому я надеюсь, что кто-то здесь могут ...

Как мы можем получить pdf.js, работающий с Safari?

ответ

7

Я понял, как получить вещи, работающие на 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> 
    

Опять же, не могу объяснить, почему, но это, как мы получили его работать на нас.

3

У меня pdf.js работает нормально в Safari на моем локальном сервере, но когда я положил его на удаленном сервере, тупая ошибка возвращается:

Warning: Setting up fake worker.
Unhandled rejection: Error: INVALID_STATE_ERR: DOM Exception 11

Он также покажет эту ошибку на мой локальный компьютер, если я обнаружил, что консоль разработчика открыта. Закройте консоль, отобразите PDF в Safari; откройте консоль, и она больше не работает.

Вопрос: что инструменты разработчика и удаленный сервер изменяются в зависимости от работы на локальном сервере? Это еще проблема проверки диапазона?

У меня есть 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. Добавлено xhr.setRequestHeader("Cache-control", "no-cache"); после xhr.open на линии 37272 и 41262

  5. уменьшенная pdf.js и все это работает все время!

+0

Спасибо за ваши усилия, но я применил все описанные вами изменения и не вижу никаких изменений в результатах. Может ли быть что-то еще, что вы сделали, чтобы заставить его работать? – Yarin

+0

Единственная версия Safari, в которой я тестировал, - это 5.1.7. Мой сайт, на котором работает pdf.js, находится здесь: http://www.korenation.com/activities.html. Посмотрите, работает ли это на вашем сафари и дайте мне знать (если это сработает, вы увидите уродливое «Rocks To The KORE», плавающее справа). Если да, то я упакую свои файлы так, как они есть, и сделаю их доступными для вас. – AndrewBenjamin

+0

@ AndrewBenjamin- Да, ваша ссылка работает на моем Safari. Тем не менее, когда я загрузил вашу версию pdf.js и попытался использовать ее с моей локальной демонстрацией и получил новую ошибку в Safari: pdf.js: 2107Unhandled rejection: Неожиданный ответ сервера (206) при извлечении PDF «http: // mamp /tests/pdf_js/sample2.pdf "... – Yarin

0

PDFJS.getDocument() принимает либо ссылку строки или Uint8Array. В моей стороне клиента версии я прохожу PDFJS.getDocument() в Uint8Array, но если я хочу существующий файл сгенерирован, я просто передать путь к файлу:

jspdf линия 965:

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

Я надеваю Не знаете, что делает ваш браузер сафари неудачным, но если вы можете увидеть sample.pdf на моем test site, вы должны быть очень близки к решению этого вопроса.

-1

У меня была такая же проблема с Safari Mobile ... Не удалось открыть более 1 Мбайта PDF ... Я решил фрагментировать файл в частях 900 кб, соединить их в локальном, а затем впрыснуть в pdf.js как Объект Uint8Array(). Я думаю, что это не документированное ограничение.

0

Я понял, как получить вещи, работающие на Mac Safari & IPad я удалил «строгий режим» в начале

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

И работал !!