如何使用Laravel snappy生成PDF并集成到Laravel-admin

2022-05-15 0 210

下面由Laravel教程栏目给大家介绍使用Laravel snappy生成PDF并集成到Laravel-admin的方法,希望对需要的朋友有所帮助!

如何使用Laravel snappy生成PDF并集成到Laravel-admin

Laravel snappy

之前使用过python+wkhtmltopdf来导出PDF,wkhtmltopdf确实是很强大的工具,有很多的页面定制选项,而且会自动帮你把网上的图片抓取下来,渲染到PDF上。这次想在Laravel-admin中实现导出PDF的功能,于是找到了Laravel snappy这个扩展包,它是对https://github.com/KnpLabs/snappy这个项目的封装,好巧的是,它也是通过调用wkhtmltopdf程序来生成PDF的。

安装与配置

// 安装扩展包composer require barryvdh/laravel-snappy// 将wkhtmltopdf作为composer依赖// 对于64位系统,使用:composer require h4cc/wkhtmltopdf-amd64 0.12.xcomposer require h4cc/wkhtmltoimage-amd64 0.12.x

对于homestead开发环境,还要执行:

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.configalias键设置facade别名(可选):

'PDF' => Barryvdh\\Snappy\\Facades\\SnappyPdf::class,'SnappyImage' => Barryvdh\\Snappy\\Facades\\SnappyImage::class,

最后发布资源文件:

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

.env文件中添加:

WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64WKHTML_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'     => [],    ],

使用

通过加载渲染blade模板生成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-admin导出原理简单分析

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

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中有:

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

如果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方法:

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

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

开始改造导出功能

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

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

<?phpnamespace 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了。

注意事项

blade模板中的css、js地址必须是完整的url地址,所以mix('css/app.css')应该改为asset('css/app.css')图片地址最好使用http协议代替https,比较不容易出错

最后,贴个效果图吧:

如何使用Laravel snappy生成PDF并集成到Laravel-admin

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 如何使用Laravel snappy生成PDF并集成到Laravel-admin https://www.jike1995.com/36239.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务