23

I'm getting the following error when I try and generate a PDF using the mPDF class:

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

I've uploaded the font files to my ttfonts directory and defined the font in config_fonts.php like this:

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

I only see the error when I turn on font error reporting in the config settings. When I turn error reporting off, the PDF is generated, but the font being used is not Verdana.

Any idea on what I'm doing wrong?

4

6 回答 6

22

基于@hrvoje-golcic 的回答,这是一种无需编辑即可将字体添加到 mPDF 的改进且不那么脏的方法config_fonts.php。我正在使用 Laravel,我使用 composer 安装了 mPDF。

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

注意:该文件夹大约有90MBttfonts,因此可能还有更好的方法,但是您必须复制所有字体,因为原始配置添加了它们。请参阅此答案底部的作曲家脚本替代方案。

重要提示: CSS 字体系列将被转换为小写字母 + 无空格,因此“Source Sans Pro”将变为 sourcesanspro。

这是一个例子:

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);

Composer 安装后脚本

无需复制所有字体并将它们添加到 git,使用 composer 安装后脚本的便捷解决方法可以为您做到这一点。

首先,确保您要复制字体的文件夹存在,并.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 中,作者实现了一种优雅的方式来添加外部字体。

于 2017-01-09T00:13:05.743 回答
21

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

  1. 下载字体压缩包并解压。
  2. 将新newFont.ttf字体文件添加到此位置/mpdf/ttfonts文件夹。
  3. 编辑/mpdf/config_fonts.phpOR/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. 现在您的新字体已添加。

于 2016-06-07T13:47:31.830 回答
6

除了 lib 文件之外,还有另一种“肮脏”的方式可以在运行时动态添加字体。这是我的解决方案,因为我无法修改config_fonts.pdf文件,因为它位于供应商/文件中,并且会在库更新时被覆盖。

function add_custom_fonts_to_mpdf($mpdf, $fonts_list) {
    // Logic from line 1146 mpdf.pdf - $this->available_unifonts = array()...       
    foreach ($fonts_list as $f => $fs) {
        // add to fontdata array
        $mpdf->fontdata[$f] = $fs;

        // add to available fonts array
        if (isset($fs['R']) && $fs['R']) { $mpdf->available_unifonts[] = $f; }
        if (isset($fs['B']) && $fs['B']) { $mpdf->available_unifonts[] = $f.'B'; }
        if (isset($fs['I']) && $fs['I']) { $mpdf->available_unifonts[] = $f.'I'; }
        if (isset($fs['BI']) && $fs['BI']) { $mpdf->available_unifonts[] = $f.'BI'; }
    }
    $mpdf->default_available_fonts = $mpdf->available_unifonts;
}

确保提供相对于 mpdfttfonts/目录的字体路径

重要提示: CSS 字体系列将转换为小写字母 + 无空格,因此“Source Sans Pro-Regular”将变为 sourcesanspro-regular

例如,这里我添加了 2 个字体和 3 个字体文件,因为其他字体有常规和粗体版本:

$mpdf = new mPDF('utf-8', 'A4', '', '', 20, 15, 50, 25, 10, 10);
$custom_fontdata = array(
    'sourcesanspro-regular' => array(
        'R' => "../../../../wms/hr_frontend/job/internet/fonts/SourceSansPro-Regular/SourceSansPro-Regular.ttf" 
        // use 'R' to support CSS font-weight: normal
        // use 'B', 'I', 'BI' and etc. to support CSS font-weight: bold, font-style: italic, and both...
    ),
    'someotherfont' => array(
        'R' => "../../../../wms/hr_frontend/job/internet/fonts/someotherfont.ttf", // In CSS font-weight: normal
        'B' => "../../../../wms/hr_frontend/job/internet/fonts/someotherfont-bold.ttf" // In CSS font-weight: bold
    )
);
add_custom_font_to_mpdf($mpdf, $custom_fontdata);
$mpdf->WriteHTML($html);

这适用于 mpdf 5.x,但希望它也适用于 6.x。有人试过吗?

于 2016-05-17T11:41:41.470 回答
2

只需将字体添加到 FontVariable.php

                "pacifico" => [
                'R' => "Pacifico.ttf",
                'useOTL' => 0xFF,
                'useKashida' => 75,
            ],

确保 ttf 文件名是否以Pacifico.ttf之类的大写字母开头,然后像我在顶部一样以小写字母开头命名字体系列。例如,制作这个pacifico ,现在只需使用创建测试 php 文件来测试它

require_once __DIR__ . '/autoload.php';
$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];
$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4'.('orientation' == 'L' ? '-L' : ''),
'orientation' => 0,
'margin_left' => 3,
'margin_right' => 3,
'margin_top' => 3,
'margin_bottom' => 0,
'margin_header' => 0,
'margin_footer' => 0,
]);    
$texttt= '
    <html>
    <p style="font-family: dejavusanscondensed;"> Text in Frutiger </p>
    <p style="font-family: freeserif;"> Text in Frutiger </p>
    <p style="font-family: freemono;"> Text in Frutiger </p>
    <p style="font-family: freeserif;"> مرحبا بالعالم </p>
    <p style="font-family: unbatang;"> 하는 바에 의하여 영장제도 </p>
    <p style="font-family: centurygothic;"> Text in Frutiger </p>
    <p style="font-family: pacifico;"> Text in Frutiger </p>
    <p style="font-family: windsong;"> Text in Frutiger </p>
    </html>';
     $mpdf->WriteHTML($texttt,\Mpdf\HTMLParserMode::HTML_BODY);
$mpdf->Output();
于 2019-07-23T10:55:18.573 回答
0

无需在屏幕上显示错误。查看日志文件中的所有错误和警告,例如 php + apache(?) 服务器的“error.log”。它可以帮助您根据日志文件中的消息找到并解决问题。

在任何情况下,您都应该使用推荐的字体 - 请参阅 mPDF 手册。

您可能需要将 TrueType 字体转换为正确的 MPDF 格式。(http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts

于 2014-07-15T18:43:16.387 回答
0

Mpdf 添加 Arial 字体

  1. 下载字体文件:https ://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. 将 arial.ttf 粘贴到 mpdf/ttfonts

  3. 使用 fontdata 数组打开 config_fonts.php 和下面的代码

    "arial" => array('R' => "arial.ttf", ),

于 2017-03-03T08:50:47.553 回答