将字体添加到mPDF

Pau*_*ert 17 php fonts mpdf

当我尝试使用mPDF类生成PDF时出现以下错误:

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

我已经将字体文件上传到我的ttfonts目录并定义了这样的字体config_fonts.php:

"verdana" => array(
    'R' => "verdana.ttf",
    'B' => "verdanab.ttf",
    'I' => "verdanai.ttf",
    'BI' => "verdanaz.ttf",
    ),
Run Code Online (Sandbox Code Playgroud)

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

关于我做错了什么的任何想法?

s3v*_*v3n 17

根据@ 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.

抬头:ttfonts文件夹大约有90MB,所以仍然可能有更好的方法,但是你需要复制所有字体,因为原始配置会添加它们.请参阅本答案底部的composer script alternative.

重要提示: CSS font-family将转换为小写+ nospace,因此"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);
Run Code Online (Sandbox Code Playgroud)

Composer安装后脚本

使用作曲家安装后脚本的方便的解决方法可以为您完成,而不是复制所有字体并将其添加到git.

首先,确保存在要复制字体的文件夹,并.gitignore在其中创建一个文件夹,其中包含以下内容:

*
!.gitignore
!SourceSansPro-Regular.ttf
!SourceSansPro-Bold.ttf
Run Code Online (Sandbox Code Playgroud)

这将忽略除了.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/"
    ]
}
Run Code Online (Sandbox Code Playgroud)

笔记

经测试可与6.1一起使用.
在7.x中,作者实现了一种优雅的方式来添加外部字体.


Aja*_*jai 14

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

  1. 下载字体zip并解压缩.
  2. 将新newFont.ttf字体文件添加到此位置/mpdf/ttfonts文件夹.
  3. 编辑/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",
    ),
    
    Run Code Online (Sandbox Code Playgroud)
  4. font-family: 'newFont'; 现在可以在样式表中找到.

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

  6. 现在添加了新字体.


Hrv*_*cic 5

除了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;
}
Run Code Online (Sandbox Code Playgroud)

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

重要提示: CSS font-family将转换为小写+ nospace,因此"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);
Run Code Online (Sandbox Code Playgroud)

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


Int*_*cto 0

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

无论如何,您应该使用推荐的字体 - 请参阅 mPDF 手册。

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