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

#次のチュートリアル列では、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

キーでファサード エイリアスを設定します (オプション): <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>最後にリソース ファイルを公開します: <pre class='brush:php;toolbar:false;'>php artisan vendor:publish --provider=&quot;Barryvdh\Snappy\ServiceProvider&quot;</pre> 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

にあります。 :<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>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 メソッドを見てください: <pre class='brush:php;toolbar:false;'>protected function getExporter($scope){ return (new Exporter($this))-&gt;resolve($this-&gt;exporter)-&gt;withScope($scope);}</pre>また、サブクラスの 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で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Laravelの最新バージョンは何ですか?Laravelの最新バージョンは何ですか?Apr 24, 2025 pm 05:17 PM

laravel10、releaseonfebruary7,2023、isThelateStversion.itfeatures:1)改善された改善とnewReportmethexceptionhandler、2)拡張サプロポートフォーフプP8.1FeatureslikeNums、and3)

最新のLaravelバージョンはどのように開発を簡素化しますか?最新のLaravelバージョンはどのように開発を簡素化しますか?Apr 24, 2025 pm 05:01 PM

ThelatestlaravelversionEnhancesDevelopments:1)SimplifiedRoutingImplicitModelbinding、2)EnhancedEloquentCapabilitiesWithNewQueryMethods、and3)supportformdernphpeaturesliekenamedarguments、makedingdingingindenjoyableを改善しました。

最新のLaravelバージョンのリリースノートはどこにありますか?最新のLaravelバージョンのリリースノートはどこにありますか?Apr 24, 2025 pm 04:53 PM

laravel.com/docsで最新のLaravelバージョンのリリースノートを見つけることができます。 1)リリースノート新しい機能、バグの修正、改善に関する詳細情報を提供します。 2)新しい機能の適用を理解するのに役立つ例と説明が含まれています。 3)新機能の潜在的な複雑さと後方互換性の問題に注意してください。 4)リリースノートの定期的なレビューは、それを更新し続け、イノベーションを刺激することができます。

リモートツールキット:分散チームに接続されたままにするための必須ツールリモートツールキット:分散チームに接続されたままにするための必須ツールApr 24, 2025 pm 04:37 PM

the EssentialToolsforStayingConnedIndIndistRibutedTeamSClude:1)communicationToolslikezoom、Microsoftteams、Slack、anddiscord foreffectivecommunication;

Laravelの影響:Web開発の簡素化Laravelの影響:Web開発の簡素化Apr 21, 2025 am 12:18 AM

Laravelは、Web開発プロセスを簡素化し、強力な機能を提供することで際立っています。その利点には、1)簡潔な構文と強力なORMシステム、2)効率的なルーティングと認証システム、3)豊富なサードパーティライブラリサポート。開発者はエレガントなコードの作成に集中し、開発効率を向上させることができます。

Laravel:フロントエンドまたはバックエンド?フレームワークの役割を明確にしますLaravel:フロントエンドまたはバックエンド?フレームワークの役割を明確にしますApr 21, 2025 am 12:17 AM

laravelispredomintylyabackendframework、Designeforerver-sidelogic、databasemanagement、およびapidevelopmentが、BladeTemplatesで開発されたものです。

Laravel vs. Python:パフォーマンスとスケーラビリティの探索Laravel vs. Python:パフォーマンスとスケーラビリティの探索Apr 21, 2025 am 12:16 AM

LaravelとPythonには、パフォーマンスとスケーラビリティの点で独自の利点と短所があります。 Laravelは非同期処理とキューイングシステムを通じてパフォーマンスを向上させますが、PHPの制限により、高い並行性が存在する場合はボトルネックがある場合があります。 Pythonは、非同期フレームワークと強力なライブラリエコシステムでうまく機能しますが、Multi-Threaded環境のGILの影響を受けます。

Laravel vs. Python(フレームワーク付き):比較分析Laravel vs. Python(フレームワーク付き):比較分析Apr 21, 2025 am 12:15 AM

Laravelは、チームがPHPに精通しており、豊富な機能を必要とするプロジェクトに適していますが、Python Frameworksはプロジェクトの要件に依存します。 1.Laravelは、迅速な開発と柔軟性を必要とするプロジェクトに適したエレガントな構文とリッチな機能を提供します。 2。Djangoは、「バッテリー包含」の概念のため、複雑なアプリケーションに適しています。 3.Flaskは、高速プロトタイプや小規模プロジェクトに適しており、柔軟性が非常に高くなります。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール