当前位置: 首页 > article >正文

TP6将HTML转换为PDF文件,非法UTF-8编码和中文乱码问题

目录

 1、前言

2、使用环境

3、安装dompdf

4、使用dompdf

5、中文乱码问题

6、页面设置问题

7、PDF生成问题

8、模板变量读取

结语


1、前言


  最近搞生成合同模板功能时,需要使用PHP生成PDF,开始接触dompdf这个类库,dompdf可以把HTML文件生成PDF。

        遇到一些问题,参考了一些网上的解决方法,特汇总备用。

2、使用环境


  版本不同,可能会导致解决方案行不通,故记录使用环境。
  1、Nginx1.15 (Win64) PHP/7.4.3
  2、ThinkPHP6.1
  3、dompdf v2.0.8

3、安装dompdf


  1、使用命令行进入到项目根目录;
  2、使用composer安装dompdf;

composer require dompdf/dompdf

       3、检查是否安装成功,在vendor 中查看是否有dompdf文件夹。

4、使用dompdf

4.1)在common.php文件中构建html_to_pdf函数

// 文件路径:common.php

use Dompdf\Dompdf;
use Dompdf\Options;

if (!function_exists('html_to_pdf')) {
    function html_to_pdf($html, $filename = 'document.pdf', $stream = true) {
        $options = new Options();
        //设置使用远程图片填充pdf内容
        $options->set('isRemoteEnabled', true);
        //$options->setIsRemoteEnabled(true);

        //设置html文件编码
        $html = mb_convert_encoding($html, 'UTF-8');

        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($html);

        //设置纸张大小和方向
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();

        if ($stream) {
            //直接在浏览器下载生成的pdf文件
            $dompdf->stream($filename, ['Attachment' => 0]);
        } else {
            //将生成的pdf保存到服务器
            file_put_contents($filename,$dompdf->output());
            return $dompdf->output();
        }
    }
}

4.2) 在项目中调用html_to_pdf函数生成pdf文件

$template_content = '<html lang=\"en\">'.
            '<head>'.
                '<meta charset=\"UTF-8\">'.
                '<title>这是pdf</title>'.
                '<link rel="stylesheet" href="http://www.pdf.com/static/css/admin/main.css">'.
            '</head>'.
            '<body>'.
                '<div>'.
                    '<p class="p01">我是html文件哈:{$name}----{$email}</p>'.
                    '<p style="color: #ff4036; font-size: 30px; font-weight: bold;text-align: center;">标题一:----{$name}</p>'.
                    '<p>标题二:----{$email}<br/><br/> 我换行啦,我是用来测试<br/>中文换行的啦,请换行看结果,不支持中文换行</p>'.
                    '<p>标题三:----{$email}</p>'.
                '</div>'.
            '</body>'.
            '</html>';

$html =  View::display($template_content, ['name' => '这是变量名字啦', 'email' => 'pdf@qq.com']);

html_to_pdf($html, 'template01.pdf', false);//生成pdf文件,不显示、不直接下载

备注:

view模板变量的调用这里不再赘述,大家看tp文档即可。
ThinkPHP官方手册


5、中文乱码问题

错误1

{"code":0,"msg":"Malformed UTF-8 characters, possibly incorrectly encoded","data":{"code":0,"line":50,"file":"D:\\myweb\\ytems\\vendor\\topthink\\framework\\src\\think\\response\\Json.php","message":"Malformed UTF-8 characters, possibly incorrectly encoded","trace":[{"file":"D:\\myweb\\ytems\\vendor\\topthink\\framework\\src\\think\\Response.php","line":388,"function":"output","class":"think\\response\\Json","type":"->","args":[false]},{"file":"D:\\myweb\\ytems\\vendor\\topthink\\framework\\src\\think\\Response.php","line":131,"function":"getContent","class":"think\\Response","type":"->","args":[]},{"file":"D:\\myweb\\ytems\\public\\index.php","line":22,"function":"send","class":"think\\Response","type":"->","args":[]}]}}

原因

        当出现以上错误时,可能是html文件编码问题(网上查找答案时大多给出的是这个处理方法),然后我用网上提供的方式修改html编码后依旧无法解决这个问题,后来排查发现,竟然是因为我在已经打开的生成pdf文件的基础上再次执行代码重复生成同名的pdf文件导致,关闭打开的pdf文件,再次执行代码,问题解决。


错误2

        生成pdf文件中文乱码问题。

解决:

  1、下载类库语言安装脚本
    https://github.com/dompdf/utils.git

  2、将里面的load_font.php文件拷贝到项目根目录,和vendor同级

PS D:\myweb\ytems>

        3、下载宋体字体文件 simsun.ttf 也放置在项目根目录,如上ytems目录,也与vendor同级,与load_font.php同目录。

        simsun字体下载|simsunttcsimsunttf字体包v6.457袖珍官方-雨林木风系统

     4、开始安装字体,使用命令行进入根目录(即刚刚存储load_font.php文件 和 simsun.ttf文件的ytems目录),并安装字体。

