You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:37:51