добавление шрифта в 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.

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

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

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

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

ВАЖНО: CSS-семейство шрифтов будет преобразовано в нижний регистр + nospaces, поэтому «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, удобное обходное решение, использующее скрипт post-install для композитора, может сделать это за вас.

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

Ниже приведены шаги по добавлению нового семейства шрифтов в библиотеку mpdf:

  1. Скачайте шрифт zip и распакуйте его.
  2. Добавьте новый файл (ы) /mpdf/ttfonts папку location /mpdf/ttfonts .
  3. Измените /mpdf/config_fonts.php OR /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. Теперь добавлен новый шрифт.

Существует еще один «грязный» способ динамически добавлять шрифты во время выполнения в сторону файлов lib. Это было мое решение, потому что я не смог изменить файл config_fonts.pdf так как он был в файле vendor / files и был бы перезаписан на обновление библиотеки.

 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/ dir ttfonts/

ВАЖНО: CSS-семейство шрифтов будет преобразовано в нижний регистр + nospaces, поэтому «Source Sans Pro-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. Кто-нибудь пытался?

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" => array ('R' => "arial.ttf",),

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

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

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