barryvdh/laravel-snappy
Laravel wrapper for wkhtmltopdf and wkhtmltoimage, enabling fast HTML-to-PDF and HTML-to-image generation. Supports headers/footers, page options, and easy integration with views, files, and responses for downloads or storage.
## Getting Started
### Minimal Steps
1. **Installation**:
```bash
composer require barryvdh/laravel-snappy
php artisan vendor:publish --provider="Barryvdh\Snappy\SnappyServiceProvider" --tag="snappy-config"
Update config/snappy.php with the correct binary paths for your OS (e.g., /usr/local/bin/wkhtmltopdf for Linux/Mac or C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe for Windows).
Verify Binary Installation:
sudo apt-get install wkhtmltopdf or brew install wkhtmltopdf).PATH.wkhtmltopdf/wkhtmltopdf image or install in your container.First Use Case (PDF from Blade View):
use Barryvdh\Snappy\Facades\SnappyPdf;
public function generatePdf() {
return SnappyPdf::loadView('pdf.template', ['data' => $this->data])
->setOption('margin-top', '20mm')
->download('document.pdf');
}
Create a Blade template at resources/views/pdf/template.blade.php.
From Blade View:
SnappyPdf::loadView('invoices.pdf', ['invoice' => $invoice])
->setOption('page-size', 'A4')
->setOption('orientation', 'Portrait')
->stream('invoice.pdf');
From Raw HTML String:
$html = '<h1>Custom Report</h1><table>' . $tableData . '</table>';
SnappyPdf::loadHtml($html)
->setOption('encoding', 'UTF-8')
->save(storage_path("reports/custom.pdf"));
From URL:
SnappyPdf::loadUrl('https://example.com/report')
->setOption('allow', 'example.com')
->save(storage_path("reports/external.pdf"));
use Barryvdh\Snappy\Facades\SnappyImage;
SnappyImage::loadView('dashboard.preview', $data)
->setOption('width', 800)
->setOption('height', 600)
->download('dashboard_preview.png');
public function handle($data) {
$pdf = SnappyPdf::loadView('reports.detailed', $data)
->setOption('lowquality')
->getContent();
Storage::disk('s3')->put("reports/{$data['id']}.pdf", $pdf);
}
GenerateReportJob::dispatch($data)->onQueue('pdfs');
SnappyPdf::loadView('document')
->setOption('header-html', 'file://' . resource_path('views/partials/header.blade.php'))
->setOption('footer-html', 'file://' . resource_path('views/partials/footer.blade.php'))
->download('document.pdf');
Stream PDF:
return SnappyPdf::loadView('document', $data)
->stream('document.pdf', [
'Content-Disposition' => 'inline; filename="document.pdf"',
]);
Force Download:
return SnappyPdf::loadView('document', $data)
->download('document.pdf');
$pdf = Cache::remember("pdf_{$id}", now()->addHours(1), function () use ($id) {
return SnappyPdf::loadView('template', ['id' => $id])->getContent();
});
return response($pdf, 200)->header('Content-Type', 'application/pdf');
Global Options in config/snappy.php:
'pdf' => [
'binary' => env('WKHTMLTOPDF_BINARY', '/usr/local/bin/wkhtmltopdf'),
'options' => [
'margin-top' => '15mm',
'encoding' => 'UTF-8',
'no-outline',
],
],
Environment-Specific Overrides:
WKHTMLTOPDF_BINARY=/custom/path/wkhtmltopdf
WKHTMLTOIMAGE_BINARY=/custom/path/wkhtmltoimage
API Responses:
return SnappyPdf::loadView('view', $data)
->stream('document.pdf', [
'Content-Disposition' => 'attachment; filename="document.pdf"',
]);
Mail Attachments:
$pdf = SnappyPdf::loadView('email.template', $data)->getContent();
Mail::send([], [], function ($message) use ($pdf) {
$message->attachData($pdf, 'document.pdf', ['mime' => 'application/pdf']);
});
Storage Integration:
$pdf = SnappyPdf::loadView('view')->getContent();
Storage::disk('s3')->put("reports/{$id}.pdf", $pdf);
Binary Path Issues:
Binary not found or blank PDFs.config/snappy.php and ensure binaries are in PATH or use absolute paths.which wkhtmltopdf # Linux/Mac
where wkhtmltopdf # Windows
CSS/Font Rendering Problems:
src: url('/fonts/Roboto.ttf')).@font-face in Blade; embed fonts directly.--debug-js to identify rendering issues.Complex Layouts:
position: fixed or overflow: hidden elements may not render.setOption('enable-internal-links').Memory Limits:
Allowed memory exhausted for large PDFs.memory_limit in php.ini.setOption('lowquality') for drafts.Queue Failures:
wkhtmltopdf is installed in all environments.try {
// Generate PDF
} catch (\Exception $e) {
Log::error("PDF generation failed: " . $e->getMessage());
throw $e;
}
Headers/Footers Not Rendering:
Enable Debugging Options:
SnappyPdf::loadView('view')
->setOption('debug-js')
->setOption('enable-js')
->save('debug.pdf');
Test Binary Directly:
wkhtmltopdf --version
wkhtmltopdf input.html output.pdf
Check Logs:
SnappyPdf::loadView('view')
->setOption('quiet')
->save('output.pdf');
Dynamic Options:
$options = [
'margin-top' => '25mm',
'margin-right' => '20mm',
'margin-bottom' => '25mm',
'margin-left' => '20mm',
'header-center' => 'My Company',
'footer-center' => '[page]/[topage]',
];
SnappyPdf::loadView('view')->setOptions($options)->download('document.pdf');
Use Facades for Cleaner Code:
// Instead of:
$pdf = app('snappy.pdf')->loadView('view')->getContent();
// Use:
$pdf = SnappyPdf::loadView('view')->getContent();
**Leverage Laravel Mix for CSS/
How can I help you explore Laravel packages today?