daandekker/laravel-chrome-pdf

Generate PDFs in Laravel using headless Chrome. Full CSS support, no Node.js required.

Maintainers

Package info

github.com/DaanDekker/laravel-chrome-pdf

pkg:composer/daandekker/laravel-chrome-pdf

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-01-11 11:21 UTC

This package is auto-updated.

Last update: 2026-03-11 12:17:54 UTC


README

Generate PDFs in Laravel using headless Chrome. Full CSS support including Tailwind CSS, Flexbox, Grid, and modern web features.

Features

  • Full CSS support (Flexbox, Grid, Tailwind v4)
  • Real browser rendering engine
  • System fonts + Google Fonts
  • JavaScript support
  • Headers & footers with page numbers
  • Queued PDF generation

Requirements

  • PHP 8.2+
  • Laravel 11.0+ or 12.0+
  • Chrome/Chromium installed on the server

Installation

composer require daandekker/laravel-chrome-pdf

Optionally publish the configuration:

php artisan vendor:publish --tag=pdf-config

Configuration

Set the Chrome path in your .env:

PDF_CHROME_PATH=/usr/bin/chromium
PDF_TIMEOUT=60
PDF_STORAGE_DISK=local
PDF_STORAGE_PATH=pdfs

Common Chrome paths:

  • Linux: /usr/bin/chromium, /usr/bin/chromium-browser, /usr/bin/google-chrome
  • macOS: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
  • Windows: C:\Program Files\Google\Chrome\Application\chrome.exe
  • Docker (Alpine): /usr/bin/chromium-browser

Configuration File

// config/pdf.php
return [
    'chrome_path' => env('PDF_CHROME_PATH', '/usr/bin/chromium'),
    'timeout' => env('PDF_TIMEOUT', 60),
    'storage' => [
        'disk' => env('PDF_STORAGE_DISK', 'local'),
        'path' => env('PDF_STORAGE_PATH', 'pdfs'),
    ],
];

Usage

Basic Usage

use DaanDekker\ChromePdf\Facades\Pdf;

// From a Blade view
$pdf = Pdf::view('pdf.invoice', ['order' => $order]);

// From HTML string
$pdf = Pdf::html('<h1>Hello World</h1>');

Output Methods

// Download as attachment
return Pdf::view('pdf.invoice', $data)->download('invoice.pdf');

// Display inline in browser
return Pdf::view('pdf.invoice', $data)->stream('invoice.pdf');

// Save to file path
Pdf::view('pdf.invoice', $data)->save(storage_path('app/invoices/invoice.pdf'));

// Save to Laravel storage disk
Pdf::view('pdf.invoice', $data)->store('invoices/invoice.pdf', 's3');

// Get raw PDF content
$content = Pdf::view('pdf.invoice', $data)->output();

Page Settings

Pdf::view('pdf.invoice', $data)
    ->format('A4')              // A4, A3, Letter, Legal, Tabloid
    ->orientation('portrait')   // portrait, landscape
    ->landscape()               // Shorthand for landscape
    ->portrait()                // Shorthand for portrait
    ->margins(10, 10, 10, 10)   // top, right, bottom, left (mm)
    ->margin(15)                // Uniform margins (mm)
    ->scale(1.0)                // Scale factor (0.1 - 2.0)
    ->printBackground(true)     // Include CSS backgrounds
    ->download('invoice.pdf');

Headers & Footers

Pdf::view('pdf.invoice', $data)
    ->header('<div style="font-size: 10px; text-align: center;">Company Name</div>')
    ->footer('<div style="font-size: 10px; text-align: center;">Page <span class="pageNumber"></span> of <span class="totalPages"></span></div>')
    ->download('invoice.pdf');

Available footer/header variables: pageNumber, totalPages, date, title, url

Wait for JavaScript

// Wait for JS to complete (useful for charts/graphs)
Pdf::view('pdf.report', $data)
    ->waitFor(2000)  // milliseconds
    ->download('report.pdf');

Queued Generation

For large PDFs or background processing:

use DaanDekker\ChromePdf\Jobs\GeneratePdf;

GeneratePdf::dispatch(
    view: 'pdf.invoice',
    data: ['order' => $order],
    path: "invoices/order-{$order->id}.pdf",
    disk: 's3'  // optional, defaults to config value
);

Styling Tips

Using Tailwind CSS

Include Tailwind via CDN in your Blade template:

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="p-8">
    <h1 class="text-2xl font-bold">Invoice</h1>
    <!-- Your content -->
</body>
</html>

Page Breaks

<!-- Force page break before element -->
<div style="page-break-before: always;">New Page</div>

<!-- Prevent element from breaking across pages -->
<div style="page-break-inside: avoid;">Keep together</div>

Print-Specific Styles

@media print {
    .no-print { display: none; }
    .print-only { display: block; }
}

API Reference

Pdf Facade Methods

Method Description
view(string $view, array $data = []) Create PDF from Blade view
html(string $html) Create PDF from HTML string

PdfBuilder Methods

Method Description
format(string $format) Set page format (A4, Letter, etc.)
orientation(string $orientation) Set orientation (portrait/landscape)
landscape() Set landscape orientation
portrait() Set portrait orientation
margins(int $top, $right, $bottom, $left) Set margins in mm
margin(int $margin) Set uniform margins
scale(float $scale) Set scale (0.1 - 2.0)
printBackground(bool $print = true) Enable/disable CSS backgrounds
header(string $html) Set header HTML
footer(string $html) Set footer HTML
waitFor(int $ms) Wait for JS (milliseconds)
save(string $path) Save to file path
store(string $path, ?string $disk) Save to storage disk
output() Get PDF as string
download(string $filename) Return download response
stream(string $filename) Return inline response

License

MIT License. See LICENSE for details.