使用laravel-snappy生成pdf
laravel-snappy 基于 wkhtmltopdf 工具,可以比较完美的将 web 页面转成 pdf 格式。
安装过程
顺便把 laravel 及 laravel-snappy 安装过程记录下
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer create-project laravel/laravel example-app
composer require barryvdh/laravel-snappy
php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
config/app.php 'aliases'项加上
'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
使用
$pdf = PDF::loadView('pdf.invoice', $data);
$pdf->setPaper('a4')->setOption('encoding', 'utf-8')->setOption('margin-left', 0)->setOption('margin-right', 0)
->setOption('javascript-delay', 10000)->setOption('no-stop-slow-scripts', true);
$pdf->save($path)
//return $pdf->download('invoice.pdf');
用于调整生成 pdf 格式的 css 属性
.keep-together {
page-break-inside: avoid;
}
.break-before {
page-break-before: always;
}
.break-after {
page-break-after: always;
}
使用 laravel 的 command 定时生成 pdf
php artisan make:command pdf
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\PdfService;
class Pdf extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'pdf {name}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'pdf';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$name = $this->argument('name');
$service = new PdfService();
$service->pdf($name);
$this->info('The command was successful!');
}
}
调试
// 方法1
use Illuminate\Support\Facades\Artisan;
Route::post('/pdf/{name}', function ($name) {
$exitCode = Artisan::call('pdf', [
'name' => $name
]);
});
或者 php artisan pdf 'aa'
重要提示
wkhtmltopdf 工具生成 pdf 的底层是使用 QT 浏览器,不支持 es6 等比较新的语法及新增的函数方法,使用这些语法会导致解析错误,不能生成 pdf。也不支持 css3 样式属性。
浙公网安备 33010602011771号