dompdf 处理中文字体问题

dompdf包

本文章示例,默认在laravel框架中,进行

原生包

安装

composer require dompdf/dompdf

字体

相关字体文档地址:

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

官方文档提示:目前 dompdf 只支持 TrueType 格式的字体文件,TrueType 也就是文件后缀名为 .ttf 的文件

下载字体网站: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...

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

php load_font.php simsun simsun.ttf
这一步报错. 然后手动将字体文件移动到 vendor\dompdf\dompdf\lib\fonts, 汉字依然乱码

8个月前 评论
OnlyRed (楼主) 6个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!