如何在Laravel的dompdf中显示印地语与古吉拉特语字体
解决Laravel中dompdf同时显示印地语和古吉拉特语字体的问题
1. 修复CSS字体声明错误
你当前的CSS写法会让后一个font-family覆盖前一个,导致全局仅使用Noto Sans Gujarati,印地语内容可能依赖默认 fallback 显示,而古吉拉特语因字体未正确加载出现异常。可以通过两种方式修正:
方式一:全局Fallback字体链
将多个字体合并到同一个font-family声明中,dompdf会自动为对应语言的字符匹配合适字体:
* { font-family: 'Noto Sans Devanagari', 'Noto Sans Gujarati', sans-serif; }
方式二:针对不同语言内容单独设置
给印地语、古吉拉特语内容分别添加类名:
<p class="devanagari">印地语内容示例</p> <p class="gujarati">古吉拉特语内容示例</p>
再通过样式指定对应字体:
.devanagari { font-family: 'Noto Sans Devanagari', sans-serif; } .gujarati { font-family: 'Noto Sans Gujarati', sans-serif; }
2. 正确注册本地字体到dompdf
dompdf无法直接识别storage/fonts目录下的字体文件,需生成字体元数据并完成注册:
- 进入Laravel项目根目录,执行dompdf字体加载命令(替换为你的实际字体文件名):
# 注册印地语字体 php vendor/dompdf/dompdf/lib/fonts/load_font.php "Noto Sans Devanagari" storage/fonts/NotoSansDevanagari-Regular.ttf # 注册古吉拉特语字体 php vendor/dompdf/dompdf/lib/fonts/load_font.php "Noto Sans Gujarati" storage/fonts/NotoSansGujarati-Regular.ttf - 若使用
barryvdh/laravel-dompdf,先发布配置文件:
然后修改php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"config/dompdf.php中的字体路径配置:'font_dir' => storage_path('fonts/'), 'font_cache' => storage_path('fonts/'),
3. 升级数据库字符集到utf8mb4
MySQL的utf8仅支持3字节Unicode字符,部分复杂语言字符可能无法正确存储,建议升级为utf8mb4:
- 修改
config/database.php中的数据库连接配置:'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', - 将存储多语言内容的表和字段的字符集改为
utf8mb4,排序规则改为utf8mb4_unicode_ci。
4. 移除远程谷歌字体链接
dompdf对远程字体的加载支持不稳定,容易出现加载失败导致字体失效的问题,建议完全依赖本地注册字体,删除<link>标签。
内容的提问来源于stack exchange,提问作者Maya Shah
相关产品推荐
相关产品推荐

