ホームページ PHPフレームワーク Laravel Laravel snappy を使用して PDF を生成し、Laravel-admin に統合する方法

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

Aug 15, 2020 pm 01:54 PM
laravel pdf

#次のチュートリアル列では、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravel - アーティザンコマンド Laravel - アーティザンコマンド Aug 27, 2024 am 10:51 AM

Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

Laravel - ページネーションのカスタマイズ Laravel - ページネーションのカスタマイズ Aug 27, 2024 am 10:51 AM

Laravel - ページネーションのカスタマイズ - Laravel には、ユーザーまたは開発者がページネーション機能を組み込むのに役立つページネーションの機能が含まれています。 Laravel ページネーターは、クエリ ビルダーおよび Eloquent ORM と統合されています。自動ページネーションメソッド

Laravelで電子メールの送信が失敗したときに返品コードを取得する方法は? Laravelで電子メールの送信が失敗したときに返品コードを取得する方法は? Apr 01, 2025 pm 02:45 PM

Laravelの電子メールの送信が失敗したときに戻りコードを取得する方法。 Laravelを使用してアプリケーションを開発する場合、検証コードを送信する必要がある状況に遭遇することがよくあります。そして実際には...

Laravelスケジュールタスクは実行されません:スケジュール:実行コマンドの後にタスクが実行されていない場合はどうすればよいですか? Laravelスケジュールタスクは実行されません:スケジュール:実行コマンドの後にタスクが実行されていない場合はどうすればよいですか? Mar 31, 2025 pm 11:24 PM

LaravelスケジュールタスクRAN RANSPONSIVEトラブルシューティングRALAVELのスケジュールタスクスケジューリングを使用すると、多くの開発者がこの問題に遭遇します。スケジュール:実行...

Laravelでは、検証コードが電子メールで送信できない状況に対処する方法は? Laravelでは、検証コードが電子メールで送信できない状況に対処する方法は? Mar 31, 2025 pm 11:48 PM

Laravelの電子メールの検証コードの送信の障害を処理する方法は、Laravelを使用することです...

DCAT管理者にデータを追加するためにクリックのカスタムテーブル関数を実装する方法は? DCAT管理者にデータを追加するためにクリックのカスタムテーブル関数を実装する方法は? Apr 01, 2025 am 07:09 AM

DCATを使用するときにDCATADMIN(Laravel-Admin)にデータを追加するためにカスタムクリックのテーブル関数を実装する方法...

Laravel - ダンプサーバー Laravel - ダンプサーバー Aug 27, 2024 am 10:51 AM

Laravel - ダンプサーバー - Laravel ダンプサーバーには、Laravel 5.7 のバージョンが付属しています。以前のバージョンにはダンプ サーバーが含まれていません。ダンプサーバーはlaravel/laravelコンポーザーファイルの開発依存関係になります。

Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Apr 01, 2025 am 07:45 AM

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。

See all articles