美文网首页
PHP----使用wkhtmltopdf将网页生成pdf

PHP----使用wkhtmltopdf将网页生成pdf

作者: JuMinggniMuJ | 来源:发表于2020-09-05 07:31 被阅读0次

    开发中遇到一个需求,那就是将网页保存成pdf文件,尝试了各种插件之后,始终有两个困扰因素:速度格式,最后找到了一个神奇的工具wkhtmltopdf,它是一个软件。
    我测试使用的环境是centos7+php7.3+nginx16

    1.下载wkhtmltopdf:
    wkhtmltopdf网盘地址:
            链接:https://pan.baidu.com/s/1hOKjnfbbWuTAhmxVDWvMuA 
            提取码:ryny
    
    2.安装wkhtmltopdf:
    1.安装依赖:
            yum install fontconfig freetype libpng libjpeg libX11 libXext libXrender xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi
    2.安装wkhtmltopdf:
            rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm
    3.查看wkhtmltopdf 版本:
            wkhtmltopdf -V
    4.测试代码:
            wkhtmltopdf https://www.baidu.com ./baidu.pdf
    
    3.中文乱码!!!

    当页面存在中文的时候,我们发现打印出来的东西像是火星文,就是传说中的乱码,这是因为缺少中文字体的原因,这个时候我们就需要引入字体文件

    4.下载字体
    字体网盘地址:
            链接:https://pan.baidu.com/s/1r5By7GXtROXM4ADXekU15A 
            提取码:8t8m
    
    5.安装字体:

    使用上传工具将字体文件上传到服务器/usr/share/fonts文件夹下

    6.解压字体压缩包:
    解压文件:
            unrar Fonts.rar
    清除缓存:
            fc-cache -fv
    查看字体:
            fc-list
    

    这个时候就不会有乱码问题了

    7.PHP使用wkhtmltopdf:

    在项目中我们没办法直接操作命令行,但是PHP有个shell_exec函数可以很好地解决这个问题,示例代码:

    <?php
            $start = microtime(true);                                              //记录程序开始时间
            shell_exec("wkhtmltopdf https://www.liurulan.cn/  ./haha.pdf");        //执行生成PDF代码
            $end = microtime(true);                                                //记录程序结束时间
            echo $end - $start;                                                    //输出程序执行时间
    
    8.说明:
    1.wkhtmltopdf 测试生成PDF速度还是可以的,但是打印的网页加载速度对整体运行时间影响很大;
    2.测试打印本地html页面,运行速度很快,但是存在打印完成图片没有加载的问题;
    3.建议换成外网地址,速度会有影响,但能保证图片等打印成功;
    4.打印保存文件路径文件夹一定要开启写入权限;
    
    9.竖向打印A4样式:

    我们平时打印需求一般都是打印指定的A4纸张大小,经过调试,页面大小设置成width:274mm;height:389mm;,wkhtmltopdf 将会正好适应尺寸,打印php示例代码:

    <?php
      $start = microtime(true);
      shell_exec("wkhtmltopdf  --margin-left 0 --margin-right 0 --margin-top 0 --margin-bottom 0 --page-height 297mm --page-width 210mm http://localhost/print/print.html  demo.pdf");
      $end = microtime(true);
      echo $end - $start;
    
    10.横向打印A4样式:

    有的时候打印页面布局是横向的,wkhtmltopdf也为我们提供了相应的参数-O landscape,这个时候我们设置页面尺寸应该改为width:389mm;height:274mm;,打印php示例代码:

    <?php
      $start = microtime(true);
      shell_exec("wkhtmltopdf  -O landscape  --margin-left 0 --margin-right 0 --margin-top 0 --margin-bottom 0 --page-height 297mm --page-width 210mm http://localhost/print/print.html  demo.pdf");
      $end = microtime(true);
      echo $end - $start;
    
    11.关于时间:

    经测试,如果页面为全文字,速度非常快,但是当页面中存在大图片时,速度会很慢,需要考虑使用队列;
    测试页面12张1.5M的图片本地打印耗时8.6s
    注:测试使用display布局时wkhtmltopdf打印页面会存在错乱现象,谨慎使用!!!

    相关文章

      网友评论

          本文标题:PHP----使用wkhtmltopdf将网页生成pdf

          本文链接:https://www.haomeiwen.com/subject/ilctektx.html