Maison > cadre php > Laravel > 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

藏色散人
Libérer: 2020-08-15 13:54:28
avant
3845 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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,
Copier après la connexion

Publiez enfin le fichier de ressources :

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
Copier après la connexion

Ajoutez dans le fichier .env :

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
Copier après la connexion

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'     => [],
    ],
Copier après la connexion

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');
Copier après la connexion

générer via des liens externes :

return PDF::loadFile('http://www.github.com')->inline('github.pdf');
Copier après la connexion

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
Copier après la connexion

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 // 导出选定的行
Copier après la connexion

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();}
Copier après la connexion

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方法
    }}
Copier après la connexion

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);}
Copier après la connexion

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;
    }
}
Copier après la connexion

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

Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);
Copier après la connexion

Enfin, le GridUtilisation correspondant dans la méthode :

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

    // 添加导出PDF的扩展
    $grid->exporter(&#39;pdf-exporter&#39;);
    return $grid;}
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal