文章

php使用wkhtmltopdf实现html转pdf

项目中有需求将html页面实时转为pdf并提供下载。经过各种查找比对,最终使用了wkhtmltopdf工具来实现。

wkhtmltopdf,可以很方便的将输入的url渲染并打印成pdf文件。当然也有一些坑需要踩。特别提出,wkhtmltopdf渲染不支持ES6语法,意味着使用ES6语法编写的页面可能会报错而无法打印或出现排版问题。

先贴一个我的使用代码段,具体的再讲

    $filename = "xxx.pdf";
    $url = "http://www.xxx.com/"
    $save_url = "/tmp/".$filename;
    $shell = "xvfb-run --auto-servernum wkhtmltopdf --no-stop-slow-scripts --window-status ready '$url' $save_url";
    $process = shell_exec($shell);
    if(file_exists($save_url)){
        //pdf文件存在,转换成功。
    }else{
        //pdf文件不存在,转换错误。
    }

要使用wkhtmltopdf,首先自然是要安装它。我使用的是ubuntu server-16.04,所以就直接使用apt安装了。因为是server版的ubuntu,没有桌面环境,同时也需要安装xvfb,为wkhtmltopdf提供一个虚拟屏幕。否则会无法渲染而报错。

sudo apt-get update
sudo apt-get install xvfb
sudo apt-get install wkhtmltopdf

wkhtmltopdf的使用就是在bash中使用(注意引号)
wkhtmltopdf '网址' '保存地址'
即可。
在前面加上xvfb-run --auto-servernum,可以在无桌面环境的linux中使用

xvfb-run --auto-servernum wkhtmltopdf --no-stop-slow-scripts --window-status ready '$url' $save_url

参数:
--no-stop-slow-scripts 表示不停止计算缓慢的js脚本
--window-status ready 表示wkhtmltopdf将会等到渲染的网页window-status变为ready后再进行打印(可在页面中通过运行js代码window.status="ready"进行状态匹配)
--debug-javascript 可以输出js的控制台信息,进行debug

License:  CC BY 4.0