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-dompdf
把isFontSubsettingEnabled
默认设置为false
。
有两种方式修改:
配置文件:发布此laravel包的配置文件,在配置文件中修改enable_font_subsetting
项,修改为true
。
代码修改:
//此为 barryvdh/laravel-dompdf 包的代码
$dompdf->setOption('isFontSubsettingEnabled', true);
如果你使用的是dompdf/dompdf
原生包,则无需关心,因为原生包此配置项默认为true
。此原生包v2
是默认为true
,v1
不清楚
参考资料:github.com/dompdf/dompdf/issues/19...
load_font.php 方式出现问题
如果你是使用 load_font.php
方式加载字体,你需要修改font_dir
选项。因为barryvdh/laravel-dompdf
包修改了此选项,将不指向原来的路径。当然你也可以不修改,把字体相关文件放入barryvdh/laravel-dompdf
包font_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 协议》,转载必须注明作者和本文链接
php load_font.php simsun simsun.ttf
这一步报错. 然后手动将字体文件移动到 vendor\dompdf\dompdf\lib\fonts, 汉字依然乱码