Generowanie PDF jest decyzją o renderowaniu i operacjach, nie konkursem popularności paczek.
| Potrzeba | Domyślny wybór | Kompromis |
|---|---|---|
| Proste faktury i tabele | Dompdf | Ograniczony nowy CSS |
| HTML/CSS jakości przeglądarki | spatie/laravel-pdf + Browsershot | Runtime Node i Chrome |
| Wspólny Chrome lub konwersja Office | Gotenberg | Utrzymywana usługa HTTP |
Dompdf jest opcją bez dodatkowej usługi dla prostych dokumentów. Dla layoutów produktu spatie/laravel-pdf to nowoczesny domyślny wybór Laravela, gdy dostępny jest Chrome. Gotenberg przenosi Chromium lub LibreOffice za prywatną granicę HTTP, co pasuje do wielu aplikacji i formatów biurowych.
<?php
declare(strict_types=1);
use Spatie\LaravelPdf\Facades\Pdf;
return Pdf::view('pdf.invoice', ['invoice' => $invoice])->format('a4')->download();
Renderuj zaufane template'y z zaufanymi danymi, nie dowolny HTML. Allowlistuj hosty i blokuj prywatne zakresy, jeśli renderer pobiera URL, inaczej powstaje SSRF. Kosztowne PDF umieść w kolejce, przechowuj prywatnie, autoryzuj pobranie i zapisuj czas, wersję template oraz błędy. Test wizualnego fixture wykrywa regresję layoutu, której nie wykryje 200.
Wybór i wydajność renderera
| Potrzeba | Wybór | Granica |
|---|---|---|
| Prosta faktura | Dompdf | PHP-only, ograniczony CSS |
| Nowoczesny layout | spatie/laravel-pdf | Utrzymywany Chromium |
| Wspólny renderer | Gotenberg | Prywatny HTTP i health checki |
Dompdf nie stanie się przeglądarką przez obejścia CSS. Browsershot wymaga Chrome, a Gotenberg wymaga prywatnej sieci i capacity planning.
<?php
declare(strict_types=1);
use App\\Models\\Invoice;
use Barryvdh\\DomPDF\\Facade\\Pdf;
use Illuminate\\Http\\Response;
final class DownloadInvoiceController
{
public function __invoke(Invoice $invoice): Response
{
$this->authorize('view', $invoice);
return Pdf::loadView('pdf.invoices.show', ['invoice' => $invoice])->setPaper('a4')->download("invoice-{$invoice->number}.pdf");
}
}
Kolejkuj dokumenty wsadowe, ogranicz współbieżność do renderera i zapisuj wynik prywatnie po autoryzacji. Wersjonowany fixture wizualny wykrywa layout, czego nie dowodzi 200.
Kiedy tego NIE używać
Nie uruchamiaj headless Chrome synchronicznie w checkout. Nie dodawaj Gotenberg dla jednej prostej faktury, jeśli wystarcza Dompdf, i nie walcz z Dompdf dniami, gdy wymagany jest CSS przeglądarki. Wybierz najmniejszy system spełniający fidelity, throughput i odtwarzanie.