"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > DomPDF를 사용하여 Laravel PDF에서 BaseImage를 효율적으로 렌더링

DomPDF를 사용하여 Laravel PDF에서 BaseImage를 효율적으로 렌더링

2025-01-20에 게시됨
검색:228

Efficiently Rendering BaseImages in Laravel PDFs with DomPDF

DomPDF를 사용하여 Laravel에서 PDF를 생성할 때 이미지 처리가 까다로울 수 있습니다. 일반적인 문제 중 하나는 특히 단일 PDF에서 여러 이미지를 처리할 때 메모리 소비입니다. 이 게시물에서는 메모리를 효율적으로 관리하면서 Laravel PDF에 이미지를 삽입할 수 있는 강력한 솔루션을 공유하겠습니다.

도전

DomPDF를 사용하려면 이미지를 base64로 인코딩된 문자열로 HTML에 직접 삽입해야 합니다. 그러나 여러 이미지를 메모리에 동시에 로드하면 특히 대규모 카탈로그나 보고서를 생성할 때 PHP의 메모리 제한을 빠르게 초과할 수 있습니다.

해결책

저는 다음과 같은 메모리 효율적인 접근 방식을 개발했습니다.

  1. 메모리 오버플로를 방지하기 위해 이미지를 청크로 처리합니다.
  2. 누락된 이미지를 적절하게 처리합니다.
  3. 로컬 및 원격 이미지 파일 모두 지원
  4. DomPDF 호환성을 위해 base64 인코딩을 사용합니다.

완전한 솔루션은 다음과 같습니다.

@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');

합리적인 메모리 제한을 설정하는 것부터 시작합니다. 256MB는 일반적으로 대부분의 PDF 생성 작업에 충분하며 과도한 메모리 사용을 방지합니다.

2. 청크 기반 파일 읽기

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

file_get_contents()를 사용하여 전체 이미지를 메모리에 한 번에 로드하는 대신 다음을 수행합니다.

  • 바이너리 읽기 모드로 파일 열기
  • 8KB 단위로 읽기
  • 파일 끝에 도달할 때까지 청크를 연결합니다.
  • 파일 핸들을 올바르게 닫습니다.

이 접근 방식은 대용량 이미지를 처리할 때 메모리 사용량을 크게 줄여줍니다.

3. 누락된 이미지에 대한 대체

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

이미지 파일이 누락된 경우 오류가 발생하는 대신 base64로 인코딩된 1x1 투명 PNG가 반환됩니다. 이렇게 하면 이미지 누락으로 인해 PDF 생성이 실패하는 일이 발생하지 않습니다.

블레이드 템플릿에서의 사용법

블레이드 템플릿에서 이 솔루션을 구현하는 방법은 다음과 같습니다.

@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 문서에서 여러 이미지를 처리할 수 있습니다.

결론

Laravel에서 이미지가 포함된 PDF를 생성하는 데는 메모리 집약적인 프로세스가 필요하지 않습니다. 청크 기반 파일 읽기 및 적절한 오류 처리를 구현하면 대규모로 안정적으로 작동하는 강력한 PDF 생성 시스템을 만들 수 있습니다.

특정 요구 사항과 서버 제약 조건에 따라 메모리 제한과 청크 크기를 조정하는 것을 잊지 마세요. 최적의 성능을 보장하려면 프로덕션 환경에서 애플리케이션의 메모리 사용량을 모니터링하세요.


이 솔루션은 성능과 안정성을 유지하면서 여러 이미지가 필요한 경매 카탈로그, 제품 목록 또는 기타 PDF 문서를 생성하는 데 특히 유용합니다.

릴리스 선언문 이 기사는 다음과 같습니다
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3