在mPDF 7中注册自定义字体遇到问题
解决mPDF 7.0.3注册Google Fonts自定义TTF字体的问题
我之前也踩过mPDF 7.x版本注册自定义字体的坑,结合官方文档和实际排查经验,给你梳理几个关键的修复点:
1. 先确认字体路径的正确性
你代码里的__DIR__ . '/files/theme/fonts/Merriweather...大概率没写完整,而且要注意:mPDF需要的是字体文件所在的文件夹路径,不是单个字体文件的路径。
- 先验证路径是否存在:可以加一行
var_dump(is_dir(__DIR__ . '/files/theme/fonts/Merriweather'));,如果返回false,说明路径拼写错误或者文件夹不存在。 - 注意系统大小写:Linux服务器下路径和文件名是大小写敏感的,要确保和实际文件完全一致。
2. 补全字体数据的配置
官方示例只是给出了框架,你需要手动添加自定义字体的具体字重和样式映射,比如:
// 在获取默认fontData后,添加你的字体信息 $fontData['merriweather'] = [ 'R' => 'Merriweather-Regular.ttf', // 常规体 'B' => 'Merriweather-Bold.ttf', // 粗体 'I' => 'Merriweather-Italic.ttf', // 斜体 'BI' => 'Merriweather-BoldItalic.ttf' // 粗斜体 ];
这里的merriweather是你后续在CSS中要引用的字体标识,要和实际TTF文件名一一对应。
3. 完整的mPDF初始化代码
把路径合并、字体配置整合完整,正确的代码应该是这样:
// 获取默认配置 $defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults(); $fontDirs = $defaultConfig['fontDir']; $defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults(); $fontData = $defaultFontConfig['fontdata']; // 追加自定义字体数据 $fontData['merriweather'] = [ 'R' => 'Merriweather-Regular.ttf', 'B' => 'Merriweather-Bold.ttf', 'I' => 'Merriweather-Italic.ttf', 'BI' => 'Merriweather-BoldItalic.ttf' ]; // 初始化mPDF,合并配置 $pdf = new \Mpdf\Mpdf([ 'fontDir' => array_merge($fontDirs, [ __DIR__ . '/files/theme/fonts/Merriweather' // 确保这是字体文件夹的正确路径 ]), 'fontdata' => $fontData, 'default_font' => 'merriweather' // 可选:设置默认字体为自定义字体 ]);
4. 验证字体是否加载成功
初始化mPDF后,可以用$pdf->showFonts();输出所有已加载的字体列表,看看你的Merriweather是否在其中——如果不在,说明路径或配置有问题;如果在,那就是CSS引用的问题。
5. CSS中正确引用字体
生成PDF时,要在样式里指定你配置的字体标识:
body { font-family: 'merriweather', serif; }
这里的merriweather要和你在fontData里设置的键名完全一致,不能直接写“Merriweather”(除非你把键名设成这个)。
6. 排查服务器权限问题
如果是在线上服务器运行,要确保mPDF进程有读取字体文件夹的权限:
- 给字体文件夹设置
755权限 - 给TTF文件设置
644权限
内容的提问来源于stack exchange,提问作者Niklas Gruhn
相关产品推荐
相关产品推荐

