Skip to content

offroadlabs/pdf-service

Repository files navigation

Service de Génération PDF

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.

Technologies Utilisées

  • 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)

Architecture

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

Prérequis

  • Docker
  • Docker Compose
  • Make (optionnel)

Installation

  1. Cloner le repository :
git clone https://github.com/offroadlabs/pdf-service.git
cd pdf-service
  1. Créer le fichier .env.local :
cp .env .env.local
  1. Lancer les conteneurs :
docker compose up -d

Utilisation

Via API REST

Générer un PDF

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"
        }
    }
}'

Options de Configuration PDF

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"
}

Route de Test

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).

Développement

Structure des Fichiers Principaux

  • src/Domain/Entity/Pdf.php : Entité principale
  • src/Domain/ValueObject/ : Value Objects (PdfOptions, HtmlContent, etc.)
  • src/Domain/Port/PdfGeneratorInterface.php : Interface pour la génération PDF
  • src/Infrastructure/Adapter/ChromePdfGenerator.php : Implémentation avec Chrome
  • src/Infrastructure/Controller/PdfController.php : Contrôleur API

Commandes Utiles

# 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

Tests

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

Couverture de code

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.

Debug

  • 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

Sécurité

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)

Application de Démonstration Next.js

🌦️ Weather PDF Demo

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.

Configuration

  1. Obtenez une clé API gratuite sur OpenWeather

  2. Ajoutez votre clé API dans le fichier nextjs-weather/.env :

OPENWEATHER_API_KEY=votre_clé_api_ici

Accès à l'Application

L'application est automatiquement démarrée avec Docker Compose et est accessible sur :

http://localhost:3001

Fonctionnalités

  • 🔍 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

Structure des Fichiers

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

Utilisation

  1. Accédez à http://localhost:3001 dans votre navigateur
  2. Entrez le nom d'une ville dans la barre de recherche
  3. Visualisez les informations météo
  4. Cliquez sur "Générer PDF" pour obtenir une version PDF du bulletin

Contribution

  1. Forker le projet
  2. Créer une branche pour votre fonctionnalité
  3. Commiter vos changements
  4. Pousser vers la branche
  5. Créer une Pull Request

Licence

Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.

Utilisation Commerciale

  • ✅ 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

Support

Pour toute question ou problème :

Services Professionnels

🚀 Besoin d'accompagnement ?

offroadLabs propose des services professionnels pour vous accompagner dans l'intégration et l'utilisation de ce service :

Services d'Intégration

  • ✅ 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

Expertise Technique

  • 🔧 Développement Symfony & PHP moderne
  • 🔧 Architecture hexagonale & bonnes pratiques
  • 🔧 Frontend moderne (React, Next.js)
  • 🔧 Sécurité & Performance

📈 Pourquoi nous faire confiance ?

  • 💡 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

📞 Contact

Pour discuter de vos besoins :

About

Un microservice basé sur Symfony 7.2 pour générer des PDFs à partir de contenu HTML en utilisant Chrome Headless

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published