В любой нормальной системе рано или поздно прилетает задача: "сделай кнопку скачать PDF". Счёт, отчёт, коммерческое предложение — не важно. И ты либо сидишь с костылями, генеря HTML и отдавая его как будто это PDF, либо берёшь готовый пакет и не паришься.

Для Laravel есть  — barryvdh/laravel-dompdf. Под капотом он юзает dompdf/dompdf, но в удобной обёртке. И всё, что тебе реально нужно — установить пакет и дернуть PDF::loadView().

Установка

Без магии, через Composer:

composer require barryvdh/laravel-dompdf

Хочешь ковыряться в настройках — публикуешь конфиг:

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" 

Файл свалится в config/dompdf.php. Обычно туда лезут только если надо что-то подкрутить, вроде путей к шрифтам или DPI.

Генерация PDF из Blade

У тебя есть Blade-шаблон — значит, PDF уже почти готов. Пример:

use PDF;

class InvoiceController extends Controller
{
    public function downloadInvoice($invoiceId)
    {
        $invoice = Invoice::findOrFail($invoiceId);

        $pdf = PDF::loadView('invoices.download', compact('invoice'));

        return $pdf->download("invoice-{$invoice->id}.pdf");
    }
}

Тут invoices.download — обычный Blade, где ты выводишь всё, как обычно в HTML. Dompdf сам превратит его в PDF.

Маршрут

Ну и не забудь маршрут:

Route::get('/invoice/{invoiceId}/download', [InvoiceController::class, 'downloadInvoice']);

На что обратить внимание

  • Шрифты. Dompdf иногда тупит на кастомных шрифтах. Решение — либо подключать только стандартные, либо ковырять конфиг.
  • CSS. Поддержка не идеальная, забудь про всякие flex и grid. Старый добрый таблицы+inline CSS — работают всегда.
  • Тяжёлые шаблоны. Если вьюха огромная, рендер будет жрать память и время. Иногда проще резать документ на части.

Итог

PDF в Laravel — штука нужная, но не обольщайся: barryvdh/laravel-dompdf — это не серебряная пуля. Для простых счетов и актов сойдёт. Но как только захочешь пихнуть туда кастомные шрифты, flex или что-то сложнее таблиц — готовься материться.

Dompdf живёт в 2010-х, он хочет таблицы, простенький CSS и никаких выёбонов. Забудь про современную вёрстку — и будет тебе счастье.

Так что да, генерить PDF из Blade реально в пару строк. Но если клиент завтра скажет: "а сделай мне диаграмму с градиентами и шрифтами Google Fonts", то либо шлёшь его лесом, либо сразу смотришь в сторону wkhtmltopdf или puppeteer.

И если вдруг тебе мало и ты реально строишь сервис, где нужно пачками гонять PDF не только из Blade, но и из Word/Excel/Markdown — тогда смотри в сторону Gotenberg. Это уже не библиотека, а сервис в Docker с Chromium и LibreOffice под капотом. Кидаешь ему HTML или .docx, получаешь PDF. Работает как танк, но требует поднять отдельный контейнер и жить в микросервисной логике. Для "одной кнопки скачать счёт" — оверкилл, для SaaS-машины с отчётами и договорами — самое оно.