最近在研究如何用PHP生成pdf文档,首先测试了tcpdf,但是它对html的样式支持不尽人意最后放弃了。
dompdf进入了我的视野,马上安装体验了一番
composer require dompdf/dompdf
现在假定你的环境是支持composer的
- /**
- * 生成dompdf
- */
- public function create_dompdf()
- {
- $dompdf = new Dompdf();
- $html = View::fetch('reportv2');
- $dompdf->loadHtml($html,'UTF-8');
- $dompdf->setPaper('A4','portrait');
- $dompdf->render();
- $filename = 'dom_'. date('His') .'.pdf';
- $dompdf->stream($filename);
- }
上述是调用Dompdf的代码,比较简单, 参照文档即可。运行结果如下

现在关键问题来了,如何正常显示中文呢
参考了此文章,并在此基础上进行了实际操作验证。
解决Dompdf中文乱码问题
https://blog.csdn.net/hwhsong/article/details/88579332第一步:下载Dompdf的工具包
该工具包的Git地址为:https://github.com/dompdf/utils。
下载完成后,解压,复制其中的load_font.php文件到项目下的vendor/dompdf/dompdf目录下,与lib和src目录同级。
第二步:修改load_font.php文件
因为把该文件直接复制放在了dompdf目录下,因此需要修改加载autoloader的路径
- // 1. [Required] Point to the composer or dompdf autoloader
- //require_once "vendor/autoload.php";
- require_once dirname(dirname(__DIR__)) . '/autoload.php';
第三步:下载字体文件
可以使用任意支持中文的字体文件,这里以微软雅黑(msyh)为例,该字体涉及版权,需要自行搜索下载,下载完成后,我们把该字体文件 msyh.ttf 直接放在load_font.php同一目录
第四步:安装字体文件
在放置load_font.php的dompdf目录下,使用系统命令行工具执行该文件,具体命令如下:
php load_font.php msyh msyh.ttf
注意:命令中的字体名称msyh不要加引号,否则后续将不可用。执行结果参考:

第五步:检查字体是否安装成功
如果字体安装成功,则可以在项目的vendor/dompdf/dompdf/lib/fonts目录中看到新生成的 msyh.ttf及 msyh.ufm文件。并且可以在该目录下的 installed-fonts.json 文件中看到如下相关信息:
- {
- "msyh": {
- "normal": "msyh_normal_adfabab12a9c7844decdb414a59f4a61",
- "bold": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh",
- "italic": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh",
- "bold_italic": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh"
- }
- }
使用中文字体:
关键的一句:body {font-family: "msyh";},指定字体名称
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>2022</title>
- <link href="layui/css/layui.css" rel="stylesheet">
- <style>
- body {
- font-family: "msyh";
- }
- </style>
- </head>
- <body>
- <div class="layui-container">
- <div class="layui-row">
- <div class="layui-col-md12">
- <h3>你好,中国!Hello China! 2022</h3>
- </div>
- </div>
- </div>
- </body>
- </html>
看看效果吧!
