barryvdh/laravel-dompdf
Laravel wrapper for DOMPDF that makes generating PDFs from Blade views straightforward. Supports streaming or downloading, paper size/orientation options, and basic HTML/CSS rendering—ideal for invoices, reports, and other server-side PDF output in Laravel apps.
Installation:
composer require barryvdh/laravel-dompdf
Publish the config (if needed):
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" --tag=config
First Use Case: Generate a PDF from a Blade view:
use Barryvdh\DomPDF\Facade\Pdf;
$pdf = Pdf::loadView('pdf.invoice');
return $pdf->download('invoice.pdf');
Key Files:
config/dompdf.php (published config)app/Providers/AppServiceProvider.php (registers the service provider)resources/views/pdf/*.blade.php (Blade templates for PDFs)Loading Content:
// From a Blade view
Pdf::loadView('pdf.report', ['data' => $reportData]);
// From a string
Pdf::loadHtml('<h1>Hello World</h1>');
// From a URL (if enabled)
Pdf::load('https://example.com');
Output Methods:
// Download
return Pdf::loadView('pdf.invoice')->download('invoice.pdf');
// Stream to browser
return Pdf::loadHtml('<h1>Streamed PDF</h1>')->stream('streamed.pdf');
// Save to file
$pdf = Pdf::loadView('pdf.letter');
$pdf->save(storage_path('app/letter.pdf'));
// Return as response
return Pdf::loadHtml('<h1>Inline PDF</h1>')->setOption('isHtml5ParserEnabled', true);
Dynamic Options:
// Set options per instance
$pdf = Pdf::loadView('pdf.document')
->setOption('defaultFont', 'Arial')
->setOption('isRemoteEnabled', true)
->setOption('isPhpEnabled', true);
// Magic methods (Dompdf 2+)
$pdf->setPaper('A4', 'portrait');
$pdf->setPageSize('A4');
Reusable PDF Services:
// In a service class
class PdfService {
public function generateInvoice($user) {
return Pdf::loadView('pdf.invoices.invoice', compact('user'))
->setOption('defaultFontSize', 10)
->setOption('isHtml5ParserEnabled', true);
}
}
Blade Integration:
// In a controller
public function generateReport() {
return Pdf::loadView('reports.detailed', [
'report' => $this->generateReportData(),
'logo' => asset('images/logo.png')
])->download('report.pdf');
}
Queueing PDF Generation:
// Dispatch a job
GeneratePdfJob::dispatch($user, 'pdf.invoice');
// Job implementation
public function handle() {
$pdf = Pdf::loadView('pdf.invoice', ['user' => $this->user])
->setOption('isRemoteEnabled', true);
Storage::put('pdfs/' . $this->filename, $pdf->output());
}
Remote Content Security:
enable_remote is false by default in v3.x. Explicitly enable with:
Pdf::setOption('isRemoteEnabled', true);
allowedRemoteHosts in config/dompdf.php if needed.Data URIs:
data:// in allowed_protocols if using data URIs (e.g., base64 images). Update config:
'allowed_protocols' => ['http', 'https', 'ftp', 'ftps', 'data'],
Font Issues:
@font-face in CSS. Common fix:
Pdf::setOption('defaultFont', 'DejaVu Sans');
CSS Limitations:
Pdf::setOption('isHtml5ParserEnabled', true);
Memory Limits:
memory_limit or optimize HTML/CSS.Deprecated Methods:
setOptions() (use setOption() for granular control).orientation config is deprecated; use default_paper_orientation.Inspect Generated HTML:
$html = view('pdf.template', $data)->render();
$pdf = Pdf::loadHtml($html);
Log $html to debug rendering issues.
Check Dompdf Logs: Enable logging in config:
'log_output' => true,
'log_errors' => true,
View logs in storage/logs/laravel.log.
Validate Config: After publishing config, verify:
config('dompdf.options');
Cache Fonts:
Pdf::setOption('font_cache', storage_path('fonts'));
Disable Unused Features:
Pdf::setOption('isPhpEnabled', false);
Pdf::setOption('isJavascriptEnabled', false);
Stream Directly: Avoid saving to disk for large files:
return Pdf::loadHtml($html)->stream('large-report.pdf');
Custom Dompdf Class:
Bind a custom Dompdf class in AppServiceProvider:
$this->app->bind('dompdf.wrapper', function ($app) {
$dompdf = new \Barryvdh\DomPDF\Dompdf();
$dompdf->setOption('defaultFont', 'YourFont');
return $dompdf;
});
Middleware for PDFs: Add headers or auth checks:
Pdf::getDompdf()->setHttpContext([
'headers' => [
'User-Agent' => 'Laravel-Dompdf',
],
]);
Event Listeners: Hook into PDF generation:
Pdf::getDompdf()->listen('start_document', function ($dompdf) {
$dompdf->setPaper('A4', 'landscape');
});
Testing:
Use Pdf::loadHtml() in tests:
$pdf = Pdf::loadHtml('<h1>Test</h1>');
$this->assertStringContainsString('Test', $pdf->output());
How can I help you explore Laravel packages today?