Ubuntu 16.04
需求:將復(fù)雜的展示頁(yè)(包含大量echarts)轉(zhuǎn)換成 PDF 供客戶下載
一、下載 wkhtmltopdf
網(wǎng)址 https://wkhtmltopdf.org/
這里注意選擇和自己服務(wù)器版本匹配的包
我的服務(wù)器是 ubunutu 16.04 64位 getconf LONG_BIT #查看位數(shù)
所以下載 Ubuntu 16.04 (xenial) amd64
執(zhí)行代碼下載包
wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.xenial_amd64.deb
安裝.deb格式包
dpkg -i wkhtmltox_0.12.5-1.xenial_amd64.deb
如果提示缺少庫(kù)的話,安裝對(duì)應(yīng)的庫(kù)
apt-get install libXrender*
apt-get install libssl*
二、安裝 laravel-snappy 擴(kuò)展包
composer require barryvdh/laravel-snappy
將ServiceProvider添加到config / app.php中的providers數(shù)組
Barryvdh\Snappy\ServiceProvider::class,
添加facade到config / app.php中的aliases數(shù)組中
'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
生成配置文件
php artisan vendor:publish"
具體配置如下
<?php
return array(
'pdf' => array(
'enabled' => true,
'binary' => '/usr/local/bin/wkhtmltopdf',
'timeout' => false,
'options' => array(),
'env' => array(),
),
'image' => array(
'enabled' => true,
'binary' => '/usr/local/bin/wkhtmltoimage',
'binary' => 'G:\wk\wkhtmltopdf\bin\wkhtmltoimage',
'timeout' => false,
'options' => array(),
'env' => array(),
),
);
三、使用
# 下載
$pdf = \PDF::loadView('welcome', $data);
return $pdf->download('welcome.pdf');
# 渲染頁(yè)面
$html = '<html><head><meta charset="utf-8"></head><h1>訂單id</h1><h2>12346546</h2></html>';
$pdf = \PDF::loadHTML($html);
return $pdf->inline();
四、踩坑
中文字體問(wèn)題
如果 windows 里的字體文件有 C:\Windows\Fonts\simsun.ttc ,直接上傳到服務(wù)器里的 /usr/share/fonts 里
如果沒(méi)有 simsun.ttc 這個(gè)字體文件,下載一個(gè)上傳
關(guān)于 Js 不生效問(wèn)題
我需要轉(zhuǎn)成 pdf 的頁(yè)面有大量的 echarts 圖表, 有大量的 js 控制,開(kāi)始一個(gè)圖表都沒(méi)有顯示,然后斷點(diǎn)測(cè)試法,發(fā)現(xiàn)我 js 里有一段代碼是用的 let 聲明的變量,改成 var 就好了。
所以,wkhtmltopdf 不支持 ecs6
PDF 分頁(yè)問(wèn)題
使用 css 的 page-break-after:always; 或 page-break-inside:aovid;