Laravel中DOMPDF生成PDF时古吉拉特语/印地语显示异常求助
Laravel DOMPDF 显示古吉拉特语/印地语排版错乱的解决方法
1. 正确配置本地字体加载
DOMPDF无法自动识别storage/fonts下的字体文件,必须通过@font-face明确声明,同时确保字体文件路径可被DOMPDF访问:
- 建议将字体文件移动到
public/fonts目录,或给storage/fonts创建软链接到public/fonts,执行命令:php artisan storage:link - 在Blade模板的
<style>中添加字体声明:
@font-face { font-family: 'NotoSerifGujarati'; src: url('{{ public_path('fonts/NotoSerifGujarati-Regular.ttf') }}') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'TiroDevanagariHindi'; src: url('{{ public_path('fonts/TiroDevanagariHindi-Regular.ttf') }}') format('truetype'); font-weight: normal; font-style: normal; }
2. 修正HTML语言与编码属性
将HTML的lang属性改为对应语言,确保DOMPDF识别文本排版规则:
<!-- 古吉拉特语场景 --> <html lang="gu"> <!-- 印地语场景 --> <html lang="hi">
保留原有的<meta http-equiv="Content-Type" content="text/html; charset=utf-8">确保字符编码正确。
3. 调整DOMPDF配置
修改config/dompdf.php中的以下配置项:
return [ 'default_charset' => 'UTF-8', 'enable_font_subsetting' => true, 'allow_url_fopen' => true, 'font_cache' => storage_path('fonts'), // 指定字体缓存目录 ];
启用字体子集化可减少PDF体积,同时确保DOMPDF正确处理复杂脚本字体。
4. 模板中条件应用字体
用Blade语法替代原生PHP条件判断,确保字体族名称与@font-face声明一致:
@page{ padding: 15px; } @if($header->lang == 'Guj') * { font-family: 'NotoSerifGujarati', sans-serif; } @elseif($header->lang == 'Hindi') * { font-family: 'TiroDevanagariHindi', sans-serif; } @endif
5. 验证字体嵌入
生成PDF后,通过PDF阅读器的「文件属性-字体」选项,检查目标字体是否已嵌入。如果未嵌入,需排查字体文件路径是否正确,或更换完整无损坏的TTF字体文件。
内容的提问来源于stack exchange,提问作者Maya Shah
相关产品推荐
相关产品推荐

