您的当前位置:首页>全部文章>文章详情

Thinkphp6使用Dompdf将HTML转换为PDF,并且支持中文

发表于:2023-01-12 15:01:47浏览:751次TAG: #ThinkPHP #Dompdf #PDF #PHP生成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文件,这时候我们就可以看到我们刚刚安装的字体包。

图片alt

这里我们可以看到引入的字体包相关路径都是本机路径,我们可以看到dompdf\dompdf\lib\fonts路径下存在我们需要的文件,修改引入路径即可,如:
图片alt
5、html使用字体包样式即可

body {
    font-family: simsun;
}
<body style="font-family: simsun;">...</body>

根据如上操作可以解决中文乱码问题。