Laravel snappy
之前使用過python wkhtmltopdf來匯出PDF,wkhtmltopdf確實是很強大的工具,有很多的頁面自訂選項,而且會自動幫你把網路上的圖片抓下來,渲染到PDF上。這次想在Laravel-admin中實現導出PDF的功能,於是找到了Laravel snappy這個擴充包,它是對https://github.com/KnpLabs/snappy這個專案的封裝,好巧的是,它也是透過呼叫wkhtmltopdf程式來產生PDF的。
安裝與設定// 安装扩展包 composer require barryvdh/laravel-snappy // 将wkhtmltopdf作为composer依赖 // 对于64位系统,使用: composer require h4cc/wkhtmltopdf-amd64 0.12.x composer require h4cc/wkhtmltoimage-amd64 0.12.x
對於homestead開發環境,也要執行: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
安裝完後,在app.config中
鍵設定facade別名(可選):
'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class, 'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
最後發布資源檔案:<pre class='brush:php;toolbar:false;'>php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"</pre>
在.env
檔案中新增:
WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64 WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
然後在
snappy.php設定檔中做以下設定:<pre class='brush:php;toolbar:false;'> &#39;pdf&#39; => [
&#39;enabled&#39; => true,
&#39;binary&#39; => env(&#39;WKHTML_PDF_BINARY&#39;, &#39;vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64&#39;),
&#39;timeout&#39; => 3600,
&#39;options&#39; => [],
&#39;env&#39; => [],
],
&#39;image&#39; => [
&#39;enabled&#39; => true,
&#39;binary&#39; => env(&#39;WKHTML_IMG_BINARY&#39;, &#39;vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64&#39;),
&#39;timeout&#39; => 3600,
&#39;options&#39; => [],
&#39;env&#39; => [],
],</pre>
透過載入渲染blade模板生成PDF:
$pdf = PDF::loadView('pdf.invoice', $data); //pdf.invoice是你的blade模板 return $pdf->download('invoice.pdf');
透過外部連結生成:return PDF::loadFile('http://www.github.com')->inline('github.pdf');
透過html生成,並做各種設置,並保存之:
PDF::loadHTML($html)->setPaper('a4')->setOrientation('landscape')->setOption('margin-bottom', 0)->save('myfile.pdf') // 更多选项可查看wkhtmltopdf的手册:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt
Laravel-admin導出功能改造
Laravel-admin預設的匯出格式是csv,這裡將把它改造成想要的PDF格式。
Laravel-admin導出原理簡單分析#檢視匯出按鈕,可得到這三個匯出入口格式大概如下:http://hostname/posts?_export_=all // 导出全部
http://hostname/posts?_export_=page%3A1 // 导出当前页
http://hostname/posts?_export_=selected%3A1 // 导出选定的行
其有對應的控制器方法應該是index,從這裡追查開去,可以找到
中有:
public function render(){ $this->handleExportRequest(true); try { $this->build(); } catch (\Exception $e) { return Handler::renderException($e); } $this->callRenderingCallback(); return view($this->view, $this->variables())->render();}
如果url中有帶_export=…參數,將會執行$this->handleExportRequest(true);
這裡面的程式碼:<pre class='brush:php;toolbar:false;'>protected function handleExportRequest($forceExport = false){
if (!$scope = request(Exporter::$queryName)) {
return;
}
// clear output buffer.
if (ob_get_length()) {
ob_end_clean();
}
$this->disablePagination();
if ($forceExport) {
$this->getExporter($scope)->export(); // 这里将调用某个类的export方法
}}</pre>
最關鍵的是
方法,我們將新建一個繼承AbstractExporter
類的類,實現我們自己想要的導出邏輯。另外,看
方法:<pre class='brush:php;toolbar:false;'>protected function getExporter($scope){
return (new Exporter($this))->resolve($this->exporter)->withScope($scope);}</pre>
我們也可以在子類別中改寫withScope
進行一些參數設定、攔截。
開始改造導出功能
了解了基本的原理,再參考下Laravel-admin的文檔,我們就可以著手改下導出功能了。 首先,建立一個擴展,如app/Admin/Extensions/PdfExporter.php,程式碼實作如下:
<?php namespace App\Admin\Extensions; use Encore\Admin\Grid\Exporters\AbstractExporter; use Encore\Admin\Grid\Exporter; use PDF; class PdfExporter extends AbstractExporter { protected $lackOfUserId = false; public function withScope($scope){ // 你自己的一些处理逻辑,比如: /*if ($scope == Exporter::SCOPE_ALL) { if(request()->has('user_id')) { $this->grid->model()->where('user_id', request()->user_id); } else { $this->lackOfUserId = true; } return $this; }*/ return parent::withScope($scope); } public function export() { // 具体的导出逻辑,比如: if($this->lackOfUserId) { $headers = [ 'Content-Encoding' => 'UTF-8', 'Content-Type' => 'text/html;charset=UTF-8', ]; response('请先筛选出用户', 200, $headers)->send(); exit(); } $author = $this->grid->model()->getOriginalModel()->first()->user->user_name; $this->grid->model()->orderBy('add_time', 'desc'); // 按年-月分组数据 $data = collect($this->getData())->groupBy(function ($post) { return Carbon::parse(date('Y-m-d',$post['add_time']))->format('Y-m'); })->toArray(); // 渲染数据到blade模板 $output = PDF::loadView('pdf.weibo', compact('data'))->setOption('footer-center', '[page]')->output(); $headers = [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => "attachment; filename=$author.pdf", ]; // 导出文件, response(rtrim($output, "\n"), 200, $headers)->send(); exit; } }
接著,在
app/Admin/ bootstrap.php中註冊擴充功能:<pre class='brush:php;toolbar:false;'>Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);</pre>
最後,對應的在
方法中使用:<pre class='brush:php;toolbar:false;'>protected function grid(){
// 其他逻辑...
// 添加导出PDF的扩展
$grid->exporter(&#39;pdf-exporter&#39;);
return $grid;}</pre>
這樣,點擊匯出按鈕的時候,就可以下載PDF了。
blade範本中的css、js位址必須是完整的url位址,所以mix( 'css/app.css')應該改為asset('css/app.css')
- 圖片位址最好使用http協定取代https,比較不容易出錯
最後,請貼個效果圖:
以上是如何使用Laravel snappy產生PDF並整合到Laravel-admin的詳細內容。更多資訊請關注PHP中文網其他相關文章!

選擇Laravel或Python取決於項目需求:1)若需快速開發Web應用並使用ORM和認證系統,選Laravel;2)若涉及數據分析、機器學習或科學計算,選Python。

