Заголовки PHP для PDF.js для постепенной загрузки и отображения

#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 .