В любой нормальной системе рано или поздно прилетает задача: "сделай кнопку скачать 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-машины с отчётами и договорами — самое оно.
0 комментариев