Laravel snappy を使用して PDF を生成し、Laravel-admin に統合する方法

藏色散人
リリース: 2020-08-15 13:54:28
転載
3782 人が閲覧しました

#次のチュートリアル列では、Laravel Snappyを使用してPDFを生成し、Laravel-Adminに統合する方法を紹介します。困っている友人に役立つことを願っています。

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
ログイン後にコピー
インストール後、 in

app.config

alias

キーでファサード エイリアスを設定します (オプション): <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&amp;#39;PDF&amp;#39; =&gt; Barryvdh\Snappy\Facades\SnappyPdf::class, &amp;#39;SnappyImage&amp;#39; =&gt; 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=&quot;Barryvdh\Snappy\ServiceProvider&quot;</pre><div class="contentsignin">ログイン後にコピー</div></div> in

.env

ファイルに追加します:

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
ログイン後にコピー

次に、snappy.php 構成ファイルで次の構成を行います:

    &#39;pdf&#39; => [
        &#39;enabled&#39; => true,
        &#39;binary&#39;  => env(&#39;WKHTML_PDF_BINARY&#39;, &#39;vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64&#39;),
        &#39;timeout&#39; => 3600,
        &#39;options&#39; => [],
        &#39;env&#39;     => [],
    ],

    &#39;image&#39; => [
        &#39;enabled&#39; => true,
        &#39;binary&#39;  => env(&#39;WKHTML_IMG_BINARY&#39;, &#39;vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64&#39;),
        &#39;timeout&#39; => 3600,
        &#39;options&#39; => [],
        &#39;env&#39;     => [],
    ],
ログイン後にコピー

Use

レンダリング ブレード テンプレートを読み込んで PDF を生成する:

$pdf = PDF::loadView(&#39;pdf.invoice&#39;, $data); //pdf.invoice是你的blade模板
return $pdf->download(&#39;invoice.pdf&#39;);
ログイン後にコピー
外部リンクを通じて生成する:

return PDF::loadFile(&#39;http://www.github.com&#39;)->inline(&#39;github.pdf&#39;);
ログイン後にコピー

HTML を通じて生成し、さまざまな設定を行って保存する:

PDF::loadHTML($html)->setPaper(&#39;a4&#39;)->setOrientation(&#39;landscape&#39;)->setOption(&#39;margin-bottom&#39;, 0)->save(&#39;myfile.pdf&#39;)
// 更多选项可查看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 // 导出选定的行
ログイン後にコピー
対応するコントローラー メソッドは

index

である必要があります。ここから、

/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-&gt;handleExportRequest(true); try { $this-&gt;build(); } catch (\Exception $e) { return Handler::renderException($e); } $this-&gt;callRenderingCallback(); return view($this-&gt;view, $this-&gt;variables())-&gt;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 メソッドです。

AbstractExporter

クラスを継承する新しいクラスを作成して、必要なエクスポート ロジックを実装します。さらに、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))-&gt;resolve($this-&gt;exporter)-&gt;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(&#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;
    }
}
ログイン後にコピー

次に、 でapp/Admin/ 拡張機能を bootstrap.php に登録します:

Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);
ログイン後にコピー

最後に、それを Grid メソッドで使用します:

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

    // 添加导出PDF的扩展
    $grid->exporter(&#39;pdf-exporter&#39;);
    return $grid;}
ログイン後にコピー

このようにして、エクスポート ボタンをクリックすると、PDF を今すぐダウンロードできます。

注意事項

ブレード テンプレート内の css および js アドレスは完全な URL アドレスである必要があるため、mix( 'css/app.css')

    asset('css/app.css')
  • に変更する必要があります。画像アドレス (エラーが発生しにくくなります)
  • 最後に、レンダリングを投稿します:

以上がLaravel snappy を使用して PDF を生成し、Laravel-admin に統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート