最近接到一個客戶需求,要求將學生的考試結果分析表格和圖表導出到PDF。表格使用的是普通的table,圖表引用了https://www.chartjs.org/ 遇到的問題詳見wkhtmltopdf chartjsphp
在網上查了下先後端均可以將html生成pdf,考慮到實現效果以及效率,最後決定將轉化工做在服務端使用PHP完成。本着最好不要額外安裝軟件的原則,搜索事後分別嘗試了 TCPDF MPDF FPDF html2pdf 等等。可是實現效果都與預期差距較大。最後不得不嘗試須要額外安裝的wkhtmltopdf。html
引用 官網 介紹:wkhtmltopdf是wkhtmltox中的一個工具,另外一個是wkhtmltoimage。它們是開源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎將HTML呈現爲PDF和各類圖像格式。它們不須要顯示或顯示服務。值得一提的是谷歌瀏覽器chrome也使用的是Qt WebKit渲染引擎。linux
安裝是在docker中進行的,使用開源項目docker-lnmp。但該php使用的是alpine版本,遂把鏡像改回默認的debian版本,後因爲客戶使用的是centos,又單獨下載了centos7的鏡像。laravel
# 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進行安裝,可是這兩個須要注意下 :git
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.
這兩個包直接去倉庫中搜索安裝便可,而後再次執行安裝命令,就會成功安裝了github
# dpkg -i wkhtmltox_0.12.5-1.jessie_amd64.deb # wkhtmltopdf -V # wkhtmltopdf --enable-forms https://www.baidu.com baidu.pdf
# 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後會提示缺乏依賴信息:web
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
這裏直接按照提示的安裝包就能夠了chrome
# yum install fontconfig freetype libpng libjpeg libX11 libXext libXrender xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi
而後再次執行安裝命令,就會成功安裝了docker
# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm # wkhtmltopdf -V # wkhtmltopdf --enable-forms https://www.baidu.com baidu.pdf
這裏須要注意的是部分系統可能會拋出異常
QXcbConnection: Could not connect to display Aborted (core dumped)
這裏須要安裝xvfb而後使用xvfb運行shell
# 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。