背景最近接到一个客户的要求,要求将学生的考试成绩分析表格图表导出为PDF。表格使用普通表格,图表参考https://www.chartjs.org/。遇到的问题详见wkhtmltopdfchartjs思路。网上查了前后端,html可以生成pdf,考虑实现效果和效率,最终决定使用PHP来完成服务器端的转换工作。本着最好不要额外安装软件的原则,经过搜索,尝试了TCPDFMPDFFPDFhtml2pdf等。然而,取得的成果与预期相去甚远。最后不得不尝试需要额外安装的wkhtmltopdf。wkhtmltopdf的介绍引用自官网。简介:wkhtmltopdf是wkhtmltox中的一个工具,另外一个是wkhtmltoimage。它们是开源(LGPLv3)命令行工具,使用QtWebKit渲染引擎将HTML渲染为PDF和各种图像格式。他们不需要展示或展示服务。值得一提的是,谷歌浏览器chrome也使用了QtWebKit渲染引擎。wkhtmltopdf的安装是在docker中进行的,使用的是开源项目docker-lnmp。但是php使用的是alpine版本,所以镜像改回默认的debian版本。后来因为客户用的是centos,所以单独下载了centos7镜像。debian安装#wgethttps://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.jessie_amd64.deb#dpkg-iwkhtmltox_0.12.5-1.jessie_amd64.deb安装这里会提示缺少依赖信息,其他信息可以直接通过apt-getinstall安装,但是需要注意这两个:dpkg:dependencyproblemspreventconfigurationofwkhtmltox:wkhtmltoxdependsonlibpng12-0;但是:未安装软件包libpng12-0。wkhtmltox依赖于libssl1.0.0;但是:未安装软件包libssl1.0.0。这两个包可以在仓库中直接搜索安装,然后再次执行安装命令,就安装成功#dpkg-iwkhtmltox_0.12.5-1.jessie_amd64.deb#wkhtmltopdf-V#wkhtmltopdf--enable-formshttps://www.baidu.combaidu.pdfcentos安装#wgethttps://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1。centos7.x86_64.rpm#rpm-ivhwkhtmltox-0.12.5-1.centos7.x86_64.rpm系统正常安装更新后会提示缺少依赖信息:error:Faileddependencies:fontconfigisneededbywkhtmltox-1:0.12.2.1-1.x86_64wkhtmltox-1需要freetype:0.12.2.1-1.x86_64wkhtmltox-1需要libpng:0.12.2.1-1.x86_64需要libjpegwkhtmltox-1:0.12.2.1-1.x86_64wkhtmltox-1:0.12.2.1-1.x86_64需要libX11wkhtmltox-1:0.12.2.1-1.x86_64需要libXextwkhtmltox-1:0.12.2.1-1.x86_64libXrender:wkhtmltox-1:0.12.2.1-1.x86_64需要0.12.2.1-1.x86_64xorg-x11-fonts-Type1wkhtmltox-1:0.12.2.1-1.x86_64需要xorg-x11-fonts-75dpihere只需按照提示安装软件包即可。#yuminstallfontconfigfreetypelibpnglibjpeglibX11libXextlibXrenderxorg-x11-fonts-Type1xorg-x11-fonts-75dpi然后再次执行安装命令,就安装成功了#rpm-ivhwkhtmltox-0.12.5-1.centos7.x86_64.rpm#wkhtmltopdf-V#wkhtmltopdf--enable-formshttps://www.baidu.combaidu.pdfwkhtmltopdf问题这里要注意,有些系统可能会抛出异常QXcbConnection:CouldnotconnecttodisplayAborted(coredumped)这里需要先安装xvfb然后使用xvfb运行#xvfb-runwkhtmltopdf--enable-formshttps://www.baidu.combaidu.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,但要注意防范webshel??l。
