Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Mpdf Laravel Package

carlos-meneses/laravel-mpdf

View on GitHub
Deep Wiki
Context7

Getting Started

First Steps

  1. 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"
    
  2. 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
    
  3. 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');
    }
    

Implementation Patterns

Common Workflows

  1. Dynamic PDF Generation Pass dynamic data to Blade views:

    $pdf = Mpdf::loadView('invoice', ['user' => $user, 'items' => $items]);
    
  2. 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');
        }
    }
    
  3. Custom Headers/Footers Use setHeader() and setFooter():

    $pdf = Mpdf::loadView('report')
        ->setHeader('Header Text')
        ->setFooter('Page {PAGENO} of {nb}');
    
  4. HTML-to-PDF Conversion Convert raw HTML strings:

    $html = '<h1>Dynamic Content</h1><p>' . $dynamicText . '</p>';
    return Mpdf::loadHtml($html)->stream('dynamic.pdf');
    
  5. 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');
    
  6. Storing PDFs Save PDFs to storage:

    $pdf = Mpdf::loadView('document');
    $path = storage_path('app/documents/example.pdf');
    file_put_contents($path, $pdf->getContent());
    

Integration Tips

  • Laravel Queues: Dispatch PDF generation jobs for async processing:
    GeneratePdfJob::dispatch($userId, $template)->onQueue('pdfs');
    
  • Laravel Notifications: Attach PDFs to notifications:
    Notification::route('mail', $user->email)
        ->notify(new InvoicePaid($invoice, $pdfPath));
    
  • API Responses: Return PDFs as API responses:
    return response($pdf->getContent(), 200, [
        'Content-Type' => 'application/pdf',
        'Content-Disposition' => 'attachment; filename="report.pdf"',
    ]);
    

Gotchas and Tips

Pitfalls

  1. CSS Issues

    • MPDF has limited CSS support. Use its built-in CSS or inline styles.
    • Fix: Avoid complex layouts; test with setCss() for custom stylesheets.
  2. Memory Limits

    • Large PDFs may hit PHP memory limits.
    • Fix: Increase memory_limit in php.ini or optimize Blade templates.
  3. Font Problems

    • Custom fonts require manual installation in MPDF.
    • Fix: Use setFont() or add fonts via config/mpdf.php:
      'fontdir' => [public_path('fonts'), __DIR__.'/fonts'],
      
  4. Blade Directives

    • Some Blade directives (e.g., @stack) may not work as expected.
    • Fix: Use raw PHP or simplify Blade logic.
  5. Caching

    • MPDF caches compiled templates. Clear cache if changes aren’t reflected:
      php artisan mpdf:clear-cache
      

Debugging Tips

  • Inspect HTML: Use Mpdf::loadHtml($html)->output() to debug rendering.
  • Log Errors: Enable MPDF error logging in config/mpdf.php:
    'mode' => 'utf-8',
    'log' => true,
    'log_file' => storage_path('logs/mpdf.log'),
    
  • Check Config: Validate config/mpdf.php settings (e.g., default_font, format).

Extension Points

  1. 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();
    });
    
  2. Middleware for PDFs Add auth/validation middleware to PDF routes:

    Route::get('/pdf/invoice', function () {
        return Mpdf::loadView('invoice', ['user' => auth()->user()]);
    })->middleware('auth');
    
  3. 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()]);
    });
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope