Heim >PHP-Framework >Laravel >So verwenden Sie Laravel Snappy, um PDFs zu generieren und in Laravel-admin zu integrieren
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!
Laravel snappyIch 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
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 der Installation legen Sie den Fassadenalias (optional) im
'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class, 'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,Fügen Sie der
-Datei hinzu: app.config
php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
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
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' => [], ],Durch externes generieren Links:
$pdf = PDF::loadView('pdf.invoice', $data); //pdf.invoice是你的blade模板 return $pdf->download('invoice.pdf');über HTML Generieren, verschiedene Einstellungen vornehmen und speichern:
return PDF::loadFile('http://www.github.com')->inline('github.pdf');
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.txtDie 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 // 导出选定的行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();}
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
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方法 }}
$this->handleExportRequest(true);
Wir können auch in der Unterklasse umschreiben, um einige Parametereinstellungen und das Abfangen durchzuführen. export
AbstractExporter
getExporter
withScope
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);}
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('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; } }Verwenden Sie sie schließlich in der
-Methode: app/Admin/Extensions/PdfExporter.php
Exporter::extend('pdf-exporter', PdfExporter::class);Auf diese Weise, wann Wenn Sie auf die Schaltfläche „Exportieren“ klicken, können Sie das PDF herunterladen.
app/Admin/bootstrap.php
Grid
Hinweise
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
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!