• dompdf,这么做就可以支持中文了


    最近在研究如何用PHP生成pdf文档,首先测试了tcpdf,但是它对html的样式支持不尽人意最后放弃了。

    dompdf进入了我的视野,马上安装体验了一番

    composer require dompdf/dompdf

    现在假定你的环境是支持composer的

    1. /**
    2. * 生成dompdf
    3. */
    4. public function create_dompdf()
    5. {
    6. $dompdf = new Dompdf();
    7. $html = View::fetch('reportv2');
    8. $dompdf->loadHtml($html,'UTF-8');
    9. $dompdf->setPaper('A4','portrait');
    10. $dompdf->render();
    11. $filename = 'dom_'. date('His') .'.pdf';
    12. $dompdf->stream($filename);
    13. }

    上述是调用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. // 1. [Required] Point to the composer or dompdf autoloader
    2. //require_once "vendor/autoload.php";
    3. 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 文件中看到如下相关信息:

    1. {
    2. "msyh": {
    3. "normal": "msyh_normal_adfabab12a9c7844decdb414a59f4a61",
    4. "bold": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh",
    5. "italic": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh",
    6. "bold_italic": "D:\\xampp\\htdocs\\test\\vendor\\dompdf\\dompdf\/lib\/fonts\/msyh"
    7. }
    8. }

     使用中文字体:

    关键的一句:body {font-family: "msyh";},指定字体名称

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1">
    6. <title>2022</title>
    7. <link href="layui/css/layui.css" rel="stylesheet">
    8. <style>
    9. body {
    10. font-family: "msyh";
    11. }
    12. </style>
    13. </head>
    14. <body>
    15. <div class="layui-container">
    16. <div class="layui-row">
    17. <div class="layui-col-md12">
    18. <h3>你好,中国!Hello China! 2022</h3>
    19. </div>
    20. </div>
    21. </div>
    22. </body>
    23. </html>

     看看效果吧!

  • 相关阅读:
    MySQL数据 - 索引
    Vue3+elementplus搭建通用管理系统实例五:后台主页搭建上
    无类型排序【详解】
    设计模式 - 责任链模式
    Mysql Liunx下安装指南
    Linux下NFS共享存储安装详细步骤
    Handler的交互场景
    Mysql事物、隔离级别、锁
    【学习笔记】记录一个win 11 操作文件卡顿,Windows 资源管理器CPU占用飙升问题
    MySQL - 如何判断一行扫描数?
  • 原文地址:https://blog.csdn.net/sdutphp/article/details/125570313