前言
之前的项目中,涉及一个生成 PDF 的需求,当时使用的框架是 Lumen。
调研
原本是想用官方网站上可以看到的 PDF 扩展的,发现使用之后有水印,直接放弃。(传送门 好像已经不能打开了)
之后考虑了一下,如果能像浏览器一样,将网页直接转换为 PDF,那该多好,省时省力。
搜索了一下,发现还蛮多。
但适合这个项目的都需要自己再封装一下,为了方便,检索了一下基于 Laravel 的包。
最终选定了 niklasravnsborg/laravel-pdf 传送门,这个项目是基于 mpdf 的封装。
在使用的时候,遇到了两个问题。
- 不兼容
Lumen - 中文乱码
问题解决
不兼容 Lumen
看了下源码,是配置获取的时候,Laravel 和 Lumen 的方式有所差异。
于是 Fork 了项目,并重写了 src/LaravelPdf/PdfServiceProvider.php@boot 和 src/LaravelPdf/PdfServiceProvider.php@register。
TIPS:有一些细节就不细说了,可以直接拿到项目里使用。imjcw/laravel-pdf
public function boot() {
if ($this->app instanceof \Laravel\Lumen\Application) { $this->app->configure(self::CONFIG_KEY); } else { $this->publishes([$this->configPath() => config_path('pdf.php')]); } }
public function register() {
$this->mergeConfigFrom($this->configPath(), 'pdf');
$this->app->bind('mpdf.wrapper', function($app) { return new PdfWrapper(config(self::CONFIG_KEY)); }); }
|
随后发布了 packagist,就在项目中引用了。
中文乱码
时间有点久,具体细节忘了,主要配置如下:
TIPS:这里的 stsong.ttf 是从网上下载来使用的。为了省事,所有的字体都是一个😂。
<?php
return [ 'mode' => '+aCJK', 'format' => 'A4', 'author' => 'John Doe', 'subject' => 'This Document will explain the whole universe.', 'keywords' => 'PDF, Laravel, Package, Peace', 'creator' => 'Laravel Pdf', 'display_mode' => 'fullpage', 'font_path' => base_path('resources/fonts'), 'font_data' => [ 'stsong' => [ 'R' => 'stsong.ttf', 'B' => 'stsong.ttf', 'I' => 'stsong.ttf', 'BI' => 'stsong.ttf' ] ], 'tempDir' => storage_path('app/public') ];
|
使用
Lumen 中 bootstrap/app.php 中添加下两行(最好添加到指定位置):
$app->configure('pdf'); $app->register(niklasravnsborg\LaravelPdf\PdfServiceProvider::class);
|
Laravel 中写入 Kernel.php 中就行。
真香!!!
app('mpdf.wrapper')->loadHTML($html)->save($filePath);
|
最后
了解工具,可以帮助我们更好的使用工具。
本文章观点仅代表个人立场,部分观点可能已过时,仅供参考。
本博客所有文章除特别声明外,均采用
CC BY-SA 4.0 协议,转载请注明出处!