Maison  >  Article  >  cadre php  >  Comment utiliser Laravel snappy pour générer des PDF et les intégrer dans Laravel-admin

Comment utiliser Laravel snappy pour générer des PDF et les intégrer dans Laravel-admin

藏色散人
藏色散人avant
2020-08-15 13:54:283674parcourir

La colonne tutorielle suivante de Laravel vous présentera comment utiliser Laravel Snappy pour générer un PDF et l'intégrer dans Laravel-admin. J'espère que cela vous sera utile. aux amis dans le besoin !

Comment utiliser Laravel snappy pour générer des PDF et les intégrer dans Laravel-admin

Laravel snappy

J'ai déjà utilisé python+wkhtmltopdf pour exporter des PDF, wkhtmltopdf est vraiment puissant L'outil propose de nombreuses options de personnalisation de page et vous aidera automatiquement à récupérer des images sur Internet et à les restituer au format PDF. Cette fois, je voulais implémenter la fonction d'exportation de PDF dans Laravel-admin, j'ai donc trouvé le package d'extension Laravel snappy, qui est une encapsulation du projet https://github.com/KnpLabs/snappy, par coïncidence, il est également transmis. Appelez le programme wkhtmltopdf pour générer un PDF.

Installation et configuration

// 安装扩展包
composer require barryvdh/laravel-snappy

// 将wkhtmltopdf作为composer依赖
// 对于64位系统,使用:
composer require h4cc/wkhtmltopdf-amd64 0.12.x
composer require h4cc/wkhtmltoimage-amd64 0.12.x

Pour l'environnement de développement de la propriété, exécutez également :

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

Après l'installation, dansapp.config Dans la touche alias, définissez l'alias de façade (facultatif) :

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

Publiez enfin le fichier de ressources :

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

Ajoutez dans le fichier .env :

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

Effectuez ensuite la configuration suivante dans le snappy.php fichier de configuration :

    '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'     => [],
    ],

Utilisez

pour générer un PDF en chargeant le modèle de lame de rendu :

$pdf = PDF::loadView('pdf.invoice', $data); //pdf.invoice是你的blade模板
return $pdf->download('invoice.pdf');

générer via des liens externes :

return PDF::loadFile('http://www.github.com')->inline('github.pdf');

Générer via html, effectuer divers réglages et enregistrer :

PDF::loadHTML($html)->setPaper('a4')->setOrientation('landscape')->setOption('margin-bottom', 0)->save('myfile.pdf')
// 更多选项可查看wkhtmltopdf的手册:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

Modification de la fonction d'exportation de Laravel-admin

Le format d'export par défaut de Laravel-admin est csv, nous allons ici le transformer au format PDF souhaité.

Une analyse simple du principe d'exportation de Laravel-admin

Regardez le bouton d'exportation, et vous pouvez obtenir le format des trois entrées d'exportation comme suit :

http://hostname/posts?_export_=all  // 导出全部
http://hostname/posts?_export_=page%3A1 // 导出当前页
http://hostname/posts?_export_=selected%3A1 // 导出选定的行

La méthode du contrôleur correspondante doit être index À partir de là, vous pouvez trouver ce qui suit dans /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();}

Si l'url a le paramètre _export=…, il exécutera le code dans $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方法
    }}

Le plus important est la méthode export Nous allons créer une nouvelle classe qui hérite de la classe AbstractExporter pour implémenter la logique d'exportation que nous souhaitons. De plus, regardez la méthode getExporter :

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

Nous pouvons également réécrire withScope dans la sous-classe pour effectuer certains paramétrages et interceptions.

Commencer à modifier la fonction d'exportation

Après avoir compris les principes de base et consulté la documentation de Laravel-admin, nous pouvons commencer à modifier la fonction d'exportation .

Tout d'abord, créez une extension, telle que app/Admin/Extensions/PdfExporter.php, et le code est implémenté comme suit :

<?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;
    }
}

Ensuite, enregistrez l'extension dans app/Admin/bootstrap.php :

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

Enfin, le GridUtilisation correspondant dans la méthode :

protected function grid(){
    // 其他逻辑...

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

De cette façon, lorsque vous cliquez sur le bouton exporter, vous pouvez télécharger le PDF.

Notes

  • Les adresses CSS et JS dans le modèle de lame doivent être l'adresse URL complète, donc mix('css/app.css') doit être modifié Pour l'adresse de l'image asset('css/app.css')
  • il est préférable d'utiliser le protocole http au lieu de https, qui est moins sujet aux erreurs

Enfin, postez un rendu :

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

                                                   

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer