При создании PDF-файлов в Laravel с использованием DomPDF обработка изображений может оказаться сложной задачей. Одной из распространенных проблем является потребление памяти, особенно при работе с несколькими изображениями в одном PDF-файле. В этом посте я поделюсь надежным решением для встраивания изображений в PDF-файлы Laravel при эффективном управлении памятью.
DomPDF требует, чтобы изображения были встроены непосредственно в HTML в виде строк в кодировке Base64. Однако одновременная загрузка нескольких изображений в память может быстро превысить ограничения памяти PHP, особенно при создании больших каталогов или отчетов.
Я разработал подход, позволяющий эффективно использовать память:
Вот полное решение:
@php ini_set('memory_limit', '256M'); function processImage($imagePath) { if (!file_exists($imagePath)) { // Return a 1-pixel transparent image as fallback return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; } // Read file in chunks to avoid memory issues $handle = fopen($imagePath, 'rb'); $contents = ''; while (!feof($handle)) { $contents .= fread($handle, 8192); // Read 8KB at a time } fclose($handle); return base64_encode($contents); } @endphp
Давайте разберем ключевые компоненты:
ini_set('memory_limit', '256M');
Начнем с установки разумного ограничения памяти. 256 МБ обычно достаточно для большинства задач создания PDF-файлов, предотвращая при этом неконтролируемое использование памяти.
$handle = fopen($imagePath, 'rb'); $contents = ''; while (!feof($handle)) { $contents .= fread($handle, 8192); }
Вместо того, чтобы сразу загружать все изображение в память с помощью file_get_contents(), мы:
Такой подход значительно снижает использование памяти при обработке больших изображений.
if (!file_exists($imagePath)) { return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; }
Если файл изображения отсутствует, мы возвращаем прозрачный PNG размером 1x1 в кодировке Base64 вместо выдачи ошибки. Это гарантирует, что создание PDF-файла не завершится неудачно из-за отсутствия изображений.
Вот как реализовать это решение в шаблоне Blade:
@php $imagePath = $item['image_url']; if (empty($item['image_url'])) { $imagePath = public_path('images/placeholder.jpg'); } $base64Image = processImage($imagePath); @endphp![]()
Шаблон:
$item['image_url'] содержит полный абсолютный путь к изображению, например /var/www/html/....
Чтобы обеспечить правильное отображение изображений в PDF-файле, обратите внимание на следующие свойства CSS:
.item-image img { object-fit: cover; object-position: center; border-radius: 0.375rem; max-width: 100%; height: auto; }
Это гарантирует изображения:
Это решение имеет ряд преимуществ:
Создание PDF-файлов с изображениями в Laravel не обязательно должно быть трудоемким процессом. Реализуя чтение файлов по частям и правильную обработку ошибок, вы можете создать надежные системы создания PDF-файлов, которые надежно работают в масштабе.
Не забудьте настроить ограничение памяти и размер фрагмента в соответствии с вашими конкретными потребностями и ограничениями сервера. Контролируйте использование памяти вашим приложением в рабочей среде, чтобы обеспечить оптимальную производительность.
Это решение особенно полезно для создания аукционных каталогов, списков продуктов или любых других PDF-документов, для которых требуется несколько изображений, сохраняя при этом производительность и надежность.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3