Laravel集成Dompdf生成PDF时无法加载HTML中的图片
解决Laravel+Dompdf模板中图片无法加载的问题
嘿,这个坑我踩过!Dompdf对本地资源的路径处理有自己的规则,你模板里的相对路径它没法正确解析,给你几个实用的解决办法:
方法一:替换为绝对文件系统路径
Dompdf能识别本地文件的绝对路径,你可以在控制器加载HTML后,把模板里的相对路径替换成服务器上的真实物理路径:
public function create(Request $request) { $pdf = new Dompdf(); $html = Storage::disk('local')->get('public/pdf/template.html'); // 替换模板里的图片相对路径为绝对路径 $html = str_replace('img/logo.png', public_path('img/logo.png'), $html); $pdf->loadHtml($html, 'UTF-8'); $pdf->setPaper('A4', 'portrait'); $pdf->render(); $filename = "Hi!"; return $pdf->stream($filename, ["Attachment" => false]); }
这样Dompdf就能精准找到你的图片文件了。
方法二:配置Dompdf的chroot根目录
你可以给Dompdf设置一个根目录(chroot),让它解析相对路径时基于这个目录查找:
public function create(Request $request) { $pdf = new Dompdf(); // 设置chroot为public目录,这样模板里的相对路径就基于这里 $pdf->setOptions([ 'chroot' => public_path() ]); $html = Storage::disk('local')->get('public/pdf/template.html'); $pdf->loadHtml($html, 'UTF-8'); $pdf->setPaper('A4', 'portrait'); $pdf->render(); $filename = "Hi!"; return $pdf->stream($filename, ["Attachment" => false]); }
这时候模板里的<img src="img/logo.png">就能正常加载了,因为Dompdf会从public目录开始查找。
方法三:嵌入Base64编码的图片
如果你的图片不大,直接把图片转换成Base64编码嵌入HTML里是最省心的办法,完全不用管路径问题:
先在控制器里生成Base64字符串,替换到HTML中:
public function create(Request $request) { $pdf = new Dompdf(); $html = Storage::disk('local')->get('public/pdf/template.html'); // 把图片转换成Base64 $logoBase64 = base64_encode(file_get_contents(public_path('img/logo.png'))); $html = str_replace('{{logo_base64}}', $logoBase64, $html); $pdf->loadHtml($html, 'UTF-8'); $pdf->setPaper('A4', 'portrait'); $pdf->render(); $filename = "Hi!"; return $pdf->stream($filename, ["Attachment" => false]); }
然后模板里的img标签改成:
<img src="data:image/png;base64,{{logo_base64}}" alt="Logo">
额外注意事项
- 确保图片文件的权限正确,Web服务器进程有读取该文件的权限
- 如果图片存在
storage/app/public目录下,记得先执行php artisan storage:link创建软链接,让public目录能访问到storage里的文件
内容的提问来源于stack exchange,提问作者Alexxosipov
相关产品推荐
相关产品推荐

