Как обеспечить загрузку изображений перед созданием PDF-файла?
У меня есть цикл PHP, который выполняет следующее:
- Войдите на веб-страницу с помощью CURL
- Захват и внутренняя страница, требующая входа в систему
- Сохраните HTML-код страницы в локальный файл
- Используя WKHTMLTOPDF, отобразите страницу в формате PDF
Проблема, с которой я сталкиваюсь, заключается в том, что время от времени (возможно, ~30 % времени) изображения не отображаются в формате PDF. Если я открою один из сохраненных HTML-файлов, я обнаружу, что мне нужно зайти и вручную обновить страница для отображения изображений.
Есть идеи о том, как прагматично обеспечить загрузку изображений? Вещи, которые я пробовал:
-
sleep(n)
между каждой строкой - Добавление
--javascript-delay 30000
в мой вызов WKHTMLTOPDF, чтобы убедиться, что у него достаточно времени для загрузки любых изображений.
#1 значительно ухудшил ситуацию, а #2 вообще ничего не сделал.
Спасибо!
5 answers
Между шагами 3 и 4 вашего примера вы можете рассмотреть возможность анализа HTML-файла для всех ссылок на изображения и загрузки их по отдельности с помощью curl, сохранения их также локально, а затем обновления ссылок в сохраненном HTML-файле, чтобы указать на новые локальные ресурсы изображений вместо удаленных.
Это должно значительно увеличить время загрузки изображений при отображении HTML в формате PDF.
Я никогда этого не делал, но, может быть, вы сможете узнать, выполняется ли загрузка путем итерационного вызова curl_getinfo()
, а затем считывания значений для CURLINFO_SIZE_DOWNLOAD
- до тех пор, пока это значение больше не изменится?
Что, если после того, как вы очистите html с помощью CURL, выполните цикл php через каждый элемент img и прочитайте двоичные данные файла изображения и замените атрибут URL src изображения значением кодирования base64 открытого файла изображения, например:
'<img src="data:image/jpg;base64,'. base64_encode($imagedata) . '"/>'
Если данные изображения base64 жестко закодированы на странице, это даст вам программный способ проверить, что все изображения "загружены", и предотвратить проблему преобразования pdf, начавшуюся до загрузки всех изображений...
Не могли бы вы добавить загрузку к загружаемым изображениям, которые вам нужно знать? что-то вроде
<img src='foo.jpg' onLoad='callbackFuncion();'/>
Возможно, вы могли бы обработать загруженный HTML-код, выполнить поиск тегов img, затем загрузить изображения в локальное хранилище и заменить атрибут src. Таким образом, вы должны создавать PDF-файл после того, как все изображения будут доступны.