Dompdf-Laravel Unicode 字符无法正确呈现

Posted

技术标签:

【中文标题】Dompdf-Laravel Unicode 字符无法正确呈现【英文标题】:Dompdf-Laravel Unicode character not rendering correctly 【发布时间】:2021-03-10 01:44:09 【问题描述】:

我正在使用 barryvdh/laravel-dompdf 在我的 laravel 应用程序中加载 PDF。我需要将自定义 unicode fonts(sinhala) 加载到 pdf 中。为此,我下载了外部字体并复制了字体文件夹,然后通过load_font.php 将其加载到storage/fonts 目录。 我在刀片文件中使用了 css,如下所示:

@font-face 
    font-family: Noto-2;
    font-display: block;
    src: url( asset('fonts/NotoSansSinhala-Light.ttf') ) format("truetype");

body 
    font-family: Noto-2 !important;
    font-style: normal;
    font-weight: 500;
    font-size: 14px!important;

我还设置了元标记 UTF-8

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

HTML 部分:

<td class="td_cus" rowspan="5">
   <span class="title">මික් ආහාර සේවය</span>
   <p class="company_address">
      2 වැනි මහළ,<br>
      <span style="font-family: helvetica !important;">M I C </span>සුපර් සෙන්ටර්,<br>
      මොරටුව,<br>
      ශ්‍රී ලංකාව.
   </p>
</td>

Laravel 控制器:

 $path = Storage::disk('local')->path("letters(".$letterCount."-letters).pdf");
 $pdf = PDF::loadview('templates.letterSinhala', ['details' => $details])
        ->setPaper('a4', 'portrait')
        ->save($path);

当我正常加载我的 html 页面时,字体可以正常工作。但是,当我尝试在 PDF 中加载字体时,字体无法正确显示。有人可以指导我如何正确加载字体。

在普通页面(HTML 视图)上,显示如下:

HTML view - correct text

当我生成 PDF 时,它显示如下:

PDF view - incorrect text

注意:请看上面两张图,这很容易理解问题;

问题是僧伽罗文本在 PDF 上显示不正确,但是当我在某处复制并粘贴时,文本正确显示。

关于如何解决此问题的任何想法?请帮忙..

【问题讨论】:

复合字母很难被这些库渲染,所以如果你尝试一些其他的硬字体,他们可能会导致这样的错误,甚至尝试使用 jspdf 或任何其他包,如 mpdf、tcpdf 等尝试加载将 html 转换为图像并将该图像放入 pdf 中,这是唯一的解决方案,还有其他用户也在问同样的问题 看到这些问题1, 2 & 3 【参考方案1】:

我们使用Mpdf 找到了解决方案,我们将库更改为 MpdfMpdf 有很多Unicode fonts,还包括Sinhala Unicode font - (Kaputaunicode)。

在僧伽罗语情况下,您只能使用 Kaputaunicode 字体,因为other sinhala unicode fonts 不支持 Mpdf,其他僧伽罗语 unicode 字体呈现与 Dompdf。

但是字体渲染不完美,一些复杂的组合渲染不正确。

    Text diff. image Paragraph text
您可以从这些图片中获得灵感

在我的情况下,无论如何 Mpdf 文本渲染比 Dompdf 好。

CSS 样式与比较 Dompdf 不同。 而且Mpdf渲染时间比Dompdf少

在控制器中:

use Mpdf\Mpdf;

$path = Storage::disk('local')->path("_letters(".$letterCount."-letters).pdf");
$view = View::make('templates.letterSinhala', ['details' => $details]);
$html = $view->render();
$mpdf = new Mpdf(['mode' => 'UTF-8', 'format' => 'A4-P', 'autoScriptToLang' => true, 'autoLangToFont' => true]);
$mpdf->WriteHTML($html);
$mpdf->Output($path);

【讨论】:

【参考方案2】:

更好更简单的 laravel 包是 vatttan/apdf 将由安装

composer require vatttan/apdf

在github看到这个

【讨论】:

以上是关于Dompdf-Laravel Unicode 字符无法正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

中文字符替换为其unicode编码值小3的字符

如何判断一个字符串是不是是unicode编码?

怎样查一个字符的unicode编码

如何将单片机中字符串转unicode码

java中如何获得一个字符的unicode编码

unicode和多字节字符集的区别