#次のチュートリアル列では、Laravel Snappyを使用してPDFを生成し、Laravel-Adminに統合する方法を紹介します。困っている友人に役立つことを願っています。
Laravel snappy以前、Python wkhtmltopdf を使用して PDF をエクスポートしたことがあります。wkhtmltopdf は確かに非常に強力です。このツールには多くのページカスタマイズオプションがあり、インターネットから画像を取得して PDF にレンダリングするのに自動的に役立ちます。今回はLaravel-adminにPDFをエクスポートする機能を実装したかったので、プロジェクトhttps://github.com/KnpLabs/snappyをカプセル化した拡張パッケージLaravel 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
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
キーでファサード エイリアスを設定します (オプション): <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&#39;PDF&#39; => Barryvdh\Snappy\Facades\SnappyPdf::class,
&#39;SnappyImage&#39; => Barryvdh\Snappy\Facades\SnappyImage::class,</pre><div class="contentsignin">ログイン後にコピー</div></div>
最後にリソース ファイルを公開します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"</pre><div class="contentsignin">ログイン後にコピー</div></div>
in
ファイルに追加します:
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' => [], ],
Use
レンダリング ブレード テンプレートを読み込んで 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 管理者のエクスポート原理の簡単な分析エクスポート ボタンを見ると、次の 3 つのエクスポート エントリの形式を取得できます。 :http://hostname/posts?_export_=all // 导出全部
http://hostname/posts?_export_=page%3A1 // 导出当前页
http://hostname/posts?_export_=selected%3A1 // 导出选定的行
である必要があります。ここから、
/vendor/encore/laravel-admin/src/Grid.php にあります。 :<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">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();}</pre><div class="contentsignin">ログイン後にコピー</div></div>
URL に _export=... パラメータがある場合、$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
メソッドです。
クラスを継承する新しいクラスを作成して、必要なエクスポート ロジックを実装します。さらに、getExporter
メソッドを見てください: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">protected function getExporter($scope){
return (new Exporter($this))->resolve($this->exporter)->withScope($scope);}</pre><div class="contentsignin">ログイン後にコピー</div></div>
また、サブクラスの withScope
を書き換えて、パラメーター設定とインターセプトを実行することもできます。
基本原則を理解し、Laravel 管理ドキュメントを参照した後、エクスポート関数の変更を開始できます。 。 まず、
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('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; } }
次に、 でapp/Admin/ 拡張機能を bootstrap.php
に登録します:
Exporter::extend('pdf-exporter', PdfExporter::class);
最後に、それを Grid
メソッドで使用します:
protected function grid(){ // 其他逻辑... // 添加导出PDF的扩展 $grid->exporter('pdf-exporter'); return $grid;}
このようにして、エクスポート ボタンをクリックすると、PDF を今すぐダウンロードできます。
ブレード テンプレート内の css および js アドレスは完全な URL アドレスである必要があるため、mix( 'css/app.css')
を
に変更する必要があります。画像アドレス (エラーが発生しにくくなります)
以上がLaravel snappy を使用して PDF を生成し、Laravel-admin に統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。