Pdf.js: Viewer.js не может принимать онлайн-поток PDF

Созданный на 30 дек. 2011  ·  29Комментарии  ·  Источник: mozilla/pdf.js

Viewer.js не может принимать онлайн-поток PDF.

По умолчанию viewer.js имеет:

var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf';

Теперь используйте поток PDF:
http://www.liferay.com/documents/31578/11925632/sample.pdf

в виде

var kDefaultURL = ' http://www.liferay.com/documents/31578/11925632/sample.pdf ';

В FireFox 9.0.1 и Chrome 16.0.912.63 выдает ошибки:

"
Сборка PDF.JS: 9161c2e
Сообщение: Неожиданный ответ сервера 0.
".

Самый полезный комментарий

@hashbyte Вам понадобится прокси для сервера. Очень простой прокси (разработанный мной) — CORS Anywhere. Просто добавьте URL-адрес прокси-сервера перед URL-адресом файла PDF, например

"https://cors-anywhere.herokuapp.com/" + 
"http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal.pdf" =
"https://cors-anywhere.herokuapp.com/http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal.pdf"

Затем закодируйте этот URL-адрес и поместите его в параметр file , и вы получите ссылку, которая может открыть любую страницу: https://mozilla.github.io/pdf.js/web/viewer.html. ?file=https%3A%2F%2Fcors-anywhere.herokuapp.com%2Fhttp%3A%2F%2Fbhpr.hrsa.gov%2Fhealthworkforce%2Frnsurveys%2Frnsurveyfinal.pdf

Примечание. Если URL-адрес PDF-файла не содержит знаков процента или символов & , то более простой способ быстро получить ссылку — просто добавить URL-адрес средства просмотра перед ссылкой (то есть без кодирования URL-адреса). ). Делайте это только в том случае, если вы вводите URL-адрес вручную (например, при выполнении быстрого теста):
https://mozilla.github.io/pdf.js/web/viewer.html?file=https://cors-anywhere.herokuapp.com/ http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal. пдф

Примечание . Демо-версия CORS Anywhere предоставляется только для демонстрации этой функции. Если вы собираетесь использовать эту функцию на сайте с большим количеством посетителей, разместите экземпляр CORS Anywhere самостоятельно, чтобы избежать несправедливой нагрузки на общедоступный демонстрационный сервер. Если я замечу, что производительность CORS Anywhere снижается из-за злоупотреблений, ваш источник будет занесен в черный список. При самостоятельном размещении CORS Anywhere вы можете ограничить доступ к своему сайту только с помощью параметра конфигурации originWhitelist чтобы избежать подобных злоупотреблений.

Все 29 Комментарий

Связанные проблемы: № 522, № 586 и № 842.

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

Привет Бренд,

в чем основная причина того, что "пользователю придется исправлять самостоятельно с помощью прокси или CORS"?

Важно, чтобы PDF-файл мог поступать с локального сервера (загрузка), с сервера в виде файла, с сервера в виде потока, например «http://».

В качестве URL-адреса изображения программа для чтения PDF должна поддерживать URL-адрес HTTP.

Спасибо

@jonasyuandotcom cors позволяет получить PDF-файл по http с того же сервера. однако браузер защищает пользователя от получения/отправки данных на сторонние серверы. Эти серверы должны использовать заголовки http, чтобы обойти это ограничение.

Поскольку ваш прокси-сервер на стороне сервера будет расположен на том же сервере, что и средство просмотра, с этим все будет в порядке.

@notmasteryet, спасибо. Он работает при использовании того же сервера, что и

var kDefaultURL = '/pdf-reader-web/sample.pdf';

Привет Джонас,

Мы не будем реализовывать это с нашей стороны, потому что это невозможно из-за ограничений безопасности браузера. См. http://en.wikipedia.org/wiki/XMLHttpRequest#Cross -domain_requests.

Брендан

Привет @brendandahl

Мне интересно, есть ли какие-либо обновления с 2011 года? Все еще невозможно исправить проблемы CORS?

да. См. https://github.com/mozilla/pdf.js/wiki/Frequently-Asked-Questions#faq -xhr для получения дополнительной информации.

Спасибо Тим!

Привет @timvandermeij. Спасибо за ваш ответ. Я пробовал много решений, но я все еще не могу разрешить CORS на моем веб-сервере. У вас есть пример git?

@Dassine, вот http://mozilla.github.io/pdf.js/web/viewer.html?file=//async5.org/moz/pdfjs.pdf -- Средство просмотра PDF загружает http://async5.org /moz/pdfjs.pdf . Обратите внимание, что async5.org позволяет mozilla.github.io получать файлы. В противном случае веб-браузер должен заблокировать доступ к удаленному файлу из соображений безопасности. Это стандартная практика в Интернете, и PDF.js ничего не может сделать, чтобы обойти безопасность браузера.