Laravel适合快速构建Web应用,Python适用于需要灵活性和多功能性的项目。1)Laravel提供丰富功能如ORM和路由,适合PHP生态系统。2)Python以简洁语法和强大库生态系统著称,适用于Web开发和数据科学等领域。

使用Laravel和PHP可以高效且有趣地創建動態網站。 1)Laravel遵循MVC架構,Blade模板引擎簡化HTML編寫。 2)路由系統和請求處理機制使URL定義和用戶輸入處理變得簡單。 3)EloquentORM簡化數據庫操作。 4)通過博客系統示例展示了數據庫遷移、CRUD操作和Blade模板的使用。 5)Laravel提供了強大的用戶認證和授權功能。 6)調試技巧包括使用日誌系統和Artisan工具。 7)性能優化建議包括惰性加載和緩存。

Laravel通過Blade模板引擎、EloquentORM、Artisan工具和LaravelMix實現全棧開發:1.Blade簡化前端開發;2.Eloquent簡化數據庫操作;3.Artisan提高開發效率;4.LaravelMix管理前端資源。

Laravel是一個基於PHP的現代化框架,遵循MVC架構模式,提供了豐富的工具和功能,簡化了Web開發過程。 1)它包含EloquentORM用於數據庫交互,2)Artisan命令行接口用於快速生成代碼,3)Blade模板引擎用於高效的視圖開發,4)強大的路由系統用於定義URL結構,5)認證系統用於用戶管理,6)事件監聽和廣播用於實時功能,7)緩存和隊列系統用於性能優化,使得構建和維護現代Web應用變得更加容易和高效。

Laravel适合快速构建Web应用,而Python适用于更广泛的应用场景。1.Laravel提供EloquentORM、Blade模板引擎和Artisan工具,简化Web开发。2.Python以动态类型、丰富的标准库和第三方生态系统著称,适用于Web开发、数据科学等领域。

Laravel和Python各有優勢:Laravel適合快速構建功能豐富的Web應用,Python在數據科學和通用編程領域表現出色。 1.Laravel提供EloquentORM和Blade模板引擎,適合構建現代Web應用。 2.Python擁有豐富的標準庫和第三方庫,Django和Flask框架滿足不同開發需求。

Laravel值得選擇,因為它能使代碼結構清晰,開發過程更具藝術性。 1)Laravel基於PHP,遵循MVC架構,簡化Web開發。 2)其核心功能如EloquentORM、Artisan工具和Blade模板增強了開發的優雅與健壯性。 3)通過路由、控制器、模型和視圖,開發者能高效構建應用。 4)隊列和事件監聽等高級功能進一步提升應用性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版