Экспорт PDF на сайте достаточно редкая,но важная функция. Нам нужен PDF-файл списка клиентов, счета-фактуры, баланса или любого другого отчета с данными. С помощью пакета Laravel и barryvdh/laravel-dompdf мы можем легко генерировать динамические PDF-файлы из нашего приложения. DomPDF может сгенерировать HTML в PDF, он также поддерживает CSS 2.1. Пакет laravel dompdf – это пакет-оболочка пакета PHP Dompdf. С его помощью мы можем легко конвертировать наше представление в PDF. В этом посте я покажу вам пошаговый процесс создания PDF-файла в приложении Laravel с помощью пакета barryvdh/laravel-dompdf на примере списка клиентов.
В этом посте нет конкретной версии Laravel. Тут и ларавел даже не особо требуется. С помощью этого пакета можно в любом фреймворке и без генерировать PDF.
Шаг 01: установите пакет barryvdh/laravel-dompdf.
composer require barryvdh/laravel-dompdf
Добавьте сервис провайдер в config/app.php
Barryvdh\DomPDF\ServiceProvider::class,
Там же в aliases
'PDF' => Barryvdh\DomPDF\Facade::class,
Шаг 02: создайте модель клиента.
php artisan make:model Customer -m
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model {
public $fillable = ['name', 'email', 'phone', 'dob'];
}
Шаг 03: миграция
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCustomersTable extends Migration
{
public function up()
{
Schema::create('customers', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email');
$table->string('phone');
$table->string('dob');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('customers');
}
}
Шаг 04: определите маршрут.
Route::get('admin/customers','CustomerController@index');
Шаг 05: сделайте контроллер клиента.
php artisan make:controller CustomerController
Теперь выполните код для отображения отчета и создания PDF-файла этого отчета.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Customer;
use PDF;
class CustomerController extends Controller
{
public function index(Request $request)
{
$data = Customer::all();
if ($request->has('export')) {
if ($request->get('export') == 'pdf') {
$pdf = PDF::loadView('customers.index-pdf', compact('data'));
return $pdf->download('customer-list.pdf');
}
}
return view('customers.index', compact('data'));
}
}
Как видите, у нас 2 шаблона. 1 используется для обычного отображения списка клиентов. Второй используется для генерации pdf
Шаг 6: представление для списка клиентов и ссылка на экспорт в пдф
@extends('admin.template')
@section('content')
<div class="container mt-5">
<div class="d-flex justify-content-between mb-2">
<p><strong>Customer List</strong></p>
<a class="btn btn-primary" href="{{ url('admin/customers?export=pdf') }}">Export to PDF</a>
</div>
<table class="table table-bordered mb-5">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">E-mail</th>
<th scope="col">Phone</th>
<th scope="col">DOB</th>
</tr>
</thead>
<tbody>
@foreach($data as $row)
<tr>
<td>{{ $row->name }}</td>
<td>{{ $row->email }}</td>
<td>{{ $row->phone }}</td>
<td>{{ $row->dob }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
Шаблон представление для pdf
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Laravel PDF</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
<h2 class="mb-3">Customer List</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>E-mail</th>
<th>Phone</th>
<th>DOB</th>
</tr>
</thead>
<tbody>
@foreach ($data as $row)
<tr>
<td>{{ $row->name }}</td>
<td>{{ $row->email }}</td>
<td>{{ $row->phone }}</td>
<td>{{ $row->dob }}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>
Надеюсь, этот пошаговый учебник поможет вам узнать, как генерировать динамически PDF-файл в рамках Laravel. Если вам понравился этот пост, пожалуйста, поделитесь им с другими.
Еще один умник который забыл написать что с кирилицей этот пакет не работает….
проблем не словил. все отлично работает с кириллицей
У меня тоже не работает место кирилица он поставляет ???? только