美文网首页
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