Как сгенерировать pdf в Laravel

laravel экспорт в pdf

Экспорт 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. Если вам понравился этот пост, пожалуйста, поделитесь им с другими.

Рейтинг
( 5 оценок, среднее 4.4 из 5 )
Максим Гречушников/ автор статьи
Мне 40 лет, и больше половины жизни я занимаюсь разработкой. За это время я работал с корпоративными системами, highload-проектами, интеграциями, платежными решениями, внутренними платформами и legacy-кодом, который пережил не одного разработчика. Некоторые системы, кажется, переживут и нас. Моя специализация — PHP, Laravel, backend-архитектура, DDD, тестирование, рефакторинг и техническое лидерство. Мне интересны задачи, где нужно соединить код, бизнес, данные, процессы и здравый смысл. Последние годы я много работаю с LLM и AI-инструментами: использую их для проектирования, анализа кода, документации, тестов, ревью, работы с legacy и построения инженерных процессов. Для меня LLM — это не замена разработчику, а усилитель для тех, кто умеет думать системно. В блоге я пишу о Laravel, PHP, архитектуре, тестировании, инженерной практике, управлении разработкой и реальном применении AI в работе программиста.
Понравилась статья? Поделиться с друзьями:
Комментарии: 3
  1. Алеща

    Еще один умник который забыл написать что с кирилицей этот пакет не работает….

  2. Максим Гречушников (автор)

    проблем не словил. все отлично работает с кириллицей

  3. Жавохир

    У меня тоже не работает место кирилица он поставляет ???? только

Комментарии закрыты.