背景
近来接到一个客户需求,请求将门生的测验结果剖析表格和图表导出到PDF。表格运用的是一般的table,图表援用了https://www.chartjs.org/ 碰到的题目详见wkhtmltopdf chartjs
思绪
在网上查了下前后端都能够将html天生pdf,考虑到完成结果以及效力,末了决定将转化工作在效劳端运用PHP完成。本着最好不要分外装置软件的准绳,搜刮事后离别尝试了 TCPDF MPDF FPDF html2pdf 等等。然则完成结果都与预期差异较大。末了不能不尝试须要分外装置的wkhtmltopdf。
wkhtmltopdf简介
援用 官网 引见:wkhtmltopdf是wkhtmltox中的一个东西,另一个是wkhtmltoimage。它们是开源(LGPLv3)敕令行东西,运用Qt WebKit衬着引擎将HTML呈现为PDF和种种图像格式。它们不须要显现或显现效劳。值得一提的是谷歌浏览器chrome也运用的是Qt WebKit衬着引擎。
wkhtmltopdf装置
装置是在docker中举行的,运用开源项目docker-lnmp。但该php运用的是alpine版本,遂把镜像改回默许的debian版本,后因为客户运用的是centos,又零丁下载了centos7的镜像。
debian装置
# wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.jessie_amd64.deb
# dpkg -i wkhtmltox_0.12.5-1.jessie_amd64.deb
这里装置会提醒缺乏依靠信息,其他信息能够直接经由过程apt-get install举行装置,然则这两个须要注重下 :
dpkg: dependency problems prevent configuration of wkhtmltox:
wkhtmltox depends on libpng12-0; however:
Package libpng12-0 is not installed.
wkhtmltox depends on libssl1.0.0; however:
Package libssl1.0.0 is not installed.
这两个包直接去堆栈中搜刮装置即可,然后再次实行装置敕令,就会胜利装置了
# dpkg -i wkhtmltox_0.12.5-1.jessie_amd64.deb
# wkhtmltopdf -V
# wkhtmltopdf --enable-forms https://www.baidu.com baidu.pdf
centos装置
# wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm
# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
一般体系装置并update后会提醒缺乏依靠信息:
error: Failed dependencies:
fontconfig is needed by wkhtmltox-1:0.12.2.1-1.x86_64
freetype is needed by wkhtmltox-1:0.12.2.1-1.x86_64
libpng is needed by wkhtmltox-1:0.12.2.1-1.x86_64
libjpeg is needed by wkhtmltox-1:0.12.2.1-1.x86_64
libX11 is needed by wkhtmltox-1:0.12.2.1-1.x86_64
libXext is needed by wkhtmltox-1:0.12.2.1-1.x86_64
libXrender is needed by wkhtmltox-1:0.12.2.1-1.x86_64
xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.2.1-1.x86_64
xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.2.1-1.x86_64
这里直接根据提醒的装置包就能够了
# yum install fontconfig freetype libpng libjpeg libX11 libXext libXrender xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi
然后再次实行装置敕令,就会胜利装置了
# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
# wkhtmltopdf -V
# wkhtmltopdf --enable-forms https://www.baidu.com baidu.pdf
wkhtmltopdf题目
这里须要注重的是部份体系可能会抛出非常
QXcbConnection: Could not connect to display Aborted (core dumped)
这里须要装置xvfb然后运用xvfb运转
# xvfb-run wkhtmltopdf --enable-forms https://www.baidu.com baidu.pdf
导出的pdf中文会有乱码,能够将windows体系c盘system32目录下的Fonts内里的字体拷贝到linux的/usr/share/fonts下从新运转就能够了
wkhtmltopdf是跨平台的软件,和后端运用那种言语是没有关系的。
PHP有直接能够用的框架https://github.com/KnpLabs/snappy和laravel框架https://github.com/barryvdh/laravel-snappy
固然直接运用PHP实行shell也及其简朴,但要注重提防webshell。