Используя Mpdf 8.0.8 , я создаю документ с настраиваемым шрифтом, который отображается нормально, за исключением неразрывных пробелов, которые отображаются в виде перечеркнутых квадратов:  введите описание изображения здесь

Открывая свой шрифт с помощью FontForge , я вижу, что определен символ uni00A0 (он пуст, но крестик отсутствует)

Вот код, вызывающий Mpdf:

public function getPdfData($values, $medias, $locale = 'fr_FR')
{
    $sessionLocale = $this->translator->getLocale();
    $this->translator->setLocale($locale);
    $html = $this->twig->render('@Pim/testPdf.html.twig');
    $this->translator->setLocale($sessionLocale);

    $defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
    $fontDirs = $defaultConfig['fontDir'];

    $defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
    $fontData = $defaultFontConfig['fontdata'];

    $fontData = $fontData + [
            'myhelvet' => [
                'R' => 'helvetlight.ttf',
                'I' => 'helvetthick.ttf',
            ],
            'timeslightitalic' => [
                'R' => 'timeslightitalic.ttf'
            ]
        ];
    $defaultFont = 'myhelvet';

    $mpdf = new \Mpdf\Mpdf([
        'orientation' => 'L',
        'margin_left' => 0,
        'margin_right' => 0,
        'margin_top' => 1,
        'margin_bottom' => 0,
        'fontDir' => array_merge($fontDirs, [
            __DIR__ . '/../Resources/public/fonts',
        ]),
        'fontdata' => $fontData,
        'default_font' => $defaultFont,
        'mode' => '+aCJK',
        "autoScriptToLang" => true,
        "autoLangToFont" => true,
    ]);
    $mpdf->addFontDirectory(__DIR__ . '/../Resources/public/fonts');
    $mpdf->WriteHTML($html);
    $pdfData = $mpdf->Output('', 'S');

    return $pdfData;
}

А вот представление html, которое не может отображать неразрывное пространство, созданное Php NumberFormatter:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>

<div style="font-family: myhelvet">Formatting a number: {{ '20000'|numberFormatLocale('fr_FR') }}</div>

</body>
</html>

Наконец, php-код, генерирующий разрывное пространство (фильтр Twig):

public static function numberFormatLocale($number, $locale)
{
    $formatter = new \NumberFormatter($locale, \NumberFormatter::DECIMAL);

    return $formatter->format($number);
}
0
Roubi 11 Фев 2021 в 13:12

1 ответ

Лучший ответ

Результатом NumberFormatter является не U+00A0, а 0xE2 0x80 0xAf или U+202F - УЗКИЙ ПРОБЕЛ БЕЗ ПЕРЕРЫВА , который, скорее всего, не поддерживается шрифтом.

1
Finwe 16 Фев 2021 в 20:02