亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 php框架 Laravel 如何使用Laravel snappy生成PDF并集成到Laravel-admin

如何使用Laravel snappy生成PDF并集成到Laravel-admin

Aug 15, 2020 pm 01:54 PM
laravel pdf

下面由Laravel教程欄目給大家介紹使用Laravel snappy生成PDF并集成到Laravel-admin的方法,希望對需要的朋友有所幫助!

如何使用Laravel snappy生成PDF并集成到Laravel-admin

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開發(fā)環(huán)境,還要執(zhí)行:

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.configalias鍵設置facade別名(可選):

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

最后發(fā)布資源文件:

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

.env文件中添加:

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64

然后在snappy.php配置文件中做如下配置:

    'pdf' => [
        'enabled' => true,
        'binary'  => env('WKHTML_PDF_BINARY', 'vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
        'timeout' => 3600,
        'options' => [],
        'env'     => [],
    ],

    'image' => [
        'enabled' => true,
        'binary'  => env('WKHTML_IMG_BINARY', 'vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64'),
        'timeout' => 3600,
        'options' => [],
        'env'     => [],
    ],

使用

通過加載渲染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,從這里追查開去,可以找到/vendor/encore/laravel-admin/src/Grid.php中有:

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=…參數,將會執(zhí)行$this->handleExportRequest(true);這里面的代碼:

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方法
    }}

最關鍵的是export方法,我們將新建一個繼承AbstractExporter類的類,實現我們自己想要的導出邏輯。另外,看getExporter方法:

protected function getExporter($scope){
    return (new Exporter($this))->resolve($this->exporter)->withScope($scope);}

我們還可以在子類中改寫withScope進行一些參數設置、攔截。

開始改造導出功能

了解了基本的原理,再參考下Laravel-admin的文檔,我們就可以著手改下導出功能了。

