You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:12:43