добавление шрифта в mPDF

Я получаю следующую ошибку, когда пытаюсь создать PDF-файл с использованием класса mPDF:

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.

Любая идея о том, что я делаю неправильно?


person Paul Dessert    schedule 11.07.2013    source источник
comment
Были ли у вас успехи?   -  person alexej_d    schedule 05.03.2014
comment
проверьте эту ссылку mpdf1.com/forum/discussion/1139/fonts -не показывает/p1   -  person Ajit Singh    schedule 10.07.2014


Ответы (6)


Основываясь на ответе @hrvoje-golcic, вот улучшенный и менее грязный способ добавления шрифтов в mPDF без редактирования config_fonts.php. Я использую Laravel, я установил mPDF с помощью composer.

  1. Как предложил автор, определите константу с именем _MPDF_TTFONTPATH перед инициализацией mPDF со значением в качестве пути к вашей папке ttfonts (эта константа существует по крайней мере с версии 5.3).
  2. Скопируйте папку vendor/mpdf/mpdf/ttfonts в место, которым вы управляете (вне папки поставщика).
  3. Добавьте свои пользовательские шрифты в эту папку вместе с другими.
  4. Добавьте свою конфигурацию в свойство fontdata экземпляра mPDF.

Внимание: папка ttfonts имеет размер около 90 МБ, поэтому, возможно, есть лучший способ, но вам придется скопировать все шрифты, поскольку они добавляются в исходную конфигурацию. См. альтернативу сценария композитора внизу этого ответа.

ВАЖНО: семейство шрифтов 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, это может сделать удобный обходной путь с использованием постустановочного скрипта композитора.

Прежде всего, убедитесь, что папка, в которую вы хотите скопировать шрифты, существует, и создайте в ней .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 автор реализовал элегантный способ добавления внешних шрифтов.

person s3v3n    schedule 09.01.2017
comment
Это может быть правильным способом добавления пользовательских шрифтов, но... если вы используете Laravel и mPDF 7.x, здесь упоминается самый простой способ добавление пользовательских шрифтов в mPDF 7.x - person Ahamed Rasheed; 08.02.2019
comment
Проблема в том, что очень неправильно вручную изменять содержимое папки vendor. - person s3v3n; 08.02.2019
comment
Ах, ах, как смешно, я нигде не мог найти преобразование нижнего регистра в документах. Почему они это сделали и почему, почему бы не задокументировать это большим красным гигантом, огромным мигающим заявлением об отказе от ответственности в разделе пользовательского шрифта? Спасибо @s3v3n. - person Marek Maurizio; 21.11.2019

Ниже приведены шаги для добавления нового семейства шрифтов в библиотеку 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. Теперь ваш новый шрифт добавлен.

person Ajai    schedule 07.06.2016
comment
Я настоятельно не рекомендую метод, описанный здесь. Ни в коем случае не меняйте исходные файлы - все изменения исчезнут с обновлением. Вот как это сделать в оригинальной документации: mpdf .github.io/fonts-languages/fonts-in-mpdf-7-x.html - person Peter VARGA; 17.07.2021

Существует еще один «грязный» способ динамического добавления шрифтов во время выполнения помимо файлов 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;
}

Обязательно укажите пути к шрифтам относительно каталога ttfonts/ mpdf.

ВАЖНО: семейство шрифтов 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. Кто-нибудь пробовал?

person Hrvoje Golcic    schedule 17.05.2016
comment
Я могу подтвердить, что это сработало для ветки mPDF 6.x. Спасибо за предложение, я понятия не имею, почему вся эта логика встроена в начальную настройку mpdf и не может быть повторно запущена вне ее ಠ_ಠ Это решило бы много проблем со шрифтами! :) - person jaymz; 21.12.2016

просто добавьте шрифт в 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();
person Er Mandeep    schedule 23.07.2019

Не нужно показывать ошибки на экране. Просматривайте все ошибки и предупреждения в файле журнала, таком как «error.log» вашего сервера php + apache (?). Это поможет вам найти и решить проблему на основе сообщения в файле журнала.

В любом случае вы должны использовать рекомендуемые шрифты - см. руководство mPDF.

Вероятно, вам нужно преобразовать шрифты TrueType в правильный формат MPDF. (http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts)

person Intacto    schedule 15.07.2014

Mpdf добавить шрифт Arial

  1. Загрузите файл шрифта: https://github.com/JotJunior/PHP-Boleto-ZF2/blob/master/public/assets/fonts/arial.ttf

  2. Вставьте arial.ttf в mpdf/ttfonts

  3. Откройте config_fonts.php и приведенный ниже код с массивом fontdata.

    "arial" => массив( 'R' => "arial.ttf", ),

person Mohd Bashir    schedule 03.03.2017