Если вы встраиваете управление браузером в настольное/мобильное приложение, вы можете запросить двоичные данные с помощью API-интерфейсов ОС/фреймворка и передать их в PDF.js как Uint8Array.

Спасибо @yurydelendik за ваши ссылки. Я знаю, что PDF.js не управляет CORS. Я пробовал решения, присланные @timvandermeij и другими, но они не

@yurydelendik У меня также
PDF.js v1.0.1040 (сборка: 997096f)
Сообщение: Неожиданный ответ сервера (0) при получении файла PDF " http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal.pdf ".

Вы можете видеть, что PDF-файл, который я пытаюсь загрузить, находится на другом сервере, который я не могу контролировать. Но все же я хочу показать этот PDF на моем viewer.js

У меня не так много опыта работы с CORS, но я создал файл crossdomain.xml с минимальной безопасностью на своем сервере, но даже тогда он не работает.

@hashbyte Вам понадобится прокси для сервера. Очень простой прокси (разработанный мной) — CORS Anywhere. Просто добавьте URL-адрес прокси-сервера перед URL-адресом файла PDF, например

"https://cors-anywhere.herokuapp.com/" + 
"http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal.pdf" =
"https://cors-anywhere.herokuapp.com/http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal.pdf"

Затем закодируйте этот URL-адрес и поместите его в параметр file , и вы получите ссылку, которая может открыть любую страницу: https://mozilla.github.io/pdf.js/web/viewer.html. ?file=https%3A%2F%2Fcors-anywhere.herokuapp.com%2Fhttp%3A%2F%2Fbhpr.hrsa.gov%2Fhealthworkforce%2Frnsurveys%2Frnsurveyfinal.pdf

Примечание. Если URL-адрес PDF-файла не содержит знаков процента или символов & , то более простой способ быстро получить ссылку — просто добавить URL-адрес средства просмотра перед ссылкой (то есть без кодирования URL-адреса). ). Делайте это только в том случае, если вы вводите URL-адрес вручную (например, при выполнении быстрого теста):
https://mozilla.github.io/pdf.js/web/viewer.html?file=https://cors-anywhere.herokuapp.com/ http://bhpr.hrsa.gov/healthworkforce/rnsurveys/rnsurveyfinal. пдф

Примечание . Демо-версия CORS Anywhere предоставляется только для демонстрации этой функции. Если вы собираетесь использовать эту функцию на сайте с большим количеством посетителей, разместите экземпляр CORS Anywhere самостоятельно, чтобы избежать несправедливой нагрузки на общедоступный демонстрационный сервер. Если я замечу, что производительность CORS Anywhere снижается из-за злоупотреблений, ваш источник будет занесен в черный список. При самостоятельном размещении CORS Anywhere вы можете ограничить доступ к своему сайту только с помощью параметра конфигурации originWhitelist чтобы избежать подобных злоупотреблений.

Привет,
У меня есть эта ошибка, когда я хочу загрузить PDF-файл с иностранного URL-адреса

Ошибка: источник файла не соответствует просматривающему
throw new Error('Происхождение файла не совпадает с просматривающим');

пожалуйста помоги!

У меня есть эта ошибка, когда я хочу загрузить PDF-файл с иностранного URL-адреса

@gildassamuel см. подробности в #6916.

@jonasyuandotcom В случае, если файл управляется самостоятельно, вы можете поместить файл и pdfjs на один и тот же файловый сервер.

Эй, я выполнил инструкции, чтобы установить «Access-Control-Allow-Origin» на файловом сервере, но я продолжаю получать эту ошибку:
screen shot 2016-09-28 at 10 32 35 am
Заголовки http следующие:
screen shot 2016-09-28 at 10 33 16 am
Любые указатели будут оценены, даже если вы не уверены, можете ли вы указать возможную причину проблемы. Большое тебе спасибо!

@yjguoo Сообщение об ошибке и заголовки не складываются.

Я думаю, что в цели перенаправления отсутствуют ожидаемые заголовки.

Посетите chrome://net-internals/#events и повторите шаги, чтобы увидеть фактические заголовки заблокированного перенаправления в журнале.

Привет, Роб, спасибо за быстрый ответ,

Я заметил, что когда я вручную ввожу запрошенный URL-адрес «https://files.dev52.slack.com/files-pri/T076SHX5W-F07CGBKK2/git-for-beginners-handout.pdf», я получаю другой заголовок ответа от файлового сервера:
screen shot 2016-09-28 at 11 58 52 am
Обратите внимание, что меня перенаправили в другое место в заголовке ответа. И в этом новом месте я получаю статус 200 ok.
screen shot 2016-09-28 at 11 59 05 am
Мои первые вопросы: есть ли разница между вводом URL-адреса вручную в браузере и через XmlHttpRequest?
Кстати, я использую средство просмотра pdf.js по умолчанию (html css js), все функции работают, кроме запроса pdf из другого источника (например, проблема с запросом перекрестного запроса)
Второй вопрос: как вы думаете, это проблема с моей стороны или способ, которым viewer.js/pdf.js по умолчанию выполняет XmlHttpRequest?

