· 9 min di lettura
Generare fatture PDF in PHP (Yii2 / Laravel) via REST API
Sposta il rendering PDF su QuartzAPI: la tua app Yii2 o Laravel invia solo il JSON della fattura via REST e restituisce il PDF al browser.
Generare fatture PDF in PHP con librerie tradizionali come mPDF o Dompdf comporta spesso un alto consumo di memoria sul server, layout CSS fragili e costi di manutenzione continui.
Spostando il rendering su QuartzAPI, la tua applicazione PHP esegue solo una POST HTTP leggera con un payload JSON dei dati fattura. Il layout resta nel Visual Builder; il codice Yii2 o Laravel si concentra sui dati di business.
Prerequisiti
- PHP 7.4+ o 8.x
- Account QuartzAPI e API key
-
Un template attivo creato nel Visual Builder QuartzAPI
(es.
INVOICE_V1) -
Opzionale: HTTP client Laravel, oppure
yiisoft/yii2-httpclientin Yii2
Fase 1: prepara il payload JSON
Che tu recuperi i dati da Eloquent (Laravel) o Active Record (Yii2), strutturarli in un array associativo
allineato ai placeholder del template. QuartzAPI si aspetta i dati in data, in genere con
un oggetto master e le righe in master.items.
<?php
$invoiceData = [
'templateCode' => 'INVOICE_V1',
'outputFormat' => 'pdf',
'externalId' => 'INV-2026-0042',
'data' => [
'master' => [
'invoice_number' => 'INV-2026-0042',
'date' => date('Y-m-d'),
'customer_name' => 'Acme Corporation',
'customer_vat' => 'US123456789',
'customer_email' => 'billing@acme.com',
'subtotal' => 1090.00,
'tax' => 239.80,
'grand_total' => 1329.80,
'items' => [
[
'description' => 'Web Development Services',
'quantity' => 10,
'price' => 85.00,
'total' => 850.00,
],
[
'description' => 'Cloud Hosting (Annual)',
'quantity' => 1,
'price' => 240.00,
'total' => 240.00,
],
],
],
],
];
I nomi dei campi devono coincidere con i binding del template. Per il pattern JSON→PDF in generale, vedi Come generare fatture in PDF da JSON.
Fase 2: implementazione in Laravel
Usa l’HTTP client di Laravel (Illuminate\Support\Facades\Http) per chiamare
generate-document, scaricare il PDF e restituirlo al browser.
Salva la API key in config/services.php (es. services.quartzapi.key).
Esempio controller (InvoiceController.php):
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;
class InvoiceController extends Controller
{
public function downloadPdf(int $invoiceId)
{
// 1. Costruisci il payload dal model Eloquent (qui semplificato)
$payload = [
'templateCode' => 'INVOICE_V1',
'outputFormat' => 'pdf',
'externalId' => 'INV-2026-0042',
'data' => [
'master' => [
'invoice_number' => 'INV-2026-0042',
'grand_total' => 1329.80,
// … altri attributi / items …
'items' => [],
],
],
];
// 2. Genera il documento
$generate = Http::withHeaders([
'Authorization' => 'Bearer ' . config('services.quartzapi.key'),
'Content-Type' => 'application/json',
])->post('https://backend.quartzapi.com/index.php?r=api/v1-jobs/generate-document', $payload);
if ($generate->failed()) {
return back()->with('error', 'Generazione PDF fallita.');
}
$documentId = $generate->json('result.documentId');
$downloadUrl = $generate->json('result.downloadUrl')
?: 'https://backend.quartzapi.com/index.php?r=api/v1-documents/download&uid=' . urlencode((string) $documentId);
// 3. Scarica i byte PDF
$pdf = Http::withHeaders([
'Authorization' => 'Bearer ' . config('services.quartzapi.key'),
])->get($downloadUrl);
if ($pdf->failed()) {
return back()->with('error', 'Download PDF fallito.');
}
// 4. Download nel browser
return response($pdf->body(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="Invoice-2026-0042.pdf"',
]);
}
}
Fase 3: implementazione in Yii2
In Yii2 puoi usare yii\httpclient\Client (o cURL) in un’action del controller.
Tieni la API key in params (es. Yii::$app->params['quartzApiKey']).
Esempio controller (InvoiceController.php):
<?php
namespace app\controllers;
use Yii;
use yii\httpclient\Client;
use yii\web\Controller;
use yii\web\ServerErrorHttpException;
class InvoiceController extends Controller
{
public function actionDownloadPdf($id)
{
$payload = [
'templateCode' => 'INVOICE_V1',
'outputFormat' => 'pdf',
'externalId' => 'INV-2026-0042',
'data' => [
'master' => [
'invoice_number' => 'INV-2026-0042',
'grand_total' => 1329.80,
'items' => [],
],
],
];
$client = new Client();
$generate = $client->createRequest()
->setMethod('POST')
->setUrl('https://backend.quartzapi.com/index.php?r=api/v1-jobs/generate-document')
->addHeaders([
'Authorization' => 'Bearer ' . Yii::$app->params['quartzApiKey'],
'Content-Type' => 'application/json',
])
->setContent(json_encode($payload))
->send();
if (!$generate->isOk) {
throw new ServerErrorHttpException('Servizio di rendering PDF non disponibile.');
}
$body = $generate->data;
$documentId = $body['result']['documentId'] ?? '';
$downloadUrl = $body['result']['downloadUrl']
?? ('https://backend.quartzapi.com/index.php?r=api/v1-documents/download&uid=' . rawurlencode($documentId));
$pdf = $client->createRequest()
->setMethod('GET')
->setUrl($downloadUrl)
->addHeaders([
'Authorization' => 'Bearer ' . Yii::$app->params['quartzApiKey'],
])
->send();
if (!$pdf->isOk) {
throw new ServerErrorHttpException('Download PDF fallito.');
}
return Yii::$app->response->sendContentAsFile(
$pdf->content,
'Invoice-2026-0042.pdf',
['mimeType' => 'application/pdf', 'inline' => true]
);
}
}
Vantaggi rispetto a mPDF / Dompdf
- Zero overhead RAM sui tuoi server applicativi: la memoria resta prevedibile indipendentemente dalla dimensione del documento — il rendering avviene su QuartzAPI.
- Niente workaround CSS: il layout vive nell’editor drag-and-drop, non in stringhe HTML PHP.
- Aggiornamenti di design immediati: cambia intestazioni, font o colonne senza deploy.
| Approccio | Ownership del layout | Carico sul server app |
|---|---|---|
| mPDF / Dompdf in-app | PHP / HTML nel repository | Alto (CPU + RAM per PDF) |
| QuartzAPI REST | Visual Builder cloud | Una chiamata HTTP + stream |
Conclusioni
Per i team Yii2 e Laravel, le fatture PDF devono essere un problema di dati, non di layout.
Chiama generate-document, scarica il file e consegna il PDF — mentre i designer
aggiornano i template nel portale.
Pronto a togliere mPDF dallo stack? QuartzAPI è in Beta pubblica: crea un account gratuito, ottieni la API key e collega gli esempi al tuo controller fatture.
Snippet pronti
- Endpoint:
POST https://backend.quartzapi.com/index.php?r=api/v1-jobs/generate-documentcontemplateCode+data. - Header auth:
Authorization: Bearer YOUR_API_KEY. - Download: usa
result.downloadUrloppureGET …/v1-documents/download&uid=…. - Riferimento completo: Documentazione Web API.