基于@hrvoje-golcic的答案,这里有一种改进且不那么肮脏的方法,可以在不编辑的情况下将字体添加到mPDF中。我使用的是Laravel,我用作曲家安装了mPDF。config_fonts.php
- 如作者建议的那样,在初始化之前定义一个在初始化之前命名的常量,并将值作为文件夹的路径(此常量至少从 5.3 开始存在)。
_MPDF_TTFONTPATH
mPDF
ttfonts
- 将文件夹复制到您控制的位置(供应商文件夹外部)。
vendor/mpdf/mpdf/ttfonts
- 将您的自定义字体与其他字体一起添加到该文件夹中。
- 将您的配置添加到实例上的属性。
fontdata
mPDF
注意:该文件夹大约有90MB,因此可能仍然有更好的方法,但是由于原始配置添加了它们,因此您必须复制所有字体。请参阅此答案底部的作曲家脚本替代方案。ttfonts
重要说明:CSS 字体系列将转换为小写字母 + 无空格,因此“Source Sans Pro”将成为 sourceanspro。
下面是一个示例:
if (!defined('_MPDF_TTFONTPATH')) {
// an absolute path is preferred, trailing slash required:
define('_MPDF_TTFONTPATH', realpath('fonts/'));
// example using Laravel's resource_path function:
// define('_MPDF_TTFONTPATH', resource_path('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) {
// add to fontdata array
$mpdf->fontdata[$f] = $fs;
// add to available fonts array
foreach (['R', 'B', 'I', 'BI'] as $style) {
if (isset($fs[$style]) && $fs[$style]) {
// warning: no suffix for regular style! hours wasted: 2
$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);
作曲家安装后脚本
而不是复制所有字体并将它们添加到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 中,作者实现了一种添加外部字体的优雅方法。