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 (не обязательно понимая почему)...
compatibility.js
должен быть включен.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 на работу, хотя! Я изменил так много вещей, что не знаю, какая часть того, что я сделал, сработала. Вот список вещей, которые я сделал.
добавленной
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; } }); })();
Изменен порядок
xhr.open()
звонит вpdf.js
чтобыxhr.setRequestHeader()
происходит послеxhr.open()
Удалено все
'use strict';
линиидобавленной
xhr.setRequestHeader("Cache-control", "no-cache");
послеxhr.open
по линиям 37272 и 41262Минимизированный
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(), Я думаю, что это не задокументированное ограничение.