Laravel dompdf自定义字体缓存目录配置无效问题求助
解决Laravel-Dompdf v0.8.5自定义字体缓存路径问题
我完全懂你的困扰——自定义字体的缓存文件跑到被Git追踪的storage/fonts目录里,多环境协作时Git状态乱得头疼,改了配置还没效果确实闹心。下面给你几个针对性的解决方案,按优先级来试:
1. 先确认Dompdf配置文件真的生效了
Laravel-Dompdf不会自动生成config/dompdf.php,如果是你手动建的或者没执行发布命令,改的配置根本没被加载:
- 先执行这条命令生成官方配置文件:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" - 打开生成的
config/dompdf.php,确保这两个配置项是你要的路径:
重点:得确保'font_cache' => storage_path('tmp/font-cache/'), 'temp_dir' => storage_path('tmp/font-cache/'),storage/tmp/font-cache目录存在,而且Web服务器用户(比如www-data或者nginx)有读写权限,不然Dompdf会直接 fallback 回默认的缓存路径。
2. 清掉旧缓存,强制重新生成
之前生成的缓存文件已经记住了旧路径,必须先清理干净:
- 删除
storage/fonts/dompdf_font_family_cache.php,还有该目录下那些类似jaldi-normal_xxxxxx的字体缓存文件 - 手动创建目标缓存目录并设置权限:
mkdir -p storage/tmp/font-cache chmod -R 775 storage/tmp/font-cache chown -R www-data:www-data storage/tmp/font-cache # 这里根据你服务器的用户调整,比如本地开发可能用你的用户名 - 重新生成一次PDF,这时候Dompdf应该会把新缓存写到你指定的目录里了。
3. 检查代码里有没有硬编码的配置覆盖
如果你在生成PDF的代码里手动设置了Dompdf选项,会直接覆盖配置文件的设置。比如这种情况:
$pdf = PDF::loadView('pdf.invoice', $data) ->setOptions([ 'font_cache' => storage_path('fonts/'), // 这里硬写了旧路径,就会覆盖配置 ]);
把所有生成PDF的代码都检查一遍,要么删掉手动设置的font_cache,要么改成你想要的路径。
4. 试试调整@font-face的字体路径(可选)
这不是缓存路径的直接原因,但确保字体路径正确能避免其他潜在问题:
如果字体放在public目录,可以用公共路径:
@font-face { font-family: 'Jaldi'; src: url('{{ public_path('fonts/Jaldi/Jaldi-Regular.ttf') }}') format("truetype"); }
要是字体在storage目录,只要服务器本地能读取就行,你原来的写法没问题,但可以确认下路径是否绝对正确。
5. 直接手动初始化Dompdf实例(兜底方案)
如果上面的方法都不行,可能是Laravel封装层的问题,试试绕开服务提供者,手动配置Dompdf:
use Dompdf\Dompdf; use Dompdf\Options; $options = new Options(); $options->set('font_cache', storage_path('tmp/font-cache/')); $options->set('temp_dir', storage_path('tmp/font-cache/')); $dompdf = new Dompdf($options); $dompdf->loadHtml(view('pdf.your-view')->render()); $dompdf->render(); return $dompdf->stream();
这种方式能确保配置直接生效,排除Laravel封装的干扰。
按上面的步骤逐一排查,应该就能解决缓存路径的问题了。
内容的提问来源于stack exchange,提问作者guyaloni
相关产品推荐
相关产品推荐

