laravel跨平台pdf配置三大要点:路径须用storage_path()等内置函数避免硬编码分隔符;linux需自带中文字体并显式配置default_font;temp_dir必须设为sys_get_temp_dir()且确保web用户有写权限。

Windows 和 Linux 下 Laravel 的配置差异,核心就三点:路径分隔符、字体加载逻辑、临时目录权限。不处理好,PDF 生成失败、中文乱码、dompdf 报错都是常态。
路径配置必须用 Laravel 内置函数,别硬写 / 或 \
Windows 用反斜杠,Linux 用正斜杠,但你写死任何一种都会在另一平台崩。比如在 config/dompdf.php 里写 'font_dir' => 'storage/fonts',在 Windows 上可能变成 storage\fonts,DOMPDF 就找不到目录。
- ✅ 正确做法:统一用
storage_path('fonts')、base_path()、sys_get_temp_dir() - ✅
chroot必须用realpath(base_path()),否则 DOMPDF 在 Linux 下可能拒绝加载本地资源 - ❌ 别在配置里拼接字符串,比如
__DIR__ . '/../storage/fonts'——__DIR__在不同系统下返回的路径格式不可控
中文字体在 Linux 上大概率不生效,得自己带进项目
Windows 默认有 simhei.ttf、msyh.ttc,Linux(尤其是 Docker 容器或最小化安装)通常一个中文字体都没有。DOMPDF 找不到字体,就会 fallback 到无衬线英文,中文直接变方块或空白。
- ✅ 把
simhei.ttf或NotoSansCJKsc-Regular.otf放进storage/fonts/目录 - ✅ 在
config/dompdf.php中显式指定:'default_font' => 'simhei' - ✅ 运行一次
php artisan storage:link,确保public/storage能正确映射(虽然 DOMPDF 不走 public,但有些字体加载逻辑会间接依赖) - ⚠️ 注意:字体文件名必须和配置中的名称完全一致(大小写敏感),Linux 下
SimHei.ttf≠simhei.ttf
temp_dir 权限问题在 Linux 上最常见,Windows 反而容易忽略
DOMPDF 渲染 PDF 时会在临时目录解压字体、缓存 CSS、生成中间 HTML —— 如果 temp_dir 不可写,你会看到类似 file_put_contents(): failed to open stream: Permission denied 的错误,而且往往不报具体路径。
- ✅ 配置里直接用
'temp_dir' => sys_get_temp_dir(),它会自动返回系统级临时目录(如 Linux 是/tmp,Windows 是C:\Windows\Temp) - ✅ Linux 上确认 Web 进程用户(如
www-data或nginx)对/tmp有写权限;如果用了自定义缓存目录,记得chown和chmod 755 - ✅ Windows 下重点检查 PHP 是否以管理员权限运行(尤其用
php artisan serve时),否则可能无法写入系统临时目录
跨平台配置最麻烦的不是改几行代码,而是改完之后没验证。建议在 CI 或本地用两个系统各跑一次 PDF 生成测试,看中文是否正常、页眉页脚是否错位、字体是否嵌入成功 —— 这些细节一旦上线才暴露,修复成本远高于提前测一次。