Спасибо :)

Мои первые вопросы: есть ли разница между вводом URL-адреса вручную в браузере и через XmlHttpRequest?

Да, особенно с запросами из разных источников. Когда вы выполняете запрос из разных источников, запрос принимается только в том случае, если запрос разрешен CORS. Браузер отправит запрос с заголовком Origin , сервер может использовать его, чтобы решить, утвердить ли запрос (путем включения запрошенного источника в заголовок ответа Access-Control-Allow-Origin ).

Кроме того, учетные данные по умолчанию не включаются в запросы между источниками. Чтобы включить файлы cookie, сервер должен ответить Access-Control-Allow-Credentials: true а в запросе XHR атрибут withCredentials должен иметь значение true .

Второй вопрос: как вы думаете, это проблема с моей стороны или способ, которым viewer.js/pdf.js по умолчанию выполняет XmlHttpRequest?

Я думаю, что ваш сервер должен быть настроен по-другому.

Дополнительную информацию см. в документации по MDN: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS.
Или прочтите спецификацию CORS: https://www.w3.org/TR/2014/REC-cors-20140116/

Привет Роб,

Я думаю, что решил проблему, также установив Access-Control-Allow-Credentials: true . Большое спасибо за помощь <3. Однако у меня возникла еще одна проблема, связанная с перенаправлением, и я не знаю, не могли бы вы дать мне несколько советов. я делаю XHR
запрос с использованием URL № 1 (проблема, которую вы помогли мне исправить). Затем я получаю перенаправление на URL № 2 (статус 302). Но и URL#1, и URL#2 указывают на один и тот же сервер. Вызывает следующую ошибку:
screen shot 2016-09-29 at 9 40 41 am
Я попытался установить те же заголовки ответа, что и для URL № 1, но я понимаю, что они оба находятся на одном сервере, а Origin имеет значение null.

Я думаю, это потому, что оба URL-адреса указывают на один и тот же сервер, поэтому источник перенаправления равен NULL, но я не слишком уверен? Теперь, как мне добавить заголовки, относящиеся к двум разным источникам, но оба URL-адреса указывают на один и тот же файловый сервер. Я пытался использовать регулярное выражение, например *, но, видимо, это запрещено :( Еще раз спасибо!

После перенаправления между источниками Chrome устанавливает для заголовка Origin значение «null» вместо фактического URL-адреса — https://crbug.com/154967.

Вы можете условно вернуть Access-Control-Allow-Origin со значением null , но только если хотите, чтобы все веб-сайты могли читать этот ресурс . Если нет (что наиболее вероятно), то вам следует избегать редиректа. Например, путем прямой отправки запроса на целевой URL-адрес (если вы не знаете URL-адрес заранее, добавьте новую конечную точку API на свой сервер, которая возвращает целевой URL-адрес).

Спасибо! Я посмотрю на это :)

Эй, Роб, как вы думаете, есть ли другой способ инициализировать средство просмотра PDF или pdf.js с уже установленным src и вообще избежать запроса XHR?

@yjguoo Вы можете закодировать данные PDF в base64 и использовать URL-адрес данных. Для больших файлов PDF это приводит к ухудшению взаимодействия с пользователем (= пустая страница без индикатора выполнения), поскольку кодирование данных в формате base64 увеличивает размер файла на 33%. По этой причине я рекомендую продолжать использовать XHR.

Привет, только что протестировано, и это работает, если CORS включен, но я вижу, что файл не получает фрагменты/диапазон, если файл очень большой.

Решено добавить это в .htaccess:
Набор заголовков Accept-Ranges bytes
Набор заголовков Access-Control-Allow-Origin "*"
Набор заголовков Access-Control-Allow-Methods "GET"
Набор заголовков Access-Control-Allow-Headers "Content-Type, Range"
Набор заголовков Access-Control-Expose-Headers "Accept-Ranges, Content-Encoding, Content-Length, Content-Range"

Спасибо!!!

@Rob--W Это было очень полезно. Есть ли возможность работать внутри проекта (например, изменять заголовки XHR)? (внутри worker.js)

Привет, для тех, у кого все еще есть проблемы с этим, я решил это с помощью:

https://drive.google.com/viewerng/viewer?embedded=true&url=http://www.africau.edu/images/default/sample.pdf

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

sujit-baniya picture sujit-baniya  ·  3Комментарии

brandonros picture brandonros  ·  3Комментарии

dmisdm picture dmisdm  ·  3Комментарии

anggikolo11 picture anggikolo11  ·  3Комментарии

PeterNerlich picture PeterNerlich  ·  3Комментарии