#php #pdf.js
#php #pdf.js
Вопрос:
Кто-нибудь знает, как получить PDF.js загружать и отображать страницы постепенно, когда PDF-файл выводится с помощью PHP? При прямом вызове файл PDF загружается нормально и отображается постепенно, но когда PHP обрабатывает вывод того же файла PDF, PDF.js ожидает загрузки всего файла перед отображением первой страницы. Я пробовал разные заголовки, подобные этим, но безуспешно :
$file = 'big.pdf';
$filename = 'fakefilename.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');
@readfile($file);
Заранее спасибо за любую помощь.
РЕДАКТИРОВАТЬ после комментария @Rob: вот журналы из веб-браузера :
Accept-Ranges 0-23822222
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Length 23822222
Content-Range bytes 0-23822221/23822222
Content-Type application/pdf
Date Mon, 23 Jun 2014 13:06:33 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=15, max=99
Pragma no-cache
Server Apache/2.2.16 (Debian)
X-Powered-By PHP/5.3.3-7 squeeze19
Ответ №1:
Простое добавление заголовков «Accept-Ranges» волшебным образом не активирует фрагментированные ответы. Вы должны распознать заголовок диапазона HTTP, выполнить поиск в файле, а затем отправить эти данные вместе со строкой состояния «Частичное содержимое 206» и заголовком «Диапазон содержимого».
Вот пример кода для потоковой передачи файла MP4, его можно практически напрямую скопировать и вставить в PDF-файлы. Чтобы обеспечить оптимальное время отображения, убедитесь, что ваш PDF-файл линеаризован (также известный как «веб-оптимизированный»). Это функция генераторов PDF-документов, которая выводит поток PDF в таком порядке, чтобы все данные, необходимые для отображения первой страницы (страниц), были доступны после загрузки первых фрагментов PDF-файла.
Комментарии:
1. Большое вам спасибо за ответ. Я пробовал это раньше без какого-либо успеха, тем не менее я адаптировал скрипт, который вы связали, чтобы повторить попытку, но он не работает лучше, pdfjs загружает весь файл перед рендерингом… возможно, имя файла важно для pdfjs и отсутствует в скрипте, который вы связали. если да, то какое расположение контента лучше всего подходит для моей цели?
2. @Olivier Показывает сетевой журнал инструментов разработчика вашего браузера. Я думаю, что вы отправляете неправильные заголовки ответов. Линеаризован ли PDF-файл, как я предложил?
3. Спасибо, Роб, я добавил журналы в исходное сообщение для лучшего отображения
4. PDF загружается и отображается нормально с помощью pdfjs при непосредственном вызове в целях тестирования. для работы файл будет находиться за пределами веб-корня и может не быть линеаризован загрузчиками.
5. @Olivier Скрипт, который я связал, не мой, это всего лишь первый разумный хит, который я нашел после поиска в Google «запроса диапазона PHP». Отредактируйте сценарий и используйте
Accept-Range: bytes
вместоAccept-Range: 0-$length
.