基于 @hrvoje-golcic 的回答,这里提供一种改进且更少污染的方法来向 mPDF 添加字体而无需编辑config_fonts.php
。我正在使用 Laravel,使用 composer 安装了 mPDF。
- 按照作者建议,在初始化
mPDF
之前定义一个名为 _MPDF_TTFONTPATH
的常量,并将值设置为您的 ttfonts
文件夹的路径(此常量至少自5.3版以来就已存在)。
- 将
vendor/mpdf/mpdf/ttfonts
文件夹复制到您控制的位置(位于 vendor 文件夹之外)。
- 将您的自定义字体与其他字体一起添加到该文件夹中。
- 将您的配置添加到
mPDF
实例的fontdata
属性中。
注意:ttfonts
文件夹大小约为90MB,因此可能仍有更好的方法,但您必须复制所有字体,因为原始配置会将它们添加到里面。请参见本答案底部的composer脚本替代方案。
重要提示:CSS font-family 将转换为小写字母+无空格,因此“Source Sans Pro”将变为 sourcesanspro。
以下是一个例子:
if (!defined('_MPDF_TTFONTPATH')) {
define('_MPDF_TTFONTPATH', realpath('fonts/'));
}
function add_custom_fonts_to_mpdf($mpdf, $fonts_list) {
$fontdata = [
'sourcesanspro' => [
'R' => 'SourceSansPro-Regular.ttf',
'B' => 'SourceSansPro-Bold.ttf',
],
];
foreach ($fontdata as $f => $fs) {
$mpdf->fontdata[$f] = $fs;
foreach (['R', 'B', 'I', 'BI'] as $style) {
if (isset($fs[$style]) && $fs[$style]) {
$mpdf->available_unifonts[] = $f . trim($style, 'R');
}
}
}
$mpdf->default_available_fonts = $mpdf->available_unifonts;
}
$mpdf = new mPDF('UTF-8', 'A4');
add_custom_fonts_to_mpdf($mpdf);
$mpdf->WriteHTML($html);
Composer安装后脚本
使用Composer安装后脚本的巧妙方法,可以避免复制所有字体并将它们添加到git中。
首先,请确保您希望复制字体的文件夹存在,并在其中创建一个 .gitignore
文件,并添加以下内容:
*
!.gitignore
!SourceSansPro-Regular.ttf
!SourceSansPro-Bold.ttf
这将忽略除.gitignore
文件和您想要添加的字体之外的所有内容。
接下来,在您的composer.json
文件中添加以下脚本:
"scripts": {
"post-install-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
],
"post-update-cmd": [
"cp -f vendor/mpdf/mpdf/ttfonts/* resources/fonts/"
]
}
注意事项
此版本已测试通过6.1。
在7.x中,作者实现了一种优雅的方式来添加外部字体。