Как в Laravel сделать PDF файл из HTML

Зачастую необходимо генерировать какие-либо документы в веб-приложении в формте PDF, будь то отчет или какая-нибудь накладная. Причем удобно было бы сформировать HTML документ и перевести его в PDF.


В этом может помочь библиотека dompdf, и, особенно, враппер для Laravel barryvdh/laravel-dompdf. Установка и использование очень просты.

Для начала в нашем Laravel проекте необходимо выполнить команду загрузки враппера:

composer require barryvdh/laravel-dompdf

После установки необходимо изменить файл config/app.php, надо добавить новый сервис провайдер и фасад:

// Добавляем сервис провайдер в нужную секцию
Barryvdh\DomPDF\ServiceProvider::class,

// Добавляем фасад в нужную секцию
'PDF' => Barryvdh\DomPDF\Facade::class,

Ну и сделаем конфиг config/dompdf.php для данного врапера, в котором можно менять разные настройки:

php artisan vendor:publish

Непосредственное использование очень простое. Можно просто передать HTML код или использовать любой view. В файле контроллера необходимо добавить:

use PDF;

А формировать документ можно так:

public function generatePdf(Request $request)
{
    return PDF::loadHTML('<HTML>...</HTML>')->download();
}

Или так:

public function generatePdf(Request $request)
{
    return PDF::loadView('document')->download();
}

Чтобы отобразить документ в браузере а не выдавать на скачивание надо download() заменить на stream():

public function generatePdf(Request $request)
{
    return PDF::loadView('document')->stream();
}

Чтобы не было проблем с кириллицой, нужный шрифт надо указать в самом HTML документе, и, конечно же, такой шрифт должен быть в dompdf в папке /fonts. Шрифт DejaVu Sans в примере ниже в стандартной поставке есть:

//document.blade.php
<html>
    <head>
        <title>Viatcheslav Malakhov - CV</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
            body {
                font-family: 'DejaVu Sans', sans-serif;
            }
        </style>
    </head>
    <body>
        Привет!
    </body>
</html>