使用laravel-pdf转换韩文内容显示为问号乱码如何解决
问题根因
你使用的laravel-pdf包底层默认基于dompdf渲染PDF,存在两个核心问题导致韩文乱码:
- dompdf不支持通过
@import加载的远程Google字体,你引入的韩文字体实际没有被PDF渲染器识别 - 你写的
font-family属性顺序错误,后声明的字体会覆盖前面的字体,韩文字体被后续的英文字体完全覆盖,而dompdf自带的默认字体无韩文编码,最终显示为问号
解决步骤
1. 下载韩文字体到本地
将需要用到的韩文支持字体(比如Noto Sans KR)的ttf格式字体文件下载到项目的public/fonts目录下,确保目录存在且有可读权限。
2. 修正Blade视图的样式代码
删掉原有的@import远程字体引入,改用@font-face加载本地字体,同时调整字体声明顺序:
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> /* 引入本地韩文支持字体 */ @font-face { font-family: 'Noto Sans KR'; src: url({{ public_path('fonts/NotoSansKR-Regular.ttf') }}) format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'Noto Sans KR'; src: url({{ public_path('fonts/NotoSansKR-Bold.ttf') }}) format('truetype'); font-weight: bold; font-style: normal; } * { /* 韩文字体放最前面优先生效 */ font-family: 'Noto Sans KR', 'Open Sans', 'Roboto', 'Single Day', sans-serif; } </style> </head> <body> <div> <h2>Hello, world~!</h2> <h1>안녕 세상아~~!</h1> </div> </body> </html>
3. (可选)调整dompdf配置
如果修改后还是乱码,执行以下操作调整配置:
- 发布dompdf配置文件:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
- 打开
config/dompdf.php,修改以下配置:
// 字体存储目录,确保该目录有可写权限 'font_dir' => storage_path('fonts/'), 'font_cache' => storage_path('fonts/'), // 允许加载本地资源 'is_remote_enabled' => true,
- 给字体缓存目录加权限:
mkdir -p storage/fonts chmod -R 755 storage/fonts
内容的提问来源于stack exchange,提问作者jayk
相关产品推荐
相关产品推荐

