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.