将字体添加到 mPDF

2022-08-30 17:35:15

当我尝试使用mPDF类生成PDF时,我收到以下错误:

TTF file "C:/wamp/www/inc/mpdf/ttfonts/verdana.ttf": invalid checksum 20f65173c11 table: DSIG (expected 65173c11)

我已将字体文件上传到我的目录,并按如下方式定义字体:ttfontsconfig_fonts.php

"verdana" => array(
    'R' => "verdana.ttf",
    'B' => "verdanab.ttf",
    'I' => "verdanai.ttf",
    'BI' => "verdanaz.ttf",
    ),

我只在配置设置中打开字体错误报告时看到错误。当我关闭错误报告时,会生成PDF,但使用的字体不是Verdana。

对我做错了什么有任何想法吗?


答案 1

基于@hrvoje-golcic的答案,这里有一种改进且不那么肮脏的方法,可以在不编辑的情况下将字体添加到mPDF中。我使用的是Laravel,我用作曲家安装了mPDF。config_fonts.php

  1. 如作者建议的那样,在初始化之前定义一个在初始化之前命名的常量,并将值作为文件夹的路径(此常量至少从 5.3 开始存在)。_MPDF_TTFONTPATHmPDFttfonts
  2. 将文件夹复制到您控制的位置(供应商文件夹外部)。vendor/mpdf/mpdf/ttfonts
  3. 将您的自定义字体与其他字体一起添加到该文件夹中。
  4. 将您的配置添加到实例上的属性。fontdatamPDF

注意:该文件夹大约有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 中,作者实现了一种添加外部字体的优雅方法。


答案 2

以下是在 mpdf 库中添加新字体系列的步骤:

  1. 下载字体zip并解压缩它。
  2. 将新的字体文件添加到此位置文件夹。newFont.ttf/mpdf/ttfonts
  3. 编辑 OR 以将条目添加到数组中,以用于新字体文件。喜欢:/mpdf/config_fonts.php/mpdf/src/config/FontVariables.php$this->fontdata

    $this->fontdata = array(
        "newFont" => array(
        'R' => "newFont-Regular.ttf",
        'B' => "newFont-Bold.ttf",
        'I' => "newFont-Italic.ttf",
        'BI' => "newFont-BoldItalic.ttf",
    ),
    
  4. font-family: 'newFont';现在在样式表中可用。

  5. $mpdfObj = new mPDF('', '', 'newFont'); $mpdfObj->SetFont('newFont');

  6. 现在,您的新字体已添加。


推荐