
本文讲解在 Laravel 中使用 mPDF 生成含数据库图片的 PDF 时,解决图片无法显示的问题——关键在于使用 public_path() 获取本地文件绝对路径,而非 Web URL。
本文讲解在 laravel 中使用 mpdf 生成含数据库图片的 pdf 时,解决图片无法显示的问题——关键在于使用 `public_path()` 获取本地文件绝对路径,而非 web url。
在 Laravel 中集成 mPDF 生成 PDF 是常见需求,但许多开发者会遇到图片无法渲染的问题:浏览器中正常显示的 <img src="/frontend/assets/images/cv/xxx.jpg"> 在 mPDF 中却报错(如“Image file not found”或空白占位)。这是因为 mPDF 不解析 HTTP 请求,它直接读取本地文件系统;而你传入的 /frontend/... 是 Web 路径(相对 URL),mPDF 无法通过 HTTP 加载,也无法自动映射到物理路径。
✅ 正确做法是:将图片路径转换为服务器上的绝对文件系统路径,使用 Laravel 的 public_path() 辅助函数:
<!-- ✅ 正确:传递本地磁盘绝对路径 --> @@##@@image) }}" alt="Profile Image" width="120" height="120">
⚠️ 注意事项:
-
public_path()返回的是public/目录的完整绝对路径(如/var/www/myapp/public/frontend/...),mPDF 可直接读取; - 确保图片真实存在于该路径下,且 Web 服务器有读取权限(建议开发时用
file_exists()临时校验); - 不要加
http://或/开头的 URL —— mPDF 会尝试当作远程地址抓取(默认禁用),导致失败; - 若图片来自 Storage(如
public磁盘),仍可用public_path();若在storage/app/public/下,需先执行php artisan storage:link并确保路径指向正确; - mPDF 对图片格式支持良好(JPG、PNG、GIF),但不支持 SVG 渲染(需转为 PNG 或使用
svg扩展)。
? 补充建议(提升健壮性):
@php
$imgPath = public_path('frontend/assets/images/cv/' . ($data['seeker']->image ?? ''));
@endphp
@if($data['seeker']->image && file_exists($imgPath))
@@##@@
@else
<div style="width:120px; height:120px; background:#eee; display:flex; align-items:center; justify-content:center; color:#999;">
No Image
</div>
@endif
最后,在控制器中保持简洁清晰的 PDF 生成逻辑:
use Mpdf\Mpdf;
$data = [...]; // 从数据库获取的数据
$pdf = new Mpdf([
'mode' => 'UTF-8',
'format' => [400, 400],
'autoScriptToLang' => true,
'autoLangToFont' => true,
]);
$html = view('frontend.create-cv.pdf', compact('data'))->render();
$pdf->WriteHTML($html);
return response($pdf->Output('', 'S'))
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'inline; filename="cv.pdf"');
掌握路径转换这一核心要点,即可稳定输出含真实图片的高质量 PDF,避免因路径语义混淆导致的渲染失败。











