将字体添加到mPDF

时间:2013-07-11 06:23:30

标签: php fonts mpdf

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

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

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

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

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

对我做错了什么的想法?

6 个答案:

答案 0 :(得分:16)

根据@ hrvoje-golcic的回答,这里是一种改进的,不那么脏的方法,可以在不编辑config_fonts.php的情况下向mPDF添加字体。我使用Laravel,我使用composer安装了mPDF。

  1. 根据作者的建议,在初始化_MPDF_TTFONTPATH之前定义一个名为mPDF的常量,并将值作为ttfonts文件夹的路径(此常量至少存在于5.3之后)。< / LI>
  2. vendor/mpdf/mpdf/ttfonts文件夹复制到您控制的位置(在供应商文件夹之外)。
  3. 将自定义字体与其他字体一起添加到该文件夹​​中。
  4. 将您的配置添加到fontdata实例的mPDF媒体资源。
  5.   

    抬头ttfonts文件夹大约有90MB,所以仍然可能是更好的方法,但是你必须复制所有字体,因为原始配置会添加它们。请参阅本答案底部的作曲家脚本替代。

         

    重要提示: CSS font-family will be transformed为小写+ nwidths所以&#34; Source Sans Pro&#34;将成为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中。

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

答案 1 :(得分:12)

以下是在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",
    ),
    
  4. font-family: 'newFont';现已在样式表中提供。

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

  6. 现在添加了新字体。

答案 2 :(得分:5)

还有另一个&#34;脏&#34;在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;
}
  

确保提供相对于mpdf ttfonts/ dir

的字体路径      

重要提示: CSS font-family将转换为小写+ nospaces,因此&#34; Source Sans Pro-Regular&#34;将成为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.有人试过吗?

答案 3 :(得分:0)

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

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

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

答案 4 :(得分: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及以下代码

    &#34; Arial字体&#34; =&GT;阵列(     &#39; R&#39; =&GT; &#34; ARIAL.TTF&#34 ;,     ),

答案 5 :(得分:0)

只需将字体添加到FontVariable.php

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

确保ttf文件名是否以大写字母开头,例如 Pacifico.ttf ,然后像在顶部一样以小写字母开头命名字体系列。 例如,使此太平洋 现在只需使用创建测试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();