php load_font.php simsun simsun.ttf

命令说明: php load_font.php 字体路径,字体名字

注意,simsun simsun.ttf  两个参数不可以写反成:simsun.ttf simsun

否则会报以下错误:

PS D:\myweb\ytems> php load_font.php simsun.ttf simsun
PHP Fatal error:  Uncaught Dompdf\Exception: Unable to read 'simsun'. in D:\myweb\ytems\load_font.php:86
Stack trace:
#0 D:\myweb\ytems\load_font.php(201): install_font_family(Object(Dompdf\Dompdf), 'simsun.ttf', 'simsun')
#1 {main}
  thrown in D:\myweb\ytems\load_font.php on line 86

 5、安装结果图,显示这些东西基本就完成字体安装。

PS D:\myweb\ytems> php load_font.php simsun simsun.ttf
Unable to find bold face file.
Unable to find italic face file.
Unable to find bold_italic face file.
Copying simsun.ttf to D:\myweb\ytems\vendor\dompdf\dompdf/lib/fonts/simsun.ttf...
Generating Adobe Font Metrics for D:\myweb\ytems\vendor\dompdf\dompdf/lib/fonts/simsun...

    6、去类库字体目录检查是否安装成功
   vendor\dompdf\dompdf\lib\fonts
     找到是否有simsun.ttf和simsun.ufm2个文件,存在即安装成功

    7、修改路径 vendor\dompdf\dompdf\lib\fonts 下的字体配置文件 installed-fonts.json文件中字体的本地存储路径为相对路径,防止直接上传vendor到线上时出错。

      'simsun' => array(
        'normal' =>  'simsun',
        'bold' =>  'simsun',
        'italic' => 'simsun',
        'bold_italic' =>  'simsun',
      )

     8、在HTML中使用我们安装的字体,你可以在这个HTML任何地方写这个字体样式,不过为了全文显示正常最好还是在这写。

    <body style="font-family:simsun">中文字体</body>

        这样我们就可以愉快的使用中文字体了。

6、页面设置问题


  不知道什么原因,网上大多的例子都是横向设置,我还纠结半天什么鬼,内容在一个页面显示不了分了好几页,只能说英文不好容易踩坑。

  1、设置页面

      //网上你可能看到很多这样的例子,我要竖着的看啊

      $dompdf->setPaper('A4', 'landscape');//横向设置

      //找了类库说明,发现还有一个参数,这下终于可以正常显示了。

      $dompdf->setPaper('A4', 'portrait');

        2、为了更好将HTML转换成PDF,建议将HTML宽高设置成和A4大小接近,避免不必要的麻烦。个人还是要根据实际pdf显示情况来调节。

body {
    font-family:simsun;
    margin: 0;
    width: 800px;
    height: 1160px;
}

7、PDF生成问题


  dompdf目前还存在样式问题,没有得到很好的解决,所以需要注意以下两点:

  1、对元素浮动支持不是很友好。如 float

  2、目前不支持css3的属性,所以不要奢望做出很复杂的样式。

8、模板变量读取


结语

 以上为整理的dompdf的完整使用过程,留存备用。

参考链接:

dompdf中文乱码、换行解决方案_dompdf 中文乱码-CSDN博客


http://www.kler.cn/a/391584.html

相关文章:

  • 《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》
  • 赤店商城系统点餐小程序多门店分销APP共享股东h5源码saas账号独立版全插件全开源
  • 主数据系统建设模式分析
  • R.swift库的详细用法
  • Leetcode 377. 组合总和 Ⅳ 动态规划
  • 探索图像编辑的无限可能——Adobe Photoshop全解析
  • 品融电商:新形势下电商平台如何助力品牌长期经营
  • Openstack7--安装消息队列服务RabbitMQ
  • 【C语言】程序性能优化——除法运算符
  • 设计一致性的关键:掌握 Axure 母版使用技巧
  • 框架学习03-Spring 七大核心模块
  • 机器学习—神经网络的Softmax输出
  • “K线剩余时间”,显示当前K线已用和剩余时间 +品种信息面板 MT4免费工具!
  • MDBook 使用指南
  • Serverless GPU:助力 AI 推理加速
  • 常见error集合
  • RDD 算子全面解析:从基础到进阶与面试要点
  • 最新7+非肿瘤生信,机器学习筛选关键基因+样本验证。目前机器学习已经替代WGCNA成为筛选关键基因方法。非肿瘤生信分析欢迎咨询!
  • 期权懂|期权市场的发展对于投资者有什么影响?
  • AI写作(二)NLP:开启自然语言处理的奇妙之旅(2/10)
  • Ab测试与灰度发布
  • 生成 Django 中文文档 PDF 版
  • 【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
  • 开发工具 IntelliJ IDEA 使用技巧、快捷键、插件分享
  • Flink转换算子
  • CSM32RV20:RISC-V核的低功耗MCU芯片,常用在智能门锁上