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:

ОШИБКИ В САФАРИ:
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

РАБОТАЕТ В САФАРИ:
http://cdn.mozilla.net/pdfjs/helloworld.pdf
(ПРИМЕЧАНИЕ: это образец PDF из проекта pdf.js и единственный, с которым мы когда-либо работали)


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

Как мы можем заставить pdf.js работать с Safari?

6 ответов

Решение

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

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

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

Предупреждение: настройка фальшивого работника.
Необработанный отказ: ошибка: INVALID_STATE_ERR: исключение DOM 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 и все это работает все время!

Я понял, как заставить все работать на Mac Safari и iPad. Я убрал "строгий режим" в начале

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

И работал!!

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

jspdf строка 965:

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

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

если вы собираетесь поддерживать версии ниже Safari 14, насколько я понял, PDFjs этого не поддерживает. вам нужно будет использовать внешний просмотрщик в теге объекта:

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

Другие вопросы по тегам