如何在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
相关产品推荐
相关产品推荐

