最近產品有新需求生成pdf,我第一反應就是laravel-snappy咯。
laravel-snappy的優點不多說,這篇主要是踩坑記錄。
踩得坑主要有以下4點:
- alphine系統安裝wkhtmltopdf不成功(✘ 未解決)
- vue.js渲染失敗,空白pdf(✘ 未解決)
- pdf內容中文亂碼,都是□□□□□□□□(✔️解決)
- pdf設定中文頁尾不生效(✔️解決)
依次來說:
alphine系統安裝wkhtmltopdf
laravel-snappy是要在系統中工具依賴的,這個工具就是wkhtmltopdf。
本來是挺簡單的操作,工具本身平臺適配支援度也很高。wkhtmltopdf下載頁面可以看到windows、Linux(Debian、Ubuntu、Centos)、MacOS都有相應的安裝包
然而,我司伺服器是基於alpine的迷你Linux,按照composer的方式操作,wkhtmltopdf也放到/usr/local/bin目錄下了,它還是會一直報這個錯:
The exit status code '127' says something went wrong:
stderr: "sh: /usr/local/bin/wkhtmltopdf: not found
"
stdout: ""
command: /usr/local/bin/wkhtmltopdf --lowquality 'www.baidu.com' '/tmp/knp_snappy5c8a2205094be4.76288272.pdf'.
大夥伴說是alpine這個系統(真的很小,只有4M)缺少wkhtmltopdf需要的一些依賴。
大夥伴週末加了個班得出了結論:
- alpine linux 測試目前只有 3.9 版本可以安裝 community 版本的 wkhtmltopdf ,其它更早的版本試了都不行;
- alpine:3.9 中安裝後,使用還是有點問題,可能因為字型原因,資訊丟失太嚴重;
- 我用 Ubuntu 的映象安裝 wkhtmlpdf 後,試了下,這個就比較正常了;
最終我們是用Debian新起了個映象。
vue.js渲染失敗,空白pdf
我們的要生成的pdf有個蠻複雜的表格,我第一反應就是前端搞(我是懶蛋。。。),然後用laravel-snappy將前端寫的頁面生成pdf就好了。可是當前端將頁面寫好,輸出的時候才發現是空白的.....
網上也搜了很多,github的相關issues還是掛著的,站內也有相關問答,也還是掛著的....
最終是用laravel blade寫了表格。我寫了表格,然後前端加上css。感覺前端就是給資料穿上了衣服,哈哈哈。
pdf內容中文亂碼,都是□□□□□□□□
這個解決起來比較easy。
在windows下找到simsun.ttc檔案,複製出來,放在伺服器的/usr/shars/fonts/TrueType/
下就好了
如果你用dockerFile,加上這兩句:
RUN mkdir /usr/share/fonts/chinese/TrueType -p
COPY dockerfiles/font/simsun.ttc /usr/share/fonts/chinese/TrueType/
如果你是自己的雲伺服器,可以用scp命令
scp /Users/qian/Desktop/simsun.ttc root@120.27.8.8:/usr/share/fonts/TrueType
解決~
pdf設定中文頁尾不生效
這個問題昨天逼死我,發了一個提問貼:在 Linux 環境下 使用 wkhtmltopdf,怎樣生成中文頁尾?
這是當時的使用姿勢:
$options = [
'footer-center' => '123【中文頁尾】asd',
'footer-font-size' => 8,
'footer-spacing' => 5,
// 'footer-font-name' =>'Arial'
];
return PDF::loadView('pdf', $data)->setOptions($options)->inline();
我試了很多辦法,拷字型,設定編碼格式,都不行,中文的頁尾就是死活出不來- -
其實Linux環境下,命令列用wkhtmltopdf語句是ok的,問題應該就在snappy(但是macOS是正常的,windows不知道)
wkhtmltopdf --footer-left '1234我們women' www.baidu.com test.pdf
然後今早搜到這篇關於wkhtmltopdf 給頁面新增html頁首
"今天用到需要在pdf的頁面新增頁首,且客戶說需要加logo,剛個wkhtmltopdf有 --header-html 的屬性 命令如下"wkhtmltopdf --header-html http://yoururl yoururl output.pdf"
命令是不是很簡單,但是其中有個需要注意的是作為頁首的html頁面必須有<!DOCTYPE html>,否則會導致生成的pdf為空白的" ---- (我是搬運工)
哦,昨晚用 header-html
時候確實沒加 <!DOCTYPE html>
試一下,修改 options
為:
$options = [
'footer-html' => '<!DOCTYPE html> <meta charset="utf-8"> <h5 align="center">【可愛一點,多一點】</h5>',
'margin-bottom' => 10,
];
return SnappyPdf::loadFile($url)->setOptions($options)->inline('test.pdf');
ok~ footer-center
不行,footer-html
還是可以曲線救國的~
而且footer-html
還可以加圖片給頁尾生成小logo
好像就這麼多了:)
以下分別是centos7安裝wkhtmltopdf的記錄小結,和自己寫的table程式碼小段
centos7安裝wkhtmltopdf的記錄小結
scp /Users/qian/Desktop/wkhtmltox-0.12.5-1.centos7.x86_64.rpm root@111.22.3.4:~
[root@aen233 ~]# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
錯誤:依賴檢測失敗:
libXext 被 wkhtmltox-1:0.12.5-1.centos7.x86_64 需要
libXrender 被 wkhtmltox-1:0.12.5-1.centos7.x86_64 需要
xorg-x11-fonts-75dpi 被 wkhtmltox-1:0.12.5-1.centos7.x86_64 需要
xorg-x11-fonts-Type1 被 wkhtmltox-1:0.12.5-1.centos7.x86_64 需要
[root@aen233 ~]#
[root@aen233 ~]# yum install libXext
[root@aen233 ~]# yum install libXrender
[root@aen233 ~]# yum install xorg-x11-fonts-75dpi
[root@aen233 ~]# yum install xorg-x11-fonts-Type1
[root@aen233 ~]# rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
準備中... ################################# [100%]
正在升級/安裝...
1:wkhtmltox-1:0.12.5-1.centos7 ################################# [100%]
自己寫的table程式碼小段,複雜程度也還好吧,3層迴圈,還好列固定,只是行要根據後臺配置動態生成
然後這是資料穿了衣服和沒穿衣服的樣紙
stay foolish,stay hungry.
本作品採用《CC 協議》,轉載必須註明作者和本文連結