DomPDF を使用して Laravel で PDF を生成する場合、画像の処理は難しい場合があります。一般的な課題の 1 つは、特に 1 つの PDF で複数の画像を処理する場合のメモリ消費です。この投稿では、メモリを効率的に管理しながら、Laravel PDF に画像を埋め込むための堅牢なソリューションを共有します。
DomPDF では、画像を Base64 でエンコードされた文字列として HTML に直接埋め込む必要があります。ただし、複数の画像を同時にメモリに読み込むと、特に大規模なカタログやレポートを生成する場合、すぐに 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');
まず、適切なメモリ制限を設定します。通常、メモリの暴走を防ぎながら、ほとんどの PDF 生成タスクには 256MB で十分です。
$handle = fopen($imagePath, 'rb'); $contents = ''; while (!feof($handle)) { $contents .= fread($handle, 8192); }
file_get_contents() を使用して画像全体を一度にメモリにロードする代わりに、次のようにします。
このアプローチにより、大きな画像を処理する際のメモリ使用量が大幅に削減されます。
if (!file_exists($imagePath)) { return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; }
画像ファイルが見つからない場合は、エラーをスローする代わりに、base64 でエンコードされた 1x1 の透明 PNG を返します。これにより、画像の欠落によって PDF 生成が失敗することがなくなります。
このソリューションを Blade テンプレートに実装する方法は次のとおりです:
<div> @php $imagePath = $item['image_url']; if (empty($item['image_url'])) { $imagePath = public_path('images/placeholder.jpg'); } $base64Image = processImage($imagePath); @endphp <img src="data:image/png;base64,{{ $base64Image }}" alt=""> </div>
テンプレート:
$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; }
これにより、画像が保証されます:
このソリューションにはいくつかの利点があります:
Laravel で画像を含む PDF を生成するのは、メモリを大量に消費するプロセスである必要はありません。チャンクベースのファイル読み取りと適切なエラー処理を実装することで、大規模な場合でも確実に動作する堅牢な PDF 生成システムを作成できます。
特定のニーズとサーバーの制約に基づいてメモリ制限とチャンク サイズを調整することを忘れないでください。本番環境でのアプリケーションのメモリ使用量を監視して、最適なパフォーマンスを確保します。
このソリューションは、パフォーマンスと信頼性を維持しながら、オークション カタログ、商品リスト、または複数の画像を必要とするその他の PDF ドキュメントを生成する場合に特に役立ちます。
以上がDomPDF を使用して Laravel PDF の BaseImage を効率的にレンダリングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。