使用barryvdh/laravel-snappy生成PDF时图片无法显示问题求助
解决方案
问题根因说明
该问题90%概率是执行sudo apt upgrade后,系统自动更新了wkhtmltopdf(laravel-snappy底层依赖的PDF生成工具)版本,新版本默认禁用了远程HTTPS资源加载,或是更新后缺少SSL相关依赖导致无法加载S3存储的图片资源。
可按以下优先级尝试修复
方案1:调整snappy配置参数
修改Laravel项目根目录下config/snappy.php文件,给pdf配置项添加允许加载远程资源、跳过SSL验证的参数:
return [ 'pdf' => [ 'enabled' => true, 'binary' => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'), 'timeout' => false, 'options' => [ // 允许加载本地/远程资源 'enable-local-file-access' => true, // 跳过SSL证书验证,解决HTTPS资源加载失败问题 'no-ssl-certificate-verification' => true, // 给资源预留加载时间,单位毫秒 'javascript-delay' => 2000, 'encoding' => 'UTF-8', ], 'env' => [], ], ];
也可以在生成PDF时动态指定参数:
$pdf = \Barryvdh\Snappy\Facades\SnappyPdf::loadView('你的视图路径') ->setOption('no-ssl-certificate-verification', true); return $pdf->download('导出文件.pdf');
方案2:重装带QT补丁的wkhtmltopdf版本
系统apt源自带的wkhtmltopdf通常是无QT补丁的简化版本,缺失很多渲染功能,建议卸载后安装官方预编译的完整版本:
- 卸载现有版本:
sudo apt remove --purge wkhtmltopdf -y - 安装运行依赖:
sudo apt install libxrender1 libfontconfig1 libxext6 -y - 下载对应你服务器系统架构的带QT补丁的wkhtmltopdf预编译安装包,安装完成后执行
wkhtmltopdf --version,确认输出包含with patched qt字样即可。
方案3:将远程图片转为base64嵌入
如果调整参数后仍然无法加载远程图片,可在渲染HTML前将图片转为base64编码直接嵌入页面,彻底跳过远程资源加载步骤,示例辅助函数:
function convertImgToBase64(string $imgUrl): string { $imgContent = file_get_contents($imgUrl); $mime = (new \Finfo(FILEINFO_MIME_TYPE))->buffer($imgContent); return 'data:' . $mime . ';base64,' . base64_encode($imgContent); }
在Blade模板中替换图片的src属性即可:
<img src="{{ convertImgToBase64('你的S3图片地址') }}" alt="图片">
方案4:排查网络访问限制
在服务器命令行执行curl命令测试是否能正常访问S3图片资源:curl -I 你的S3图片地址
如果返回4xx/5xx错误或者超时,说明apt upgrade过程中更新了系统防火墙、安全组策略,或是S3的访问权限配置发生了变化,需对应排查网络层面的限制。
内容的提问来源于stack exchange,提问作者Mak_091
相关产品推荐
相关产品推荐

