laravel-dompdf中Nunito自定义字体渲染乱码问题求助
使用barryvdh/laravel-dompdf时Nunito字体渲染乱码问题
问题描述
使用barryvdh/laravel-dompdf生成文档时,指定的Nunito字体渲染出奇怪字符,但字体已成功加载(未回退到默认sans-serif),且复制粘贴文本可得到正确内容。单独使用原生DomPDF时字体渲染正常。
相关代码
控制器方法
public function generateSocialBanner(EditionUser $editionUser) { $domPDF = $this->documentsManager->generateDocument($editionUser); return $domPDF->stream(); }
generateDocument()方法
// use Barryvdh\DomPDF\Facade\Pdf as DomPDFFacade; private function generateDocument() { $myContent = '<h1>Some text</h1>'; $document = DomPDFFacade::loadView('documents.banner', compact('myContent')); // 该设置可解决部分字体问题,但会增大文档体积 $document->setOption('isFontSubsettingEnabled', false); // 配置字体目录以允许DomPdf编译Nunito $tmpDir = sys_get_temp_dir(); $document->setOption('fontDir', $tmpDir); $document->setOption('fontCache', $tmpDir); $document->setOption('tempDir', $tmpDir); $document->setPaper('L'); $document->output(); return $document; }
documents/banner.blade.php视图
<!DOCTYPE html> <html> <head> <title>BANNER</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> @font-face { font-family: 'Nunito'; src: url("{{ Storage::disk('public')->path('fonts/nunito/static/Nunito-Regular.ttf') }}") format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'Nunito'; src: url("{{ Storage::disk('public')->path('fonts/nunito/static/Nunito-Bold.ttf') }}") format('truetype'); font-weight: bold; font-style: normal; } @font-face { font-family: 'Nunito'; src: url("{{ Storage::disk('public')->path('fonts/nunito/static/Nunito-Italic.ttf') }}") format('truetype'); font-weight: normal; font-style: italic; } @font-face { font-family: 'Nunito'; src: url("{{ Storage::disk('public')->path('fonts/nunito/static/Nunito-BoldItalic.ttf') }}") format('truetype'); font-weight: bold; font-style: italic; } html { margin: 0; padding: 0; } body { font-size: 13px; font-family: 'Nunito', sans-serif; } </style> </head> <body> <div> {!! $myContent !!} </div> </body> </html>
系统信息
- PHP 7.4
- Laravel 8
- barryvdh/laravel-dompdf 2.1.1
- dompdf/dompdf 2.0.3
问题原因
- 路径解析冲突:
@font-face中使用Storage::disk('public')->path()返回的是服务器本地绝对路径,laravel-dompdf桥接层对该路径的解析逻辑与原生DomPDF存在差异,导致字体加载后字符映射异常。 - 自定义配置干扰:手动将
fontDir、fontCache、tempDir设置为系统临时目录,与laravel-dompdf默认配置冲突,破坏了字体缓存和加载的正常流程。 - 编码隐性不匹配:尽管文档设置了UTF-8编码,但桥接层加载本地字体文件时,可能出现文件读取编码与文档编码的隐性不匹配,导致渲染乱码,但文本本身编码正确,因此复制粘贴正常。
内容的提问来源于stack exchange,提问作者LucileDT
相关产品推荐
相关产品推荐

