使用 Laravel-snappy 生成 PDF 踩坑記錄

aen233發表於2019-03-21

最近產品有新需求生成pdf,我第一反應就是laravel-snappy咯。
laravel-snappy的優點不多說,這篇主要是踩坑記錄。

踩得坑主要有以下4點:

  1. alphine系統安裝wkhtmltopdf不成功(✘ 未解決)
  2. vue.js渲染失敗,空白pdf(✘ 未解決)
  3. pdf內容中文亂碼,都是□□□□□□□□(✔️解決)
  4. 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需要的一些依賴。
大夥伴週末加了個班得出了結論:

  1. alpine linux 測試目前只有 3.9 版本可以安裝 community 版本的 wkhtmltopdf ,其它更早的版本試了都不行;
  2. alpine:3.9 中安裝後,使用還是有點問題,可能因為字型原因,資訊丟失太嚴重;
  3. 我用 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層迴圈,還好列固定,只是行要根據後臺配置動態生成

複雜程度也還好吧,3層迴圈,還好列固定,只是行要根據後臺配置動態生成

然後這是資料穿了衣服和沒穿衣服的樣紙

然後這是資料穿了衣服和沒穿衣服的樣紙

stay foolish,stay hungry.

相關文章