开发中遇到一个需求,那就是将网页保存成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打印页面会存在错乱现象,谨慎使用!!!
网友评论