>PHP 프레임워크 >Laravel >Laravel snappy를 사용하여 PDF를 생성하고 Laravel-admin에 통합하는 방법

Laravel snappy를 사용하여 PDF를 생성하고 Laravel-admin에 통합하는 방법

藏色散人
藏色散人앞으로
2020-08-15 13:54:283819검색

튜토리얼 칼럼에서는 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를 찾았는데, 공교롭게도 이것도 통과되었습니다. PDF를 생성하려면 wkhtmltopdf 프로그램을 호출하세요.

설치 및 구성

// 安装扩展包
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
설치 후 app.config에서 <code>alias 키를 설정합니다. code> 파사드 별칭(선택 사항):

&#39;PDF&#39; => Barryvdh\Snappy\Facades\SnappyPdf::class,
&#39;SnappyImage&#39; => Barryvdh\Snappy\Facades\SnappyImage::class,

마지막 게시된 리소스 파일:

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

.env 파일에 추가: app.configalias键设置facade别名(可选):

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64

最后发布资源文件:

    &#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;     => [],
    ],

.env文件中添加:

$pdf = PDF::loadView(&#39;pdf.invoice&#39;, $data); //pdf.invoice是你的blade模板
return $pdf->download(&#39;invoice.pdf&#39;);

然后在snappy.php配置文件中做如下配置:

return PDF::loadFile(&#39;http://www.github.com&#39;)->inline(&#39;github.pdf&#39;);

使用

通过加载渲染blade模板生成PDF:

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

通过外部链接生成:

http://hostname/posts?_export_=all  // 导出全部
http://hostname/posts?_export_=page%3A1 // 导出当前页
http://hostname/posts?_export_=selected%3A1 // 导出选定的行

通过html生成,并做各种设置,并保存之:

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();}

Laravel-admin导出功能改造

Laravel-admin默认的导出格式是csv,这里将把它改造成想要的PDF格式。

Laravel-admin导出原理简单分析

查看导出按钮,可得到这三个导出入口格式大概如下:

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方法
    }}

其有对应的控制器方法应该是index,从这里追查开去,可以找到/vendor/encore/laravel-admin/src/Grid.php中有:

protected function getExporter($scope){
    return (new Exporter($this))->resolve($this->exporter)->withScope($scope);}

如果url中有带_export=…参数,将会执行$this->handleExportRequest(true);这里面的代码:

<?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;
    }
}

最关键的是export方法,我们将新建一个继承AbstractExporter类的类,实现我们自己想要的导出逻辑。另外,看getExporter方法:

Exporter::extend(&#39;pdf-exporter&#39;, PdfExporter::class);

我们还可以在子类中改写withScope进行一些参数设置、拦截。

开始改造导出功能

了解了基本的原理,再参考下Laravel-admin的文档,我们就可以着手改下导出功能了。

首先,创建一个扩展,如app/Admin/Extensions/PdfExporter.php,代码实现如下:

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

    // 添加导出PDF的扩展
    $grid->exporter(&#39;pdf-exporter&#39;);
    return $grid;}

接着,在app/Admin/bootstrap.php中注册扩展:

rrreee

最后,对应的在Grid方法中使用:

rrreee

这样,点击导出按钮的时候,就可以下载PDF了。

注意事项

  • blade模板中的css、js地址必须是完整的url地址,所以mix('css/app.css')应该改为asset('css/app.css')rrreee
  • 그런 다음 snappy.php 구성에서 file 다음과 같이 구성합니다.
  • rrreee

을 사용하여 렌더링 블레이드 템플릿을 로드하여 PDF를 생성합니다. 使用 Laravel snappy 生成 PDF 并集成到 Laravel-adminrrreee

외부 링크를 통해 생성:

rrreee

html을 통해 생성하고 다양한 설정을 지정한 후 저장합니다. 🎜rrreee🎜 🎜🎜 🎜Laravel-admin 내보내기 기능 변환🎜🎜🎜Laravel-admin의 기본 내보내기 형식은 csv입니다. 여기서는 원하는 PDF 형식으로 변환하겠습니다. 🎜🎜🎜🎜🎜Laravel-admin 내보내기 원칙의 간단한 분석🎜🎜🎜내보내기 버튼을 보면 다음과 같이 세 가지 내보내기 항목의 형식을 얻을 수 있습니다. 🎜rrreee🎜해당 컨트롤러 메서드는 index 여야 합니다. code> , 여기에서 추적하면 다음이 포함된 <code>/vendor/encore/laravel-admin/src/Grid.php를 찾을 수 있습니다. 🎜rrreee🎜url에 _export=… 매개변수가 있으면 $this->handleExportRequest(true);여기 코드: 🎜rrreee🎜가장 중요한 것은 export 메서드입니다. 새로운 상속을 생성합니다. AbstractExporter code> 클래스의 클래스는 우리가 원하는 내보내기 로직을 ​​구현합니다. 또한 <code>getExporter 메서드를 살펴보세요. 🎜rrreee🎜또한 하위 클래스에서 withScope를 다시 작성하여 일부 매개변수와 가로채기를 설정할 수도 있습니다. 🎜🎜🎜🎜🎜내보내기 기능 변경 시작🎜🎜🎜기본 원리를 이해하고 Laravel-admin 설명서를 참조한 후 내보내기 기능 변경을 시작할 수 있습니다. 🎜🎜먼저 app/Admin/Extensions/PdfExporter.php와 같은 확장을 생성하면 코드는 다음과 같이 구현됩니다. 🎜rrreee🎜그런 다음 app/Admin/bootstrap.php에서 확장자를 등록하세요: 🎜rrreee🎜마지막으로 Grid 메서드에서 해당 확장자를 사용하세요: 🎜rrreee🎜이렇게 해서 내보내기 버튼을 클릭하면 PDF를 다운로드할 수 있습니다. 🎜🎜🎜🎜🎜Notes🎜🎜
    🎜블레이드 템플릿의 CSS 및 js 주소는 전체 URL 주소여야 하므로 mix('css/app.css')를 다음으로 변경해야 합니다. asset('css/app.css')
🎜🎜이미지 주소에 https 대신 http 프로토콜을 사용하는 것이 가장 좋습니다. 이는 오류가 덜 발생합니다🎜🎜🎜마지막으로 렌더링을 게시합니다.

위 내용은 Laravel snappy를 사용하여 PDF를 생성하고 Laravel-admin에 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제