Installation Add the package via Composer:
composer require carlos-meneses/laravel-mpdf
Publish the config file (optional but recommended for customization):
php artisan vendor:publish --provider="CarlosMeneses\Mpdf\MpdfServiceProvider" --tag="config"
Basic Usage Generate a PDF from a Blade view:
use CarlosMeneses\Mpdf\Facades\Mpdf;
$pdf = Mpdf::loadView('pdf.template', ['data' => $yourData]);
return $pdf->stream('document.pdf'); // Stream to browser
// OR
return $pdf->download('document.pdf'); // Force download
Quick Example
Create a Blade template (resources/views/pdf/template.blade.php):
<h1>{{ $data['title'] }}</h1>
<p>{{ $data['content'] }}</p>
Trigger PDF generation in a controller:
public function generatePdf() {
return Mpdf::loadView('pdf.template', ['title' => 'Hello', 'content' => 'World!'])
->stream('output.pdf');
}
Dynamic PDF Generation Pass dynamic data to Blade views:
$pdf = Mpdf::loadView('invoice', ['user' => $user, 'items' => $items]);
Reusing PDF Logic Create a service class for reusable PDF generation:
class PdfGenerator {
public function generateInvoice($user, $items) {
return Mpdf::loadView('invoice', compact('user', 'items'))
->setPaper('A4', 'portrait')
->setCss('public/css/pdf.css');
}
}
Custom Headers/Footers
Use setHeader() and setFooter():
$pdf = Mpdf::loadView('report')
->setHeader('Header Text')
->setFooter('Page {PAGENO} of {nb}');
HTML-to-PDF Conversion Convert raw HTML strings:
$html = '<h1>Dynamic Content</h1><p>' . $dynamicText . '</p>';
return Mpdf::loadHtml($html)->stream('dynamic.pdf');
PDF Merging Combine multiple PDFs:
$pdf1 = Mpdf::loadView('page1');
$pdf2 = Mpdf::loadView('page2');
$merged = Mpdf::merge([$pdf1->getContent(), $pdf2->getContent()]);
return $merged->stream('merged.pdf');
Storing PDFs Save PDFs to storage:
$pdf = Mpdf::loadView('document');
$path = storage_path('app/documents/example.pdf');
file_put_contents($path, $pdf->getContent());
GeneratePdfJob::dispatch($userId, $template)->onQueue('pdfs');
Notification::route('mail', $user->email)
->notify(new InvoicePaid($invoice, $pdfPath));
return response($pdf->getContent(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="report.pdf"',
]);
CSS Issues
setCss() for custom stylesheets.Memory Limits
memory_limit in php.ini or optimize Blade templates.Font Problems
setFont() or add fonts via config/mpdf.php:
'fontdir' => [public_path('fonts'), __DIR__.'/fonts'],
Blade Directives
@stack) may not work as expected.Caching
php artisan mpdf:clear-cache
Mpdf::loadHtml($html)->output() to debug rendering.config/mpdf.php:
'mode' => 'utf-8',
'log' => true,
'log_file' => storage_path('logs/mpdf.log'),
config/mpdf.php settings (e.g., default_font, format).Custom MPDF Class Extend the MPDF class for reusable settings:
namespace App\Services;
use CarlosMeneses\Mpdf\Mpdf;
class CustomMpdf extends Mpdf {
public function __construct() {
parent::__construct();
$this->setDefaultFont('dejavusans');
$this->setPaper('A4', 'portrait');
}
}
Register the binding in AppServiceProvider:
$this->app->bind(Mpdf::class, function () {
return new CustomMpdf();
});
Middleware for PDFs Add auth/validation middleware to PDF routes:
Route::get('/pdf/invoice', function () {
return Mpdf::loadView('invoice', ['user' => auth()->user()]);
})->middleware('auth');
Event Listeners Trigger events for PDF generation (e.g., logging):
Mpdf::event('generating', function ($pdf) {
Log::info('Generating PDF', ['template' => $pdf->getView(), 'user' => auth()->id()]);
});
How can I help you explore Laravel packages today?