Un microservice basé sur Symfony 7.2 pour générer des PDFs à partir de contenu HTML en utilisant Chrome Headless. Le projet inclut également une application de démonstration en Next.js 15 permettant de générer des bulletins météo en PDF.
- PHP 8.2+
- Symfony 7.2
- FrankenPHP
- Chrome Headless (browserless/chrome)
- Architecture Hexagonale
- Docker & Docker Compose
- Next.js 15 (application de démo)
- Bun (runtime JavaScript)
Le projet suit une architecture hexagonale (Ports & Adapters) avec la structure suivante :
src/
├── Application/ # Use cases
│ ├── Command/ # CQRS Commands
│ └── Handler/ # Command Handlers
├── Domain/ # Business core
│ ├── Entity/ # Domain Entities
│ ├── Port/ # Interfaces
│ └── ValueObject/ # Value Objects
└── Infrastructure/ # External adapters
├── Adapter/ # Implementation of ports
└── Controller/ # API Controllers
- Docker
- Docker Compose
- Make (optionnel)
- Cloner le repository :
git clone https://github.com/offroadlabs/pdf-service.git
cd pdf-service
- Créer le fichier .env.local :
cp .env .env.local
- Lancer les conteneurs :
docker compose up -d
Pour générer un PDF, envoyez une requête POST à l'endpoint /api/pdf/generate
:
curl -X POST \
'https://pdf.local/api/pdf/generate' \
-H 'Content-Type: application/json' \
-k \
-o document.pdf \
-d '{
"html": "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"></head><body><h1>Test de génération PDF</h1><p>Ceci est un test.</p></body></html>",
"options": {
"format": "A4",
"orientation": "portrait",
"printBackground": true,
"scale": 1,
"margins": {
"top": "0.4in",
"right": "0.4in",
"bottom": "0.4in",
"left": "0.4in"
}
}
}'
Option | Type | Description | Valeur par défaut |
---|---|---|---|
format | string | Format du papier (A4, Letter, etc.) | "A4" |
orientation | string | Orientation de la page (portrait/landscape) | "portrait" |
printBackground | boolean | Inclure les arrière-plans | true |
scale | number | Échelle du document (0.1 à 2) | 1.0 |
margins | object | Marges du document | voir ci-dessous |
Structure des marges :
{
"top": "0.4in",
"right": "0.4in",
"bottom": "0.4in",
"left": "0.4in"
}
Une route de test est disponible pour vérifier rapidement le service :
https://localhost/test/pdf
Cette route génère un PDF de test avec différents éléments (texte, styles, caractères spéciaux).
src/Domain/Entity/Pdf.php
: Entité principalesrc/Domain/ValueObject/
: Value Objects (PdfOptions, HtmlContent, etc.)src/Domain/Port/PdfGeneratorInterface.php
: Interface pour la génération PDFsrc/Infrastructure/Adapter/ChromePdfGenerator.php
: Implémentation avec Chromesrc/Infrastructure/Controller/PdfController.php
: Contrôleur API
# Démarrer les conteneurs
docker compose up -d
# Voir les logs
docker compose logs -f
# Logs spécifiques du service app
docker compose logs -f app
# Logs spécifiques de Chrome
docker compose logs -f chrome
# Arrêter les conteneurs
docker compose down
# Accéder au container PHP
docker compose exec app bash
Le projet utilise PHPUnit pour les tests unitaires. Les tests sont organisés selon la structure suivante :
tests/
├── Unit/
│ ├── Domain/ # Tests des entités et value objects
│ ├── Application/ # Tests des commandes et handlers
│ └── Infrastructure/ # Tests des adapteurs
└── bootstrap.php
Pour exécuter les tests :
# Exécuter tous les tests
php bin/phpunit
# Exécuter une suite de tests spécifique
php bin/phpunit --testsuite Unit
# Exécuter un fichier de test spécifique
php bin/phpunit tests/Unit/Domain/ValueObject/HtmlContentTest.php
Pour générer un rapport de couverture de code :
# Rapport dans le terminal
XDEBUG_MODE=coverage php bin/phpunit --coverage-text
# Sous Windows (PowerShell)
$env:XDEBUG_MODE="coverage"; php bin/phpunit --coverage-text
# Rapport HTML détaillé
XDEBUG_MODE=coverage php bin/phpunit --coverage-html tests/coverage
# Sous Windows (PowerShell)
$env:XDEBUG_MODE="coverage"; php bin/phpunit --coverage-html tests/coverage
Le rapport HTML sera généré dans tests/coverage/index.html
.
- Xdebug est configuré et disponible sur le port 9003
- Le profiler Symfony est activé en environnement de développement
- Les logs sont disponibles dans
var/dev.log
Pour l'environnement de production :
- Configurer des certificats SSL valides
- Ajouter une authentification API
- Limiter les ressources des conteneurs
- Mettre en place une validation stricte du HTML
- Configurer les en-têtes de sécurité appropriés
- Mettre en place une limitation de taux (rate limiting)
Une application de démonstration basée sur Next.js 15 avec Bun est incluse dans le dossier nextjs-weather
. Elle permet de générer des PDFs de bulletins météo en utilisant le service PDF et l'API OpenWeather.
-
Obtenez une clé API gratuite sur OpenWeather
-
Ajoutez votre clé API dans le fichier
nextjs-weather/.env
:
OPENWEATHER_API_KEY=votre_clé_api_ici
L'application est automatiquement démarrée avec Docker Compose et est accessible sur :
http://localhost:3001
- 🔍 Recherche de ville
- 🌡️ Affichage des données météo actuelles
- 📄 Génération de PDF du bulletin météo
- 🎨 Interface responsive et moderne
- 🌐 Intégration avec l'API OpenWeather
- 🖨️ Démonstration de l'utilisation du service PDF
nextjs-weather/
├── src/
│ ├── app/
│ │ └── weather/
│ │ └── [city]/
│ │ ├── page.tsx # Page d'affichage météo
│ │ └── weather.pdf/ # Route API PDF
│ ├── components/ # Composants React
│ └── infrastructure/
│ └── pdf/
│ └── pdf-adapter.ts # Adaptateur service PDF
├── .env
└── next.config.js
- Accédez à
http://localhost:3001
dans votre navigateur - Entrez le nom d'une ville dans la barre de recherche
- Visualisez les informations météo
- Cliquez sur "Générer PDF" pour obtenir une version PDF du bulletin
- Forker le projet
- Créer une branche pour votre fonctionnalité
- Commiter vos changements
- Pousser vers la branche
- Créer une Pull Request
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
- ✅ Utilisation libre dans des projets commerciaux
- ✅ Modification et distribution autorisées
- ✅ Utilisation privée sans restriction
- ❗ Obligation de conserver la notice de licence
- ❗ Aucune garantie n'est fournie
Pour toute question ou problème :
- Ouvrir une issue sur le repository
- Contacter l'équipe de développement via [email protected]
- Visiter offroadlabs.com pour plus d'informations
offroadLabs propose des services professionnels pour vous accompagner dans l'intégration et l'utilisation de ce service :
- ✅ Intégration sur mesure dans votre infrastructure
- ✅ Personnalisation des templates et des styles
- ✅ Sécurisation et optimisation des performances
- ✅ Configuration en environnement de production
- ✅ Formation de vos équipes
- 🔧 Développement Symfony & PHP moderne
- 🔧 Architecture hexagonale & bonnes pratiques
- 🔧 Frontend moderne (React, Next.js)
- 🔧 Sécurité & Performance
- 💡 Expertise reconnue en développement PHP/Symfony
- 💡 Approche pragmatique et orientée résultats
- 💡 Engagement qualité et bonnes pratiques
- 💡 Support réactif et professionnel
- 💡 Expérience concrète sur des projets similaires
Pour discuter de vos besoins :
- 📧 Email : [email protected]
- 🌐 Blog technique : timoner.com
- 🌐 Site web : offroadlabs.com