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.
".
Связанные проблемы: № 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» на файловом сервере, но я продолжаю получать эту ошибку:
Заголовки http следующие:
Любые указатели будут оценены, даже если вы не уверены, можете ли вы указать возможную причину проблемы. Большое тебе спасибо!
@yjguoo Сообщение об ошибке и заголовки не складываются.
Я думаю, что в цели перенаправления отсутствуют ожидаемые заголовки.
Посетите chrome://net-internals/#events
и повторите шаги, чтобы увидеть фактические заголовки заблокированного перенаправления в журнале.
Привет, Роб, спасибо за быстрый ответ,
Я заметил, что когда я вручную ввожу запрошенный URL-адрес «https://files.dev52.slack.com/files-pri/T076SHX5W-F07CGBKK2/git-for-beginners-handout.pdf», я получаю другой заголовок ответа от файлового сервера:
Обратите внимание, что меня перенаправили в другое место в заголовке ответа. И в этом новом месте я получаю статус 200 ok.
Мои первые вопросы: есть ли разница между вводом 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 указывают на один и тот же сервер. Вызывает следующую ошибку:
Я попытался установить те же заголовки ответа, что и для 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
Самый полезный комментарий
@hashbyte Вам понадобится прокси для сервера. Очень простой прокси (разработанный мной) — CORS Anywhere. Просто добавьте URL-адрес прокси-сервера перед URL-адресом файла 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
чтобы избежать подобных злоупотреблений.