Un servizio di generazione PDF con supporto nativo per ChartJS, sviluppato come Proof of Concept per Kalaway.
Questo servizio offre un'alternativa all'attuale architettura basata su Puppeteer, fornendo una soluzione più efficiente e scalabile per la generazione di report PDF con grafici. Utilizza tecnologie moderne come Express, Chart.js, e PDFKit per creare documenti PDF di alta qualità direttamente dal server, eliminando la necessità di un browser headless.
- Generazione di PDF in formato verticale (portrait) e orizzontale (landscape)
- Rendering nativo di grafici ChartJS (bar, line, pie, ecc.)
- Ottimizzazione delle immagini per migliorare le prestazioni
- API RESTful per integrazione con frontend esistenti
- Interfaccia di test HTML inclusa
- Node.js (versione 18.x o superiore)
- npm (versione 8.x o superiore)
-
Clona il repository:
git clone https://github.com/tuoUsername/pdf-generator-service.git cd pdf-generator-service -
Installa le dipendenze:
npm install
-
Compila il progetto TypeScript:
npm run build
Per avviare il server in modalità sviluppo con ricaricamento automatico:
npm run devPer avviare il server in modalità produzione:
npm startIl server sarà in ascolto sulla porta 3000 (o sulla porta specificata tramite la variabile d'ambiente PORT).
- Apri il file
test-client.htmlnel tuo browser - Usa i pulsanti "Genera PDF (Verticale)" o "Genera PDF (Orizzontale)" per testare il servizio
# Con PowerShell
Invoke-WebRequest -Uri "http://localhost:3000/api/pdf/generate" -Method Post -Headers @{"Content-Type"="application/json"} -Body (Get-Content -Raw -Path "test-data.json") -OutFile "report.pdf"# Con curl
curl -X POST -H "Content-Type: application/json" -d @test-data.json http://localhost:3000/api/pdf/generate --output report.pdf# Con PowerShell
Invoke-WebRequest -Uri "http://localhost:3000/api/pdf/generate-landscape" -Method Post -Headers @{"Content-Type"="application/json"} -Body (Get-Content -Raw -Path "test-data.json") -OutFile "report_landscape.pdf"# Con curl
curl -X POST -H "Content-Type: application/json" -d @test-data.json http://localhost:3000/api/pdf/generate-landscape --output report_landscape.pdfI report devono essere forniti in formato JSON con la seguente struttura:
{
"title": "Titolo del Report",
"author": "Nome Autore",
"charts": [
{
"type": "bar",
"title": "Titolo Grafico",
"labels": ["Etichetta1", "Etichetta2", "..."],
"datasets": [
{
"label": "Serie1",
"data": [valore1, valore2, ...],
"backgroundColor": "rgba(54, 162, 235, 0.5)",
"borderColor": "rgb(54, 162, 235)",
"borderWidth": 1
}
]
}
]
}pdf-generator-service/
├── src/ # Codice sorgente
│ ├── controllers/ # Controller Express
│ │ └── pdfController.ts
│ ├── models/ # Definizioni dei tipi di dati
│ │ └── reportModel.ts
│ ├── routes/ # Definizioni delle rotte API
│ │ └── pdfRoutes.ts
│ ├── services/ # Servizi di business logic
│ │ ├── chartService.ts
│ │ └── pdfService.ts
│ ├── utils/ # Utility
│ │ └── imageUtils.ts
│ └── app.ts # Entry point dell'applicazione
├── dist/ # Codice compilato (generato)
├── test-client.html # Client di test
├── test-data.json # Dati di esempio
├── tsconfig.json # Configurazione TypeScript
└── package.json # Dipendenze e script
Assicurati di aver installato tutte le dipendenze:
npm installLa porta 3000 è già in uso. Modifica la porta nel file src/app.ts o usa la variabile d'ambiente PORT.
Se riscontri problemi con Chart.js, assicurati di utilizzare le versioni corrette delle dipendenze nel package.json.