«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Эффективный рендеринг базовых изображений в PDF-файлах Laravel с помощью DomPDF

Эффективный рендеринг базовых изображений в PDF-файлах Laravel с помощью DomPDF

Опубликовано 20 января 2025 г.
Просматривать:705

Efficiently Rendering BaseImages in Laravel PDFs with DomPDF

При создании PDF-файлов в Laravel с использованием DomPDF обработка изображений может оказаться сложной задачей. Одной из распространенных проблем является потребление памяти, особенно при работе с несколькими изображениями в одном PDF-файле. В этом посте я поделюсь надежным решением для встраивания изображений в PDF-файлы Laravel при эффективном управлении памятью.

Вызов

DomPDF требует, чтобы изображения были встроены непосредственно в HTML в виде строк в кодировке Base64. Однако одновременная загрузка нескольких изображений в память может быстро превысить ограничения памяти PHP, особенно при создании больших каталогов или отчетов.

Решение

Я разработал подход, позволяющий эффективно использовать память:

  1. Обрабатывает изображения частями, чтобы предотвратить переполнение памяти
  2. Элегантно обрабатывает отсутствующие изображения
  3. Поддерживает как локальные, так и удаленные файлы изображений
  4. Использует кодировку Base64 для совместимости с DomPDF

Вот полное решение:

@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

Как это работает

Давайте разберем ключевые компоненты:

1. Управление памятью

ini_set('memory_limit', '256M');

Начнем с установки разумного ограничения памяти. 256 МБ обычно достаточно для большинства задач создания PDF-файлов, предотвращая при этом неконтролируемое использование памяти.

2. Чтение файлов на основе фрагментов

$handle = fopen($imagePath, 'rb');
$contents = '';
while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}

Вместо того, чтобы сразу загружать все изображение в память с помощью file_get_contents(), мы:

  • Открыть файл в режиме двоичного чтения
  • Читайте частями по 8 КБ
  • Объединяем фрагменты, пока не достигнем конца файла
  • Правильно закройте дескриптор файла

Такой подход значительно снижает использование памяти при обработке больших изображений.

3. Резервный вариант для отсутствующих изображений

if (!file_exists($imagePath)) {
    return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
}

Если файл изображения отсутствует, мы возвращаем прозрачный PNG размером 1x1 в кодировке Base64 вместо выдачи ошибки. Это гарантирует, что создание PDF-файла не завершится неудачно из-за отсутствия изображений.

Использование в шаблонах Blade

Вот как реализовать это решение в шаблоне Blade:

@php $imagePath = $item['image_url']; if (empty($item['image_url'])) { $imagePath = public_path('images/placeholder.jpg'); } $base64Image = processImage($imagePath); @endphp

Шаблон:

  1. Проверяет URL-адрес изображения
  2. Выполняет возврат к заполнителю, если его не существует.
  3. Обрабатывает изображение с помощью нашей функции эффективного использования памяти
  4. Встраивает результат в кодировке Base64 в тег img

$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-файлов
  • Гибкость: работает как с локальными, так и с удаленными файлами изображений
  • Совместимость: кодировка Base64 обеспечивает правильную работу изображений с DomPDF
  • Масштабируемость: возможность обработки нескольких изображений в одном PDF-документе

Заключение

Создание PDF-файлов с изображениями в Laravel не обязательно должно быть трудоемким процессом. Реализуя чтение файлов по частям и правильную обработку ошибок, вы можете создать надежные системы создания PDF-файлов, которые надежно работают в масштабе.

Не забудьте настроить ограничение памяти и размер фрагмента в соответствии с вашими конкретными потребностями и ограничениями сервера. Контролируйте использование памяти вашим приложением в рабочей среде, чтобы обеспечить оптимальную производительность.


Это решение особенно полезно для создания аукционных каталогов, списков продуктов или любых других PDF-документов, для которых требуется несколько изображений, сохраняя при этом производительность и надежность.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/bhaidar/efficiently-rendering-base64-images-in-laravel-pdfs-with-dompdf-16pk?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3