Generare PDF dinamici con PHP e Laravel

In Laravel, la generazione di PDF dinamici è resa semplice da librerie come barryvdh/laravel-dompdf, che permettono di trasformare viste Blade in documenti PDF pronti da scaricare o visualizzare inline. In questo articolo vedremo come creare un endpoint REST in Laravel per produrre PDF con header, logo e testo dinamico.

Prerequisiti

Partendo da un progetto Laravel esistente, installa il pacchetto DomPDF:

composer require barryvdh/laravel-dompdf

Configurazione

Registra il service provider (nelle versioni recenti di Laravel viene fatto automaticamente) e pubblica il file di configurazione se necessario:

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

Creazione della vista Blade

In resources/views/report.blade.php crea il layout del PDF, includendo header, logo e testo:

<html>
<head>
    <style>
        body { font-family: DejaVu Sans, sans-serif; margin: 20px; }
        .header { display: flex; align-items: center; border-bottom: 1px solid #000; padding-bottom: 10px; margin-bottom: 20px; }
        .header img { height: 50px; margin-right: 20px; }
        .header h1 { margin: 0; font-size: 24px; }
        .date { text-align: right; font-size: 12px; }
    </style>
</head>
<body>
    <div class="header">
        <img src="{{ public_path('logo.png') }}" alt="Logo">
        <div>
            <h1>{{ $title }}</h1>
            <div class="date">{{ now()->format('d/m/Y') }}</div>
        </div>
    </div>

    @foreach($content as $paragraph)
        <p>{{ $paragraph }}</p>
    @endforeach
</body>
</html>

Creazione del controller

Genera un controller per gestire la creazione del PDF:

php artisan make:controller PDFController

Modifica il controller in app/Http/Controllers/PDFController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use PDF;

class PDFController extends Controller
{
    public function generate(Request $request)
    {
        $data = [
            'title' => $request->input('title', 'Documento'),
            'content' => $request->input('content', []),
        ];

        $pdf = PDF::loadView('report', $data);

        return $pdf->stream('custom-report.pdf');
    }
}

Definizione della rotta

Aggiungi la rotta in routes/web.php o routes/api.php:

use App\Http\Controllers\PDFController;

Route::post('/generate-pdf', [PDFController::class, 'generate']);

Test dell'endpoint

Puoi testare il servizio con un comando curl, salvando direttamente il PDF generato:

curl -X POST http://localhost:8000/generate-pdf \
-H "Content-Type: application/json" \
-d '{
  "title": "Report Mensile",
  "content": [
    "Benvenuto al nostro report mensile.",
    "Le vendite sono aumentate del 15% rispetto al mese scorso.",
    "Grazie per l’attenzione."
  ]
}' --output report.pdf

Considerazioni finali

Con Laravel e DomPDF è possibile generare PDF partendo da viste HTML Blade, offrendo grande flessibilità per il layout e la formattazione. Questo approccio consente di sfruttare appieno le potenzialità di HTML e CSS per creare documenti professionali, e può essere esteso con immagini, tabelle, intestazioni e piè di pagina complessi.

Torna su