Laravel 使用 laravel-snappy 包 實現 HTML 轉 PDF 和 PNG

邢闖洋發表於2020-10-13

前言

由於公司要開發一個新的工具叫做雲合同,可以預設好幾套固定的合同模板(html頁面),使用引數填充方式將合同內的資料靈活變化,然後生成 PDF 和 PNG
查閱一番我們發現了 laravel-snappy 這個包,底層使用的是 wkhtmltopdfwkhtmltopdf 是構建於 QT Webkit 之上,而 QT Webkit 又是基於 Webkit 的,跟我們的瀏覽器一樣的渲染引擎。

安裝

1、先檢視系統是 32 位的還是 64 位的

uname -a

2、通過 composer 安裝 wkhtmltopdf

32:
$ composer require h4cc / wkhtmltopdf-i386 0.12.x
$ composer require h4cc / wkhtmltoimage-i386 0.12.x
64:
$ composer require h4cc/wkhtmltopdf-amd64 0.12.x
$ composer require h4cc/wkhtmltoimage-amd64 0.12.x

3、接下來將安裝好的 wkhtmltopdf 複製到 Linux 系統可執行命令的目錄中

cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/
//並使其可執行:
chmod +x /usr/local/bin/wkhtmltoimage-amd64 
chmod +x /usr/local/bin/wkhtmltopdf-amd64

4、安裝 laravel-snappy 包

composer require barryvdh/laravel-snappy

配置

1、將 ServiceProvider 新增到 config/app.php 中的 providers 陣列中

Barryvdh\Snappy\ServiceProvider::class,

2、將 Facades 新增到 config/app.php 中的 aliases 陣列中

'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,

3、生成配置檔案

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

注意:config 資料夾中的 snappy.php 就是其配置檔案,binary 指向的就是上面安裝的 wkhtml 相關路徑.

使用

PDF

//一、下載
$pdf = \PDF::loadView('welcome', $data);
return $pdf->download('welcome.pdf');

//二、渲染頁面,在瀏覽器中顯示
$html = '<html><head><meta charset="utf-8"></head><h1>訂單id</h1><h2>12346546</h2></html>';
$pdf = \PDF::loadHTML($html);
return $pdf->inline();

Image

//一、下載
$img = \SnappyImage::loadView('welcome', $data);
return $img->download('welcome.png');

//二、渲染頁面,在瀏覽器中顯示
$html = '<html><head><meta charset="utf-8"></head><h1>訂單id</h1><h2>12346546</h2></html>';
$img = \SnappyImage::loadHTML($html);
return $img->inline();

踩坑記錄

一、當執行生成時若提示 libXrenderlibssl 庫不存在需要安裝相對應庫

//apt-get 安裝方法
apt-get install libXrender*
apt-get install libssl*

//yum 安裝方法
yum install libXrender*
yum install libssl*

//若 yum 安裝時最後報錯 Error: GPG check FAILED
yum install libXrender* --nogpgcheck
yum install libssl* --nogpgcheck

二、中文顯示亂碼問題,這個問題需要在 Linux 中安裝中文字型即可解決

  1. 檢視系統字型
    在開始安裝之前,我們先檢視系統中已經安裝的字型,要檢視系統中已經安裝的字型,我們可以使用 fc-list 命令進行檢視,如果系統中沒有該命令的話,我們需要先安裝相關的軟體包。
    在 centos 上,使用如下命令進行安裝:
    yum install -y fontconfig mkfontscale
  2. 安裝完畢後,我們可以來檢視系統中已經安裝的字型
    [root@8d079be5059a php]# fc-list
    /usr/share/fonts/urw-base35/NimbusMonoPS-Italic.otf: Nimbus Mono PS:style=Italic
    /usr/share/fonts/urw-base35/D050000L.t1: D050000L:style=Regular
    ...
  3. 如果要檢視系統中已經安裝的中文字型,我們可以使用如下命令
    [root@8d079be5059a php]# fc-list :lang=zh
    通過上圖我們可以看到系統中是沒有中文字型的
  4. 我們進入 Windows 的 字型目錄
    C:\Windows\Fonts
  5. 將 simfang.ttf 字型遠端複製或者以其他方式放到伺服器的字型目錄中
    //遠端複製
    scp simfang.ttf root@ip:/usr/share/fonts
  6. 然後建立字型索引資訊,更新字型快取
    cd /usr/share/fonts/
    mkfontscale
    mkfontdir
    fc-cache
  7. 至此,字型已經安裝完畢。現在我們再來檢視中文字型,是否安裝成功
    [root@8d079be5059a php]# fc-list :lang=zh
    /usr/share/fonts/simfang.ttf: FangSong,仿宋:style=Regular,Normal,obyčejné,Standard,Κανονικά,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta

    通過上圖,我們可以很明顯的看出中文字型已經成功安裝。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章