首先,創(chuàng)建一個擴展,如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(&#39;user_id&#39;)) {
                $this->grid->model()->where(&#39;user_id&#39;, request()->user_id);
            } else {
                $this->lackOfUserId = true;
            }
            return $this;
        }*/
        return parent::withScope($scope);
    }

    public function export()
    {
        // 具體的導出邏輯,比如:
        if($this->lackOfUserId) {
            $headers = [
                &#39;Content-Encoding&#39;    => &#39;UTF-8&#39;,
                &#39;Content-Type&#39;        => &#39;text/html;charset=UTF-8&#39;,
            ];
            response(&#39;請先篩選出用戶&#39;, 200, $headers)->send();
            exit();
        }
        $author = $this->grid->model()->getOriginalModel()->first()->user->user_name;

        $this->grid->model()->orderBy(&#39;add_time&#39;, &#39;desc&#39;);

        // 按年-月分組數據
        $data = collect($this->getData())->groupBy(function ($post) {
            return Carbon::parse(date(&#39;Y-m-d&#39;,$post[&#39;add_time&#39;]))->format(&#39;Y-m&#39;);
        })->toArray();
        // 渲染數據到blade模板
        $output = PDF::loadView(&#39;pdf.weibo&#39;, compact(&#39;data&#39;))->setOption(&#39;footer-center&#39;, &#39;[page]&#39;)->output();

        $headers = [
            &#39;Content-Type&#39;        => &#39;application/pdf&#39;,
            &#39;Content-Disposition&#39; => "attachment; filename=$author.pdf",
        ];

        // 導出文件,
        response(rtrim($output, "\n"), 200, $headers)->send();

        exit;
    }
}

接著,在app/Admin/bootstrap.php中注冊擴展:

Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);

最后,對應的在Grid方法中使用:

protected function grid(){
    // 其他邏輯...

    // 添加導出PDF的擴展
    $grid->exporter(&#39;pdf-exporter&#39;);
    return $grid;}

這樣,點擊導出按鈕的時候,就可以下載PDF了。

注意事項

  • blade模板中的css、js地址必須是完整的url地址,所以mix('css/app.css')應該改為asset('css/app.css')
  • 圖片地址最好使用http協議代替https,比較不容易出錯

最后,貼個效果圖吧:

使用 Laravel snappy 生成 PDF 并集成到 Laravel-admin

? ? ? ? ? ? ? ? ? ? ? ? ? ?

以上是如何使用Laravel snappy生成PDF并集成到Laravel-admin的詳細內容。更多信息請關注PHP中文網其他相關文章!

本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現有涉嫌抄襲侵權的內容,請聯系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驅動投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

電腦突然無法識別打印機應該怎樣排查? 電腦突然無法識別打印機應該怎樣排查? Sep 20, 2025 am 08:27 AM

答案:電腦無法識別打印機通常由連接、驅動或服務問題引起。首先檢查USB或網絡連接是否正常,確保打印機已開機;若連接無誤,重啟設備并檢查“設備管理器”中驅動狀態(tài),更新或重裝官網驅動;確認Windows“PrintSpooler”服務已啟動且設為自動;利用系統“疑難解答”工具排查問題。若驅動反復安裝失敗,需徹底卸載舊驅動并清理殘留文件,重啟后以管理員身份安裝新版驅動,必要時使用兼容模式或系統還原。Windows更新后出現問題應優(yōu)先下載適配新系統的驅動,或回滾更新、檢查服務狀態(tài)。排查時易忽略的細節(jié)包括

iPad分屏怎么用于閱讀和翻譯_iPad分屏文本對照與翻譯應用教程 iPad分屏怎么用于閱讀和翻譯_iPad分屏文本對照與翻譯應用教程 Sep 15, 2025 pm 01:33 PM

iPad分屏可提升閱讀與翻譯效率,通過左右分屏實現原文與翻譯對照,操作方式為從底部上滑調出Dock欄,長按應用拖拽至邊緣分屏,推薦使用MarginNote搭配歐路詞典、GoodNotes、LiquidText等支持拖拽翻譯或分屏協作的應用,結合iPadOS實時文本功能識別圖片文字,優(yōu)化閱讀體驗。

為什么Windows無法打開PDF文件?教你快速安裝PDF閱讀器的步驟 為什么Windows無法打開PDF文件?教你快速安裝PDF閱讀器的步驟 Sep 15, 2025 pm 03:42 PM

Windows系統無法直接打開PDF文件通常因缺少專業(yè)閱讀器,盡管Edge可查看但功能有限,復雜操作或排版需依賴AdobeAcrobatReaderDC、福昕閱讀器或SumatraPDF等專業(yè)工具,后者在功能、性能、安全與體驗上更優(yōu),安裝后通過“打開方式”設置默認程序即可實現雙擊自動打開。

夸克網盤如何搜索自己盤里的文件_夸克網盤內資源精準搜索技巧 夸克網盤如何搜索自己盤里的文件_夸克網盤內資源精準搜索技巧 Sep 20, 2025 am 11:06 AM

使用關鍵詞搜索、篩選條件、文件路徑及最近記錄可快速定位夸克網盤文件。先在搜索框輸入關鍵詞查找,再通過篩選功能按類型、時間等縮小范圍,查看文件路徑或收藏常用文件夾以便下次快速訪問,也可在“最近”列表中找回近期操作的文件。

順豐同城月結怎么使用_順豐同城月結賬戶申請與使用 順豐同城月結怎么使用_順豐同城月結賬戶申請與使用 Sep 16, 2025 pm 01:45 PM

申請順豐同城月結賬號需提交企業(yè)信息及營業(yè)執(zhí)照,審核通過后獲得賬號;登錄時需在賬號前加“ZD”前綴;可通過平臺在線下單、預約取件、打印運單;支持賬單查詢、發(fā)票開具與下載;企業(yè)還可設置員工權限,分配不同角色與功能限制。

如何將消息記錄到Laravel中的文件? 如何將消息記錄到Laravel中的文件? Sep 21, 2025 am 06:04 AM

LaraveluseMonologTologMessagesViathelogFacade,withDefaultLogSstoreDinstorage/logs/logaver.log.configurechannelsinconfig/loggpocontrolOlOutput; theDefeftoconTrolOutput; theDefeftStackChannAnneLagateSmultipleHersMultipleHerslikeSlikeSlikesingLikeSingLikeSingle,whatwrile.afile.usel.uselel.uselel.usecy.useleleel.use)

如何在Laravel中創(chuàng)建全文搜索? 如何在Laravel中創(chuàng)建全文搜索? Sep 16, 2025 am 03:42 AM

toimplementfull-textsearchinlaravel,firstAddafull-textIndexinThththemigration $ table-> fullText(['title','content']); thenusewherewhereflyltext(['title'titter','content'','content',$ query)

如何使用Laravel的Hasmanythrough關系? 如何使用Laravel的Hasmanythrough關系? Sep 17, 2025 am 06:38 AM

AcountrycanaccessallpostSthrouserSerssinghasmanyThrough

See all articles