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

如何在DomPDF中正确嵌入Google Font?打印时字体失效如何解决

你遇到的打印字体损坏问题,本质是DomPDF从Google Fonts远程拉取的字体是裁剪后的屏幕适配版本,没有完整嵌入所有字体信息,打印时PDF阅读器无法调用完整字体渲染导致的。

方案1:本地托管字体(最稳定,推荐)

这种方式完全规避远程拉取字体的不确定性,步骤如下:

  • 下载Open Sans所有需要的字重、样式的TTF格式字体文件存到项目本地可访问目录
  • 配置DomPDF的字体存储和缓存目录,确保目录对PHP进程有读写权限
  • 在HTML的CSS中用@font-face规则引入本地字体

修改后的代码示例:

$pdf = new Dompdf(new Options([
    'defaultPaperSize'          => 'a4',
    'defaultPaperOrientation'   => 'portrait',
    'isRemoteEnabled'           => true,
    'allowUrlFopen'             => true,
    'isHtml5ParserEnabled'      => true,
    'fontDir'                   => '/path/to/your/font/dir', // 本地字体存放目录
    'fontCacheDir'              => '/path/to/your/font/cache/dir', // 字体缓存目录
    'isFontSubsettingEnabled'   => false, // 关闭字体子集化,确保全量嵌入
]));

$pdf->loadHtml('
    <style>
        @font-face {
            font-family: "Open Sans";
            src: url("/path/to/local/fonts/OpenSans-Regular.ttf") format("truetype");
            font-weight: 400;
            font-style: normal;
        }
        @font-face {
            font-family: "Open Sans";
            src: url("/path/to/local/fonts/OpenSans-Italic.ttf") format("truetype");
            font-weight: 400;
            font-style: italic;
        }
        @font-face {
            font-family: "Open Sans";
            src: url("/path/to/local/fonts/OpenSans-SemiBold.ttf") format("truetype");
            font-weight: 600;
            font-style: normal;
        }
        /* 其余用到的字重、样式按上面格式补充完整 */
        span {
            font-family: "Open Sans", sans-serif;
        }
    </style>
    <body>
        <span>This should be in Open Sans</span>
    </body>
');
$pdf->render();
$pdf->stream();

方案2:修改请求UA获取完整远程字体

如果一定要用Google Fonts远程链接,可以修改DomPDF的HTTP请求UA,伪装成桌面浏览器,让Google Fonts返回全量字体包:
在初始化DomPDF后添加以下代码:

$context = stream_context_create([
    'http' => [
        'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
    ]
]);
$pdf->setHttpContext($context);

两种方案配置完成后,都可以在生成的PDF阅读器的文档属性中查看字体列表,确认Open Sans的所有用到的样式都显示「已嵌入」或「已嵌入子集」,即代表字体嵌入成功,打印不会再出现损坏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:45:04