Как обеспечить загрузку изображений перед созданием PDF-файла?


У меня есть цикл PHP, который выполняет следующее:

  1. Войдите на веб-страницу с помощью CURL
  2. Захват и внутренняя страница, требующая входа в систему
  3. Сохраните HTML-код страницы в локальный файл
  4. Используя WKHTMLTOPDF, отобразите страницу в формате PDF

Проблема, с которой я сталкиваюсь, заключается в том, что время от времени (возможно, ~30 % времени) изображения не отображаются в формате PDF. Если я открою один из сохраненных HTML-файлов, я обнаружу, что мне нужно зайти и вручную обновить страница для отображения изображений.

Есть идеи о том, как прагматично обеспечить загрузку изображений? Вещи, которые я пробовал:

  1. sleep(n) между каждой строкой
  2. Добавление --javascript-delay 30000 в мой вызов WKHTMLTOPDF, чтобы убедиться, что у него достаточно времени для загрузки любых изображений.

#1 значительно ухудшил ситуацию, а #2 вообще ничего не сделал.

Спасибо!

Author: Chords, 2012-05-07

5 answers

Между шагами 3 и 4 вашего примера вы можете рассмотреть возможность анализа HTML-файла для всех ссылок на изображения и загрузки их по отдельности с помощью curl, сохранения их также локально, а затем обновления ссылок в сохраненном HTML-файле, чтобы указать на новые локальные ресурсы изображений вместо удаленных.

Это должно значительно увеличить время загрузки изображений при отображении HTML в формате PDF.

 1
Author: stevecomrie, 2013-01-11 19:59:58

Я никогда этого не делал, но, может быть, вы сможете узнать, выполняется ли загрузка путем итерационного вызова curl_getinfo(), а затем считывания значений для CURLINFO_SIZE_DOWNLOAD - до тех пор, пока это значение больше не изменится?

 0
Author: Del Pedro, 2012-05-11 14:15:45

Что, если после того, как вы очистите html с помощью CURL, выполните цикл php через каждый элемент img и прочитайте двоичные данные файла изображения и замените атрибут URL src изображения значением кодирования base64 открытого файла изображения, например:

'<img src="data:image/jpg;base64,'. base64_encode($imagedata) . '"/>'

Если данные изображения base64 жестко закодированы на странице, это даст вам программный способ проверить, что все изображения "загружены", и предотвратить проблему преобразования pdf, начавшуюся до загрузки всех изображений...

 0
Author: WebChemist, 2012-05-11 16:19:13

Не могли бы вы добавить загрузку к загружаемым изображениям, которые вам нужно знать? что-то вроде

<img src='foo.jpg' onLoad='callbackFuncion();'/>
 0
Author: irenkai, 2012-07-20 00:18:12

Возможно, вы могли бы обработать загруженный HTML-код, выполнить поиск тегов img, затем загрузить изображения в локальное хранилище и заменить атрибут src. Таким образом, вы должны создавать PDF-файл после того, как все изображения будут доступны.

 0
Author: Muc, 2012-12-01 12:08:24