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 テンプレートに実装する方法は次のとおりです:
@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; }
これにより、画像が保証されます:
このソリューションにはいくつかの利点があります:
Laravel で画像を含む PDF を生成するのは、メモリを大量に消費するプロセスである必要はありません。チャンクベースのファイル読み取りと適切なエラー処理を実装することで、大規模な場合でも確実に動作する堅牢な PDF 生成システムを作成できます。
特定のニーズとサーバーの制約に基づいてメモリ制限とチャンク サイズを調整することを忘れないでください。本番環境でのアプリケーションのメモリ使用量を監視して、最適なパフォーマンスを確保します。
このソリューションは、パフォーマンスと信頼性を維持しながら、オークション カタログ、商品リスト、または複数の画像を必要とするその他の PDF ドキュメントを生成する場合に特に役立ちます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3