Heim > PHP-Framework > Laravel > Hauptteil

So verwenden Sie Laravel Snappy, um PDFs zu generieren und in Laravel-admin zu integrieren

藏色散人
Freigeben: 2020-08-15 13:54:28
nach vorne
3782 Leute haben es durchsucht

wird die Methode zum Generieren von PDFs mit Laravel Snappy vorgestellt und in Laravel-Admin integriert. Ich hoffe, dass es für Freunde in Not hilfreich sein wird!

So verwenden Sie Laravel Snappy, um PDFs zu generieren und in Laravel-admin zu integrieren

Laravel snappy

Ich habe Python+wkhtmltopdf bereits zum Exportieren von PDFs verwendet. Es verfügt über viele Optionen zur Seitenanpassung und hilft Ihnen automatisch bei der Erfassung von Bildern aus dem Internet. als PDF gerendert. Dieses Mal wollte ich die Funktion zum Exportieren von PDF in Laravel-admin implementieren, daher habe ich das Erweiterungspaket Laravel Snappy gefunden, das eine Kapselung des Projekts https://github.com/KnpLabs/snappy ist. Zufälligerweise wird es auch übergeben Rufen Sie das Programm wkhtmltopdf auf, um PDF zu generieren.

Installation und Konfiguration

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

// 将wkhtmltopdf作为composer依赖
// 对于64位系统,使用:
composer require h4cc/wkhtmltopdf-amd64 0.12.x
composer require h4cc/wkhtmltoimage-amd64 0.12.x
Nach dem Login kopieren
Für die Homestead-Entwicklungsumgebung müssen Sie außerdem Folgendes ausführen:
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
Nach dem Login kopieren
Nach der Installation legen Sie den Fassadenalias (optional) im

-Schlüssel fest Ressourcendatei:

'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
Nach dem Login kopieren

Fügen Sie der

-Datei hinzu: app.config

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
Nach dem Login kopieren
alias Nehmen Sie dann die folgende Konfiguration in der

-Konfigurationsdatei vor:

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
Nach dem Login kopieren

Verwenden Sie .env

, um PDF zu generieren, indem Sie die Rendering-Blade-Vorlage laden: 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'     => [],
    ],
Nach dem Login kopieren

Durch externes generieren Links:

$pdf = PDF::loadView('pdf.invoice', $data); //pdf.invoice是你的blade模板
return $pdf->download('invoice.pdf');
Nach dem Login kopieren
über HTML Generieren, verschiedene Einstellungen vornehmen und speichern:
return PDF::loadFile('http://www.github.com')->inline('github.pdf');
Nach dem Login kopieren

Laravel-admin-Exportfunktionstransformation

Das Standardexportformat von Laravel-admin ist csv, hier werden wir es in das gewünschte PDF umwandeln Format.

Einfache Analyse des Laravel-Admin-Exportprinzips

Schauen Sie sich die Exportschaltfläche an. Sie können das Format der drei Exporteingänge wie folgt abrufen:

PDF::loadHTML($html)->setPaper('a4')->setOrientation('landscape')->setOption('margin-bottom', 0)->save('myfile.pdf')
// 更多选项可查看wkhtmltopdf的手册:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt
Nach dem Login kopieren
Die entsprechende Controller-Methode sollte sein, verfolgen Sie sie von hier aus , Sie finden in :
http://hostname/posts?_export_=all  // 导出全部
http://hostname/posts?_export_=page%3A1 // 导出当前页
http://hostname/posts?_export_=selected%3A1 // 导出选定的行
Nach dem Login kopieren

Wenn die URL den Parameter _export=... enthält, wird der Code in

ausgeführt:

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();}
Nach dem Login kopieren

Das Wichtigste ist die index-Methode, wir werden eine neue Klasse erstellen erbt die /vendor/encore/laravel-admin/src/Grid.php-Klasse, um die gewünschte Exportlogik zu implementieren. Schauen Sie sich außerdem die

-Methode an:

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方法
    }}
Nach dem Login kopieren
$this->handleExportRequest(true); Wir können

auch in der Unterklasse umschreiben, um einige Parametereinstellungen und das Abfangen durchzuführen.

exportAbstractExportergetExporter

Beginnen Sie mit der Änderung der Exportfunktion

withScope

Nachdem wir die Grundprinzipien verstanden und die Laravel-Admin-Dokumentation gelesen haben, können wir mit der Änderung der Exportfunktion beginnen.

Erstellen Sie zunächst eine Erweiterung, z. B. . Der Code wird wie folgt implementiert:

protected function getExporter($scope){
    return (new Exporter($this))->resolve($this->exporter)->withScope($scope);}
Nach dem Login kopieren
Dann registrieren Sie die Erweiterung in

:

<?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;
    }
}
Nach dem Login kopieren

Verwenden Sie sie schließlich in der

-Methode: app/Admin/Extensions/PdfExporter.php

Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);
Nach dem Login kopieren

Auf diese Weise, wann Wenn Sie auf die Schaltfläche „Exportieren“ klicken, können Sie das PDF herunterladen.

app/Admin/bootstrap.php

GridHinweise

Die CSS- und JS-Adressen in der Blade-Vorlage müssen die vollständige URL-Adresse sein, daher sollte in geändert werden. Die Bildadresse sollte am besten das http-Protokoll anstelle von https verwenden ist weniger fehleranfällig

  • Schließlich posten Sie ein Rendering: mix('css/app.css')asset('css/app.css')
  •                              

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Laravel Snappy, um PDFs zu generieren und in Laravel-admin zu integrieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage