dompdf 处理中文字体问题

疑难杂症   2023-04-03 09:03   1115   1  

dompdf包

原生包

安装

composer require dompdf/dompdf

字体

相关字体文档地址:

官方文档支持的字体说的很清楚了。不包含中文,但是可以自己引入字体来获得你需要的相关字体支持。接下来就自己下载一个字体吧。

下载字体网站:ufonts.com/

嫌速度慢,这里提供宋体字体下载:www.aliyundrive.com/s/rBZxcGjKyiQ

下载完毕后,就是加载字体了,文档里也说的很清楚。

两种方式:

  • 使用DOMPDF 的 load_font.php 本地加载字体
  • 使用 CSS @font-face 在运行时加载字体

load_font.php 方式加载字体

load_font.php 文件下载地址:github.com/dompdf/utils
然后把上面下载的字体文件以及load_font.php文件,放在你项目的根目录。假设你项目名为project

cd project
# 此命令会把字体文件加载到 vendor\dompdf\dompdf\lib\fonts 下
php load_font.php simsun simsun.ttf

然后编写代码进行HTML转PDF,下面示例的simsun字体就是我们刚刚加载的。DejaVu Sans字体是包自带加载的字体,这个字体支持希腊语等,我们一般用不着,可自行删除:

use Dompdf\Dompdf;

$html = <<<HTML
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style>
        * {
            font-family: simsun, DejaVu Sans, sans-serif;
        }
    </style>
</head>
<body>
    <p>献给母亲的爱</p>
</body>
</html>
HTML;

$dompdf = new Dompdf();
$dompdf->loadHtml($html);

// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');

// Render the HTML as PDF
$dompdf->render();

// Output the generated PDF to Browser
return $dompdf->stream();

CSS @font-face 方式加载字体

use Dompdf\Dompdf;

$html = <<<HTML
<html>
<head>
    <style>
        @font-face {
            font-family: 'simsun';
            font-style: normal;
            font-weight: normal;
            src: url(http://example.com/fonts/simsun.ttf) format('truetype');
        }
         *{ font-family: simsun, DejaVu Sans, sans-serif;}
    </style>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
    <p>献给母亲的爱</p>
</body>
</html>
HTML;

$dompdf = new Dompdf();
$dompdf->loadHtml($html);

// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');

// Render the HTML as PDF
$dompdf->render();

// Output the generated PDF to Browser
$dompdf->stream();

laravel-dompdf包

如果你是使用的laravel包barryvdh/laravel-dompdf
遇到到以下几个问题:

PDF文件过大

加载了中文字体后,生成的PDF文件过大。原因是barryvdh/laravel-dompdfisFontSubsettingEnabled默认设置为false
有两种方式修改:
配置文件:发布此laravel包的配置文件,在配置文件中修改enable_font_subsetting项,修改为true

代码修改:

//此为 barryvdh/laravel-dompdf 包的代码
$dompdf->setOption('isFontSubsettingEnabled', true);

如果你使用的是dompdf/dompdf原生包,则无需关心,因为原生包此配置项默认为true。此原生包v2是默认为truev1不清楚
参考资料:github.com/dompdf/dompdf/issues/19...

load_font.php 方式出现问题

如果你是使用 load_font.php 方式加载字体,你需要修改font_dir选项。因为barryvdh/laravel-dompdf包修改了此选项,将不指向原来的路径。当然你也可以不修改,把字体相关文件放入barryvdh/laravel-dompdffont_dir选项默认文件路径
有两种方式修改:
配置文件:发布此laravel包的配置文件,在配置文件中修改font_dir项,修改为base_path('vendor/dompdf/dompdf/lib/fonts')

代码修改:

//此为 barryvdh/laravel-dompdf 包的代码
$dompdf->setOption('font_dir', base_path('vendor/dompdf/dompdf/lib/fonts'));

参考资料:segmentfault.com/a/119000002036407...

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。
闲言碎语
生活磨光你的棱角,是为了让你,滚的更远。
赞赏支持

如果觉得博客文章对您有帮助,异或土豪有钱任性,可以通过以下扫码向我捐助。也可以动动手指,帮我分享和传播。您的肯定,是我不懈努力的动力!感谢各位亲~