Добавление шрифта в 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.
Любая идея о том, что я делаю неправильно?
Ответы
Ответ 1
Основываясь на ответе @hrvoje-golcic, здесь улучшен и менее грязный способ добавления шрифтов в mPDF без редактирования config_fonts.php
. Я использую Laravel, я установил mPDF, используя композитор.
- Как было предложено автором, определите константу с именем
_MPDF_TTFONTPATH
перед инициализацией mPDF
со значением в качестве пути к вашей папке ttfonts
(эта константа существует с по меньшей мере 5.3).
- Скопируйте папку
vendor/mpdf/mpdf/ttfonts
в местоположение, которое вы управляете (вне папки поставщика).
- Добавьте свои пользовательские шрифты в эту папку вместе с другими.
- Добавьте конфигурацию в свойство
fontdata
в экземпляр mPDF
.
Heads up: папка ttfonts
имеет около 90 МБ, поэтому все равно может быть лучший способ, но вам нужно скопировать все шрифты, так как их добавляет исходный конфиг. См. Альтернативу компоновщика script в нижней части этого ответа.
ВАЖНО: CSS-шрифт будет преобразован в нижний регистр + nospaces, поэтому "Source Sans Pro" станет sourcesanspro.
Вот пример:
if (!defined('_MPDF_TTFONTPATH')) {
// an absolute path is preferred, trailing slash required:
define('_MPDF_TTFONTPATH', realpath('fonts/'));
// example using Laravel 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);
Композитор после установки script
Вместо того, чтобы копировать все шрифты и добавлять их в git, удобное обходное решение с использованием компоновщика post-install script может сделать это для вас.
Прежде всего, убедитесь, что существует папка, в которой вы хотите скопировать шрифты, и создайте в ней .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 автор реализовал элегантный способ добавления внешних шрифтов.
Ответ 2
Ниже перечислены шаги по добавлению нового семейства шрифтов в библиотеку mpdf:
- Загрузите шрифт zip и распакуйте его.
- Добавить новый
newFont.ttf
файл шрифта в это местоположение /mpdf/ttfonts
.
-
Измените /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",
),
-
font-family: 'newFont';
теперь доступен в таблицах стилей.
-
$mpdfObj = new mPDF('', '', 'newFont');
$mpdfObj->SetFont('newFont');
-
Теперь добавлен ваш новый шрифт.
Ответ 3
Существует еще один "грязный" способ динамически добавлять шрифты в run-time в сторону файлов 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;
}
Обязательно укажите пути шрифтов относительно mpdf ttfonts/
dir
ВАЖНО: Семейство 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. Кто-нибудь пытался?
Ответ 4
Не нужно показывать ошибки на экране.
Просмотрите все ошибки и предупреждения в файле журнала, например "error.log" вашего сервера php + apache (?).
Это поможет вам найти и решить проблему на основе сообщения в файле журнала.
В любом случае вы должны использовать рекомендуемые шрифты - см. руководство mPDF.
Возможно, вам нужно преобразовать шрифты TrueType в правильный формат MPDF. (http://mpdf1.com/manual/index.php?tid=409&searchstring=fonts)
Ответ 5
Mpdf добавить шрифт Arial
Ответ 6
просто добавьте шрифт в 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();