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

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

问题原因

  1. 路径解析冲突:@font-face中使用Storage::disk('public')->path()返回的是服务器本地绝对路径,laravel-dompdf桥接层对该路径的解析逻辑与原生DomPDF存在差异,导致字体加载后字符映射异常。
  2. 自定义配置干扰:手动将fontDir、fontCache、tempDir设置为系统临时目录,与laravel-dompdf默认配置冲突,破坏了字体缓存和加载的正常流程。
  3. 编码隐性不匹配:尽管文档设置了UTF-8编码,但桥接层加载本地字体文件时,可能出现文件读取编码与文档编码的隐性不匹配,导致渲染乱码,但文本本身编码正确,因此复制粘贴正常。

内容的提问来源于stack exchange,提问作者LucileDT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:44:53