Thinkphp6使用Dompdf将HTML转换为PDF,并且支持中文
因为系统需要使用PHP生成PDF,首先测试了tcpdf,但是它对html的样式支持不尽人意最后放弃了。然后了解到了dompdf,Dompdf是一个很棒的库,能够从HTML标记和CSS样式生成PDF(它主要符合CSS 2.1,并且支持某些CSS3属性)。 我们可以使用这些熟悉的技术来决定内容的外观,然后轻松地将其转换为固定文档。
首先安装dompdf:
composer require dompdf/dompdf
使用前记得先引入dompdf
use Dompdf\Dompdf;
dompdf/dompdf简单实例
/**
* 将生成的PDF输出到浏览器
*/
public function create_pdf()
{
$dompdf = new Dompdf();
$html = View::fetch('report');
$dompdf->loadHtml($html,'UTF-8');
$dompdf->setPaper('A4','portrait');
$dompdf->render();
$filename = 'pdf_'. date('His') .'.pdf';
$dompdf->stream($filename);
}
Thinkphp生成PDF文件实例:
/**
* 生成pdf文件
*/
public function create_pdf(){
$dompdf = new Dompdf();
$html = View::fetch('doc_detail');
$dompdf->loadHtml($html,'UTF-8');
$dompdf->setPaper('A4','portrait');
$filename = CMS_ROOT . "public" . "/storage/pdf_".time().".pdf";
$dompdf->render();
$output = $dompdf->output();
file_put_contents($filename, $output);
if (is_file($filename)){
return to_assign(0,"文件生成成功");
} else {
return to_assign(1,"文件生成失败");
}
}
上述是调用Dompdf的代码,比较简单, 参照文档即可。现在关键问题来了,如何正常显示中文呢?
解决生成的pdf文件中文乱码问题
1、下载字体包安装脚本utils
https://github.com/dompdf/utils
2、字体包安装脚本处理
下载完成后,解压,复制其中的load_font.php文件到项目下的vendor/dompdf/dompdf目录下,与lib和src目录同级。
因为是把该文件直接复制放在了dompdf目录下,因此需要修改加载的autoloader
的路径,具体如下:
// 1. [Required] Point to the composer or dompdf autoloader
//require_once "vendor/autoload.php";
require_once dirname(dirname(__DIR__)) . '/autoload.php';
接下来是下载中文字体,推荐下载 Droid Sans Fallback 字体,也可用雅黑字体,【雅黑字体会导致导出文档过大】,这里我们使用simsun.ttf
字体示例。将下载好的的字体包文件ttf也放到load_font.php同一级目录下(例如simsun.ttf)。
3、执行字体包安装脚本
进入load_font.php
文件所在的目录,使用系统命令行工具执行该文件,具体命令如下:
php load_font.php simsun simsun.ttf
注意:命令中的字体名称simsun
不要加引号,否则后续将不可用。
4、修改安装字体包中的文件路径(注意:不操作此项再本机上是正常的,放到服务器就会有问题了)
找到dompdf\dompdf\lib\fonts\installed-fonts.json
文件,这时候我们就可以看到我们刚刚安装的字体包。
这里我们可以看到引入的字体包相关路径都是本机路径,我们可以看到dompdf\dompdf\lib\fonts
路径下存在我们需要的文件,修改引入路径即可,如:
5、html使用字体包样式即可
body {
font-family: simsun;
}
<body style="font-family: simsun;">...</body>
根据如上操作可以解决中文乱码问题。