如何修复Laravel 9中使用Dompdf生成PDF的编码问题
解决Laravel 9 + Dompdf生成PDF时波斯语/阿拉伯语乱码问题
出现问号乱码的核心原因是Dompdf默认未加载支持波斯语/阿拉伯语的字体,且RTL(从右到左)语言需要额外配置。以下是具体修复步骤:
1. 引入支持UTF-8的波斯语/阿拉伯语字体
- 下载兼容的字体(比如Vazirmatn、IRANSans),将字体文件(.ttf格式优先)放到项目的
public/fonts目录下。 - 在Blade视图的样式中指定字体并开启RTL布局:
body { font-family: 'Vazirmatn', sans-serif; direction: rtl; /* 波斯语/阿拉伯语为从右到左书写,必须设置 */ }
2. 配置Dompdf加载自定义字体
方法一:在生成方法中临时配置
修改你的convertToPdf方法:
public function convertToPdf(Request $request, Order $order) { $dompdf = new Dompdf(); // 注册自定义字体(以Vazirmatn为例) $fontPath = public_path('fonts/Vazirmatn-Regular.ttf'); $dompdf->getFontMetrics()->registerFont( ['family' => 'Vazirmatn', 'weight' => 'normal', 'style' => 'normal'], $fontPath ); // 渲染视图并添加UTF-8编码声明 $html = '<meta charset="UTF-8">' . view('admin.shop.orders.order_details_pdf')->render(); $dompdf->loadHtml($html); $dompdf->setPaper('A4','landscape'); // 开启HTML5解析以更好支持RTL $dompdf->setOption('isHtml5ParserEnabled', true); $dompdf->render(); $dompdf->stream('demo.pdf',['Attachment' => false]); }
方法二:全局配置Dompdf
先发布Dompdf配置文件:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
在config/dompdf.php中添加字体相关配置:
'font_dir' => public_path('fonts/'), 'font_cache' => storage_path('fonts/'), 'default_font' => 'Vazirmatn',
3. 确保Blade视图编码正确
- 在视图的
<head>标签内添加<meta charset="UTF-8">声明。 - 确保Blade视图文件本身的编码为UTF-8(避免用GBK等非UTF-8编码保存)。
4. 优化RTL布局显示
除了设置direction: rtl,可给容器元素添加text-align: right,确保文字排版符合波斯语/阿拉伯语的阅读习惯。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

