使用 MPDF 生成 pdf,非中断空间显示为不支持的字符

Posted

技术标签:

【中文标题】使用 MPDF 生成 pdf,非中断空间显示为不支持的字符【英文标题】:generating pdf with MPDF, non breaking space displayed as unsupoprted characters 【发布时间】:2021-02-11 10:12:39 【问题描述】:

使用 Mpdf 8.0.8,我创建了一个自定义字体的文档,该字体显示正常,除了不间断空格,显示为交叉方块:

当使用 FontForge 打开我的字体时,我看到 uni00A0 char 已定义(它是空白但没有交叉)

这里是调用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;

这里是无法呈现由 Php NumberFormatter 创建的不间断空间的 html 视图:

<!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);

【问题讨论】:

显示您的代码。见meta.***.com/questions/366988/what-does-mcve-mean @Finwe 谢谢。我编辑了我的问题以显示我的代码。 没有 HTML 数据,几乎是不完整的。 @Finwe 这里是 HTML,它是非常基本的(中断空间是由 php 生成的) @Finwe 如果你愿意,我可以在 FontForge 中添加打开字体的屏幕截图 【参考方案1】:

NumberFormatter 的输出不是U+00A0,而是0xE2 0x80 0xAf,或者U+202F - NARROW NO-BREAK SPACE 这很可能是字体不支持的。

【讨论】:

非常感谢您的时间和洞察力。我在这个问题上花了几个小时,但我对字体/字符代码的理解非常有限。我在我的字体中添加了带有 FontForge 的字符,这解决了问题。

以上是关于使用 MPDF 生成 pdf,非中断空间显示为不支持的字符的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mPDF 生成的 PDF 文件总是保存为“mpdf.pdf”

空 HTML textarea 输入未显示在 mPDF 生成的 PDF 中

表格很好地显示在 html 中,但不在使用 mpdf 生成的 pdf 中

PHP使用mpdf 生成pdf文件

PHP使用mpdf 生成pdf文件

如何将数字签名添加到pdf