erase icons in docs

This commit is contained in:
syoul
2025-11-04 17:04:01 +01:00
parent 8c9392b613
commit a7f6c6e569
8 changed files with 325 additions and 325 deletions

View File

@@ -1,14 +1,14 @@
# Changelog - Améliorations du projet pdf2csv # Changelog - Améliorations du projet pdf2csv
## 🎯 Résumé des améliorations (v2.0) ## Résumé des améliorations (v2.0)
Ce document détaille toutes les améliorations apportées au projet pdf2csv. Ce document détaille toutes les améliorations apportées au projet pdf2csv.
--- ---
## Améliorations haute priorité (TERMINÉES) ## Améliorations haute priorité (TERMINÉES)
### 1. Gestion d'erreurs robuste ### 1. Gestion d'erreurs robuste
**Avant :** **Avant :**
```python ```python
@@ -22,16 +22,16 @@ tabula.convert_into(...) # Pas de gestion d'erreur
- Validation des entrées avant traitement - Validation des entrées avant traitement
- Résumé des erreurs en fin de traitement - Résumé des erreurs en fin de traitement
### 2. Logging professionnel ### 2. Logging professionnel
**Avant :** **Avant :**
```python ```python
print(f"[] Converti : {pdf_path}") print(f"[OK] Converti : {pdf_path}")
``` ```
**Après :** **Après :**
```python ```python
logger.info(f"Converti : {pdf_path.name}") logger.info(f"Converti : {pdf_path.name}")
logger.debug(f"Délimiteur détecté : '{delimiter}'") logger.debug(f"Délimiteur détecté : '{delimiter}'")
logger.error(f"Erreur lors de la conversion : {e}") logger.error(f"Erreur lors de la conversion : {e}")
``` ```
@@ -42,7 +42,7 @@ logger.error(f"Erreur lors de la conversion : {e}")
- Format standardisé - Format standardisé
- Mode verbeux disponible (`--verbose`) - Mode verbeux disponible (`--verbose`)
### 3. Type hints complets ### 3. Type hints complets
**Avant :** **Avant :**
```python ```python
@@ -62,7 +62,7 @@ def detect_delimiter(sample_text: str) -> str:
- Auto-complétion améliorée dans les IDEs - Auto-complétion améliorée dans les IDEs
- Code plus maintenable - Code plus maintenable
### 4. Configuration externalisée ### 4. Configuration externalisée
**Avant :** **Avant :**
```python ```python
@@ -81,7 +81,7 @@ MOT_DEBUT = "SOLDE" # Hardcodé
- `CLEAN_TEMP_FILES` - `CLEAN_TEMP_FILES`
- `TABULA_LATTICE`, `TABULA_PAGES` - `TABULA_LATTICE`, `TABULA_PAGES`
### 5. Validation des entrées ### 5. Validation des entrées
**Avant :** **Avant :**
```python ```python
@@ -102,7 +102,7 @@ def valider_fichier_pdf(pdf_path: Path) -> bool:
- Permissions de lecture - Permissions de lecture
- Existence des répertoires - Existence des répertoires
### 6. Nettoyage des fichiers temporaires ### 6. Nettoyage des fichiers temporaires
**Avant :** **Avant :**
```python ```python
@@ -122,7 +122,7 @@ with temporary_file_tracker() as temp_files:
- Option `--no-clean` pour déboguer - Option `--no-clean` pour déboguer
- Variable d'environnement `CLEAN_TEMP_FILES` - Variable d'environnement `CLEAN_TEMP_FILES`
### 7. Arguments CLI ### 7. Arguments CLI
**Avant :** **Avant :**
```python ```python
@@ -148,9 +148,9 @@ parser.add_argument("--mot-debut", ...)
--- ---
## 📦 Nouveaux fichiers ## Nouveaux fichiers
### 1. `requirements.txt` ### 1. requirements.txt
``` ```
tabula-py==2.9.0 tabula-py==2.9.0
pandas==2.1.4 pandas==2.1.4
@@ -161,21 +161,21 @@ pandas==2.1.4
- Installation simplifiée : `pip install -r requirements.txt` - Installation simplifiée : `pip install -r requirements.txt`
- Documentation des dépendances - Documentation des dépendances
### 2. `config.example.env` ### 2. config.example.env
Fichier de configuration d'exemple avec toutes les variables disponibles. Fichier de configuration d'exemple avec toutes les variables disponibles.
### 3. `.dockerignore` ### 3. .dockerignore
Optimise la construction de l'image Docker en excluant les fichiers inutiles. Optimise la construction de l'image Docker en excluant les fichiers inutiles.
### 4. `.gitignore` ### 4. .gitignore
Empêche de committer les fichiers temporaires, PDFs, CSVs, etc. Empêche de committer les fichiers temporaires, PDFs, CSVs, etc.
### 5. `CHANGELOG.md` ### 5. CHANGELOG.md
Ce fichier ! Documentation de toutes les améliorations. Ce fichier ! Documentation de toutes les améliorations.
--- ---
## 🔧 Améliorations du code ## Améliorations du code
### Refactoring des fonctions ### Refactoring des fonctions
@@ -250,22 +250,22 @@ logger.info(f"{'='*60}")
--- ---
## 📚 Documentation ## Documentation
### README.md amélioré ### README.md amélioré
**Nouvelles sections :** **Nouvelles sections :**
- Nouveautés v2.0 - Nouveautés v2.0
- 📦 Installation (Docker + Local) - Installation (Docker + Local)
- 🎯 Utilisation détaillée avec exemples - Utilisation détaillée avec exemples
- ⚙️ Configuration complète - Configuration complète
- 📝 Exemples concrets - Exemples concrets
- 🔍 Logs et débogage - Logs et débogage
- 🐛 Résolution de problèmes - Résolution de problèmes
- 🏗️ Architecture du code - Architecture du code
- 🧪 Tests - Tests
- 🤝 Contribution - Contribution
- 🔄 Changelog - Changelog
**Exemples pratiques :** **Exemples pratiques :**
- Utilisation Docker basique et avancée - Utilisation Docker basique et avancée
@@ -275,7 +275,7 @@ logger.info(f"{'='*60}")
--- ---
## 🐳 Dockerfile amélioré ## Dockerfile amélioré
**Avant :** **Avant :**
```dockerfile ```dockerfile
@@ -295,25 +295,25 @@ RUN pip install --no-cache-dir -r /tmp/requirements.txt && rm /tmp/requirements.
--- ---
## 📊 Comparaison avant/après ## Comparaison avant/après
| Aspect | Avant | Après | | Aspect | Avant | Après |
|--------|-------|-------| |--------|-------|-------|
| **Lignes de code** | 170 | 450+ | | **Lignes de code** | 170 | 450+ |
| **Fonctions** | 6 | 10+ | | **Fonctions** | 6 | 10+ |
| **Gestion erreurs** | Basique | Robuste | | **Gestion erreurs** | Basique | Robuste |
| **Logging** | print() | logging module | | **Logging** | print() | logging module |
| **Type hints** | Aucun | Complet | | **Type hints** | Aucun | Complet |
| **Configuration** | Hardcodé | Flexible | | **Configuration** | Hardcodé | Flexible |
| **CLI** | Aucun | argparse | | **CLI** | Aucun | argparse |
| **Validation** | Aucune | Complète | | **Validation** | Aucune | Complète |
| **Documentation** | ⚠️ Basique | Complète | | **Documentation** | Basique | Complète |
| **Tests** | Aucun | ⚠️ À ajouter | | **Tests** | Aucun | À ajouter |
| **Maintenabilité** | ⚠️ Moyenne | Excellente | | **Maintenabilité** | Moyenne | Excellente |
--- ---
## 🎓 Bonnes pratiques appliquées ## Bonnes pratiques appliquées
### 1. Architecture propre ### 1. Architecture propre
- Séparation des responsabilités - Séparation des responsabilités
@@ -351,7 +351,7 @@ RUN pip install --no-cache-dir -r /tmp/requirements.txt && rm /tmp/requirements.
--- ---
## 🚀 Prochaines améliorations possibles ## Prochaines améliorations possibles
### Tests unitaires ### Tests unitaires
```python ```python
@@ -378,7 +378,7 @@ def test_detect_delimiter():
--- ---
## 📞 Migration ## Migration
### Comment migrer de v1.0 à v2.0 ### Comment migrer de v1.0 à v2.0
@@ -401,15 +401,15 @@ docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest --verbose
--- ---
## 🎉 Conclusion ## Conclusion
Le code est maintenant : Le code est maintenant :
- Plus robuste - Plus robuste
- Mieux structuré - Mieux structuré
- Plus maintenable - Plus maintenable
- Mieux documenté - Mieux documenté
- Plus flexible - Plus flexible
- Production-ready - Production-ready
**Qualité du code : A+** **Qualité du code : A+**

View File

@@ -11,12 +11,12 @@ help: ## Affiche cette aide
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
build: ## Construit l'image Docker build: ## Construit l'image Docker
@echo "🔨 Construction de l'image Docker..." @echo "Construction de l'image Docker..."
docker build -t $(IMAGE_NAME):$(IMAGE_TAG) . docker build -t $(IMAGE_NAME):$(IMAGE_TAG) .
@echo "Image construite : $(IMAGE_NAME):$(IMAGE_TAG)" @echo "Image construite : $(IMAGE_NAME):$(IMAGE_TAG)"
run: ## Lance la conversion (PDFs dans ./data) run: ## Lance la conversion (PDFs dans ./data)
@echo "🚀 Lancement de la conversion..." @echo "Lancement de la conversion..."
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
docker run --rm \ docker run --rm \
--name $(CONTAINER_NAME) \ --name $(CONTAINER_NAME) \
@@ -24,7 +24,7 @@ run: ## Lance la conversion (PDFs dans ./data)
$(IMAGE_NAME):$(IMAGE_TAG) $(IMAGE_NAME):$(IMAGE_TAG)
run-verbose: ## Lance la conversion en mode verbeux run-verbose: ## Lance la conversion en mode verbeux
@echo "🚀 Lancement de la conversion (mode verbeux)..." @echo "Lancement de la conversion (mode verbeux)..."
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
docker run --rm \ docker run --rm \
--name $(CONTAINER_NAME) \ --name $(CONTAINER_NAME) \
@@ -32,7 +32,7 @@ run-verbose: ## Lance la conversion en mode verbeux
$(IMAGE_NAME):$(IMAGE_TAG) --verbose $(IMAGE_NAME):$(IMAGE_TAG) --verbose
run-custom: ## Lance avec configuration personnalisée (utilise .env) run-custom: ## Lance avec configuration personnalisée (utilise .env)
@echo "🚀 Lancement avec configuration personnalisée..." @echo "Lancement avec configuration personnalisée..."
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
docker run --rm \ docker run --rm \
--name $(CONTAINER_NAME) \ --name $(CONTAINER_NAME) \
@@ -41,7 +41,7 @@ run-custom: ## Lance avec configuration personnalisée (utilise .env)
$(IMAGE_NAME):$(IMAGE_TAG) --verbose $(IMAGE_NAME):$(IMAGE_TAG) --verbose
run-no-clean: ## Lance sans nettoyer les fichiers temporaires run-no-clean: ## Lance sans nettoyer les fichiers temporaires
@echo "🚀 Lancement (conservation des fichiers temporaires)..." @echo "Lancement (conservation des fichiers temporaires)..."
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
docker run --rm \ docker run --rm \
--name $(CONTAINER_NAME) \ --name $(CONTAINER_NAME) \
@@ -49,9 +49,9 @@ run-no-clean: ## Lance sans nettoyer les fichiers temporaires
$(IMAGE_NAME):$(IMAGE_TAG) --no-clean --verbose $(IMAGE_NAME):$(IMAGE_TAG) --no-clean --verbose
test: build ## Construit et teste avec des PDFs d'exemple test: build ## Construit et teste avec des PDFs d'exemple
@echo "🧪 Test de l'application..." @echo "Test de l'application..."
@mkdir -p test_data @mkdir -p test_data
@echo "⚠️ Placez des PDFs dans ./test_data/ puis appuyez sur Entrée" @echo "Placez des PDFs dans ./test_data/ puis appuyez sur Entrée"
@read dummy @read dummy
docker run --rm \ docker run --rm \
--name $(CONTAINER_NAME)-test \ --name $(CONTAINER_NAME)-test \
@@ -59,36 +59,36 @@ test: build ## Construit et teste avec des PDFs d'exemple
$(IMAGE_NAME):$(IMAGE_TAG) --verbose $(IMAGE_NAME):$(IMAGE_TAG) --verbose
clean: ## Nettoie les fichiers générés clean: ## Nettoie les fichiers générés
@echo "🧹 Nettoyage..." @echo "Nettoyage..."
@rm -rf $(DATA_DIR)/*_brut.csv @rm -rf $(DATA_DIR)/*_brut.csv
@rm -rf $(DATA_DIR)/*_final.csv @rm -rf $(DATA_DIR)/*_final.csv
@rm -rf $(DATA_DIR)/fusion_total.csv @rm -rf $(DATA_DIR)/fusion_total.csv
@rm -rf test_data/ @rm -rf test_data/
@echo "Nettoyage terminé" @echo "Nettoyage terminé"
clean-all: clean ## Nettoie tout (y compris l'image Docker) clean-all: clean ## Nettoie tout (y compris l'image Docker)
@echo "🧹 Nettoyage complet..." @echo "Nettoyage complet..."
docker rmi $(IMAGE_NAME):$(IMAGE_TAG) 2>/dev/null || true docker rmi $(IMAGE_NAME):$(IMAGE_TAG) 2>/dev/null || true
@echo "Nettoyage complet terminé" @echo "Nettoyage complet terminé"
install: ## Installe les dépendances Python localement install: ## Installe les dépendances Python localement
@echo "📦 Installation des dépendances..." @echo "Installation des dépendances..."
pip install -r requirements.txt pip install -r requirements.txt
@echo "Dépendances installées" @echo "Dépendances installées"
dev: install ## Configure l'environnement de développement dev: install ## Configure l'environnement de développement
@echo "🔧 Configuration de l'environnement de développement..." @echo "Configuration de l'environnement de développement..."
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
@mkdir -p test_data @mkdir -p test_data
@if [ ! -f .env ]; then cp config.example.env .env; echo "Fichier .env créé"; fi @if [ ! -f .env ]; then cp config.example.env .env; echo "Fichier .env créé"; fi
@echo "Environnement de développement prêt" @echo "Environnement de développement prêt"
@echo "" @echo ""
@echo "Commandes utiles :" @echo "Commandes utiles :"
@echo " python convert.py ./data --verbose" @echo " python convert.py ./data --verbose"
@echo " python convert.py --help" @echo " python convert.py --help"
shell: ## Ouvre un shell dans le conteneur shell: ## Ouvre un shell dans le conteneur
@echo "🐚 Ouverture d'un shell..." @echo "Ouverture d'un shell..."
docker run --rm -it \ docker run --rm -it \
--name $(CONTAINER_NAME)-shell \ --name $(CONTAINER_NAME)-shell \
-v $(PWD)/$(DATA_DIR):/data \ -v $(PWD)/$(DATA_DIR):/data \
@@ -96,37 +96,37 @@ shell: ## Ouvre un shell dans le conteneur
$(IMAGE_NAME):$(IMAGE_TAG) $(IMAGE_NAME):$(IMAGE_TAG)
logs: ## Affiche les logs du dernier run logs: ## Affiche les logs du dernier run
@echo "📋 Logs du dernier conteneur..." @echo "Logs du dernier conteneur..."
@docker logs $(CONTAINER_NAME) 2>/dev/null || echo "Aucun conteneur en cours" @docker logs $(CONTAINER_NAME) 2>/dev/null || echo "Aucun conteneur en cours"
status: ## Affiche le statut de l'environnement status: ## Affiche le statut de l'environnement
@echo "📊 Statut de l'environnement" @echo "Statut de l'environnement"
@echo "" @echo ""
@echo "Image Docker :" @echo "Image Docker :"
@docker images $(IMAGE_NAME):$(IMAGE_TAG) --format " - {{.Repository}}:{{.Tag}} ({{.Size}})" || echo " Image non construite" @docker images $(IMAGE_NAME):$(IMAGE_TAG) --format " - {{.Repository}}:{{.Tag}} ({{.Size}})" || echo " Image non construite"
@echo "" @echo ""
@echo "Répertoire de données :" @echo "Répertoire de données :"
@if [ -d $(DATA_DIR) ]; then \ @if [ -d $(DATA_DIR) ]; then \
echo " $(DATA_DIR) existe"; \ echo " $(DATA_DIR) existe"; \
echo " 📄 PDFs : $$(find $(DATA_DIR) -name '*.pdf' 2>/dev/null | wc -l)"; \ echo " PDFs : $$(find $(DATA_DIR) -name '*.pdf' 2>/dev/null | wc -l)"; \
echo " 📊 CSVs : $$(find $(DATA_DIR) -name '*.csv' 2>/dev/null | wc -l)"; \ echo " CSVs : $$(find $(DATA_DIR) -name '*.csv' 2>/dev/null | wc -l)"; \
else \ else \
echo " $(DATA_DIR) n'existe pas"; \ echo " $(DATA_DIR) n'existe pas"; \
fi fi
@echo "" @echo ""
@echo "Configuration :" @echo "Configuration :"
@if [ -f .env ]; then \ @if [ -f .env ]; then \
echo " Fichier .env présent"; \ echo " Fichier .env présent"; \
else \ else \
echo " ⚠️ Fichier .env absent (utilise config.example.env)"; \ echo " Fichier .env absent (utilise config.example.env)"; \
fi fi
example: ## Crée un exemple de configuration example: ## Crée un exemple de configuration
@echo "📝 Création d'un exemple..." @echo "Création d'un exemple..."
@cp config.example.env .env @cp config.example.env .env
@mkdir -p $(DATA_DIR) @mkdir -p $(DATA_DIR)
@echo "Fichier .env créé" @echo "Fichier .env créé"
@echo "Répertoire $(DATA_DIR) créé" @echo "Répertoire $(DATA_DIR) créé"
@echo "" @echo ""
@echo "Prochaines étapes :" @echo "Prochaines étapes :"
@echo " 1. Placez vos PDFs dans ./$(DATA_DIR)/" @echo " 1. Placez vos PDFs dans ./$(DATA_DIR)/"

View File

@@ -1,6 +1,6 @@
# 🚀 Guide de démarrage rapide - pdf2csv v2.0 # Guide de démarrage rapide - pdf2csv v2.0
## Démarrage ultra-rapide (Docker) ## Démarrage ultra-rapide (Docker)
```bash ```bash
# 1. Construire l'image # 1. Construire l'image
@@ -19,7 +19,7 @@ cat data/fusion_total.csv
--- ---
## 📦 Utilisation avec Make (Recommandé) ## Utilisation avec Make (Recommandé)
```bash ```bash
# Construire # Construire
@@ -41,7 +41,7 @@ make help
--- ---
## 🐍 Utilisation locale (sans Docker) ## Utilisation locale (sans Docker)
```bash ```bash
# 1. Installer les dépendances # 1. Installer les dépendances
@@ -56,7 +56,7 @@ python convert.py ./data --verbose
--- ---
## ⚙️ Configuration personnalisée ## Configuration personnalisée
```bash ```bash
# 1. Créer un fichier de configuration # 1. Créer un fichier de configuration
@@ -76,7 +76,7 @@ make run-custom
--- ---
## 📊 Options disponibles ## Options disponibles
```bash ```bash
# Mode verbeux (logs détaillés) # Mode verbeux (logs détaillés)
@@ -94,7 +94,7 @@ python convert.py --help
--- ---
## 🔧 Variables d'environnement ## Variables d'environnement
| Variable | Valeur par défaut | Description | | Variable | Valeur par défaut | Description |
|----------|-------------------|-------------| |----------|-------------------|-------------|
@@ -105,7 +105,7 @@ python convert.py --help
--- ---
## Test de l'installation ## Test de l'installation
```bash ```bash
# Script de test automatique # Script de test automatique
@@ -117,7 +117,7 @@ python convert.py --help
--- ---
## 📁 Structure des fichiers résultants ## Structure des fichiers résultants
``` ```
data/ data/
@@ -126,12 +126,12 @@ data/
├── releve1_final.csv ← CSV nettoyé ├── releve1_final.csv ← CSV nettoyé
├── releve2.pdf ├── releve2.pdf
├── releve2_final.csv ├── releve2_final.csv
└── fusion_total.csv ← 🎯 FICHIER FINAL FUSIONNÉ └── fusion_total.csv ← FICHIER FINAL FUSIONNÉ
``` ```
--- ---
## 🆘 Problèmes courants ## Problèmes courants
### "Aucun PDF trouvé" ### "Aucun PDF trouvé"
```bash ```bash
@@ -166,7 +166,7 @@ python convert.py ./data --mot-debut "VOTRE_MOT" --verbose
--- ---
## 📚 Documentation complète ## Documentation complète
- **README.md** : Documentation complète - **README.md** : Documentation complète
- **CHANGELOG.md** : Liste des améliorations - **CHANGELOG.md** : Liste des améliorations
@@ -175,7 +175,7 @@ python convert.py ./data --mot-debut "VOTRE_MOT" --verbose
--- ---
## 💡 Exemples d'utilisation ## Exemples d'utilisation
### Exemple 1 : Relevés bancaires ### Exemple 1 : Relevés bancaires
```bash ```bash
@@ -202,7 +202,7 @@ done
--- ---
## 🎯 Commandes essentielles ## Commandes essentielles
```bash ```bash
# Construction # Construction
@@ -226,7 +226,7 @@ make status
--- ---
## 📞 Aide ## Aide
Pour plus d'informations : Pour plus d'informations :
```bash ```bash
@@ -235,5 +235,5 @@ make help
cat README.md cat README.md
``` ```
Bon traitement ! 🚀 Bon traitement !

View File

@@ -1,23 +1,23 @@
# 📄 pdf2csv # pdf2csv
Convertisseur de fichiers **PDF** en **CSV** basé sur [tabula-py](https://github.com/chezou/tabula-py) et [pandas](https://pandas.pydata.org/), empaqueté dans une image **Docker** légère. Convertisseur de fichiers **PDF** en **CSV** basé sur [tabula-py](https://github.com/chezou/tabula-py) et [pandas](https://pandas.pydata.org/), empaqueté dans une image **Docker** légère.
Il est conçu pour traiter automatiquement les relevés bancaires PDF (ou autres tableaux PDF similaires) en appliquant des opérations de nettoyage et de fusion avant de produire un fichier CSV unique. Il est conçu pour traiter automatiquement les relevés bancaires PDF (ou autres tableaux PDF similaires) en appliquant des opérations de nettoyage et de fusion avant de produire un fichier CSV unique.
## Nouveautés v2.0 ## Nouveautés v2.0
- **Gestion d'erreurs robuste** : Traitement gracieux des erreurs avec logs détaillés - **Gestion d'erreurs robuste** : Traitement gracieux des erreurs avec logs détaillés
- **Logging professionnel** : Logs structurés avec niveaux (INFO, DEBUG, ERROR) - **Logging professionnel** : Logs structurés avec niveaux (INFO, DEBUG, ERROR)
- **Type hints** : Code entièrement typé pour une meilleure maintenabilité - **Type hints** : Code entièrement typé pour une meilleure maintenabilité
- **Configuration flexible** : Variables d'environnement et arguments CLI - **Configuration flexible** : Variables d'environnement et arguments CLI
- **Validation des entrées** : Vérification de la validité des fichiers PDF - **Validation des entrées** : Vérification de la validité des fichiers PDF
- **Nettoyage automatique** : Suppression des fichiers temporaires - **Nettoyage automatique** : Suppression des fichiers temporaires
- **Arguments CLI** : Paramétrage via ligne de commande - **Arguments CLI** : Paramétrage via ligne de commande
- **Requirements.txt** : Gestion des dépendances standardisée - **Requirements.txt** : Gestion des dépendances standardisée
--- ---
## 🚀 Fonctionnalités ## Fonctionnalités
### Extraction ### Extraction
- Utilise `tabula-py` pour extraire les tableaux depuis tous les fichiers PDF - Utilise `tabula-py` pour extraire les tableaux depuis tous les fichiers PDF
@@ -44,7 +44,7 @@ Il est conçu pour traiter automatiquement les relevés bancaires PDF (ou autres
--- ---
## 📦 Installation ## Installation
### Option 1 : Docker (Recommandé) ### Option 1 : Docker (Recommandé)
@@ -74,7 +74,7 @@ sudo apt-get install openjdk-17-jre-headless
--- ---
## 🎯 Utilisation ## Utilisation
### Utilisation avec Docker ### Utilisation avec Docker
@@ -141,7 +141,7 @@ python convert.py --help
--- ---
## ⚙️ Configuration ## Configuration
### Variables d'environnement ### Variables d'environnement
@@ -174,7 +174,7 @@ Options:
--- ---
## 📝 Exemples ## Exemples
### Exemple 1 : Relevés bancaires standards ### Exemple 1 : Relevés bancaires standards
@@ -229,7 +229,7 @@ python convert.py ./test_pdfs \
--- ---
## 🔍 Logs et débogage ## Logs et débogage
### Logs normaux ### Logs normaux
@@ -237,11 +237,11 @@ python convert.py ./test_pdfs \
2025-10-11 14:23:15 - INFO - Trouvé 3 fichier(s) PDF à traiter 2025-10-11 14:23:15 - INFO - Trouvé 3 fichier(s) PDF à traiter
2025-10-11 14:23:15 - INFO - Configuration : Configuration(MOT_DEBUT=SOLDE, ...) 2025-10-11 14:23:15 - INFO - Configuration : Configuration(MOT_DEBUT=SOLDE, ...)
2025-10-11 14:23:16 - INFO - Conversion de releve_janvier.pdf... 2025-10-11 14:23:16 - INFO - Conversion de releve_janvier.pdf...
2025-10-11 14:23:18 - INFO - Converti : releve_janvier.pdf 2025-10-11 14:23:18 - INFO - Converti : releve_janvier.pdf
2025-10-11 14:23:18 - INFO - CSV nettoyé sauvegardé : releve_janvier_final.csv (45 lignes) 2025-10-11 14:23:18 - INFO - CSV nettoyé sauvegardé : releve_janvier_final.csv (45 lignes)
2025-10-11 14:23:18 - INFO - Nettoyé : releve_janvier_final.csv 2025-10-11 14:23:18 - INFO - Nettoyé : releve_janvier_final.csv
... ...
2025-10-11 14:23:25 - INFO - Fichier fusionné créé : fusion_total.csv (132 lignes) 2025-10-11 14:23:25 - INFO - Fichier fusionné créé : fusion_total.csv (132 lignes)
2025-10-11 14:23:25 - INFO - ============================================================ 2025-10-11 14:23:25 - INFO - ============================================================
2025-10-11 14:23:25 - INFO - Traitement terminé : 2025-10-11 14:23:25 - INFO - Traitement terminé :
2025-10-11 14:23:25 - INFO - - Fichiers traités avec succès : 3/3 2025-10-11 14:23:25 - INFO - - Fichiers traités avec succès : 3/3
@@ -266,7 +266,7 @@ Affiche des informations supplémentaires sur :
--- ---
## 🐛 Résolution de problèmes ## Résolution de problèmes
### Erreur : "Aucun PDF trouvé" ### Erreur : "Aucun PDF trouvé"
@@ -292,7 +292,7 @@ Affiche des informations supplémentaires sur :
--- ---
## 🏗️ Architecture du code ## Architecture du code
``` ```
convert.py convert.py
@@ -310,7 +310,7 @@ convert.py
--- ---
## 🧪 Tests ## Tests
```bash ```bash
# Créer un dossier de test avec des PDFs échantillons # Créer un dossier de test avec des PDFs échantillons
@@ -331,13 +331,13 @@ cat test_pdfs/fusion_total.csv
--- ---
## 📄 Licence ## Licence
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails. Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
--- ---
## 🤝 Contribution ## Contribution
Les contributions sont les bienvenues ! N'hésitez pas à : Les contributions sont les bienvenues ! N'hésitez pas à :
@@ -349,7 +349,7 @@ Les contributions sont les bienvenues ! N'hésitez pas à :
--- ---
## 📞 Support ## Support
Pour toute question ou problème : Pour toute question ou problème :
@@ -359,23 +359,23 @@ Pour toute question ou problème :
--- ---
## 🔄 Changelog ## Changelog
### v2.0 (2025-10-11) ### v2.0 (2025-10-11)
- Refactoring complet du code - Refactoring complet du code
- Ajout de la gestion d'erreurs robuste - Ajout de la gestion d'erreurs robuste
- Logging professionnel avec niveaux - Logging professionnel avec niveaux
- Type hints pour tout le code - Type hints pour tout le code
- Configuration via variables d'environnement - Configuration via variables d'environnement
- Arguments CLI avec argparse - Arguments CLI avec argparse
- Validation des entrées - Validation des entrées
- Nettoyage automatique des fichiers temporaires - Nettoyage automatique des fichiers temporaires
- Documentation complète - Documentation complète
- 📦 requirements.txt standardisé - requirements.txt standardisé
- 🐛 Corrections de bugs divers - Corrections de bugs divers
### v1.0 ### v1.0
- 🎉 Version initiale - Version initiale
- Conversion PDF → CSV avec tabula - Conversion PDF → CSV avec tabula
- Nettoyage basique - Nettoyage basique
- Fusion de fichiers - Fusion de fichiers

View File

@@ -1,30 +1,30 @@
# 🎉 Résumé des améliorations apportées à pdf2csv # Résumé des améliorations apportées à pdf2csv
## Travail terminé ! ## Travail terminé !
Votre projet **pdf2csv** a été entièrement modernisé et amélioré selon les meilleures pratiques Python et DevOps. Votre projet **pdf2csv** a été entièrement modernisé et amélioré selon les meilleures pratiques Python et DevOps.
--- ---
## 📊 Vue d'ensemble ## Vue d'ensemble
### Avant (v1.0) ### Avant (v1.0)
- Code de 170 lignes sans structure claire - Code de 170 lignes sans structure claire
- Pas de gestion d'erreurs - Pas de gestion d'erreurs
- Configuration hardcodée - Configuration hardcodée
- Pas de validation - Pas de validation
- Documentation minimale - Documentation minimale
### Après (v2.0) ### Après (v2.0)
- Code de 450+ lignes bien structuré - Code de 450+ lignes bien structuré
- Gestion d'erreurs complète - Gestion d'erreurs complète
- Configuration flexible (env vars + CLI) - Configuration flexible (env vars + CLI)
- Validation robuste des entrées - Validation robuste des entrées
- Documentation professionnelle complète - Documentation professionnelle complète
--- ---
## 📁 Nouveaux fichiers créés ## Nouveaux fichiers créés
### Fichiers de code et configuration ### Fichiers de code et configuration
1. **requirements.txt** - Gestion des dépendances Python 1. **requirements.txt** - Gestion des dépendances Python
@@ -47,9 +47,9 @@ Votre projet **pdf2csv** a été entièrement modernisé et amélioré selon les
--- ---
## 🚀 Améliorations majeures du code ## Améliorations majeures du code
### 1. Architecture et structure ### 1. Architecture et structure
**Avant :** **Avant :**
```python ```python
@@ -72,7 +72,7 @@ def valider_fichier_pdf(pdf_path: Path) -> bool:
"""Validation spécifique""" """Validation spécifique"""
``` ```
### 2. Gestion d'erreurs ### 2. Gestion d'erreurs
**Ajouté :** **Ajouté :**
- Try-catch sur toutes les opérations critiques - Try-catch sur toutes les opérations critiques
@@ -91,7 +91,7 @@ except Exception as e:
# Continue avec les autres fichiers # Continue avec les autres fichiers
``` ```
### 3. Logging professionnel ### 3. Logging professionnel
**Avant :** **Avant :**
```python ```python
@@ -111,7 +111,7 @@ logger.error(f"Erreur lors de la conversion : {e}")
- WARNING : Alertes non bloquantes - WARNING : Alertes non bloquantes
- ERROR : Erreurs avec contexte - ERROR : Erreurs avec contexte
### 4. Type hints complets ### 4. Type hints complets
**Ajouté sur toutes les fonctions :** **Ajouté sur toutes les fonctions :**
```python ```python
@@ -128,7 +128,7 @@ def convertir_et_nettoyer(pdf_path: Path, out_dir: Path, config: Configuration,
- Documentation automatique - Documentation automatique
- Code plus maintenable - Code plus maintenable
### 5. Configuration flexible ### 5. Configuration flexible
**Avant :** **Avant :**
```python ```python
@@ -149,7 +149,7 @@ class Configuration:
2. Variables d'environnement (fichier .env) 2. Variables d'environnement (fichier .env)
3. Arguments CLI (--mot-debut, --mot-fin) 3. Arguments CLI (--mot-debut, --mot-fin)
### 6. Validation des entrées ### 6. Validation des entrées
**Nouvelle fonction :** **Nouvelle fonction :**
```python ```python
@@ -164,7 +164,7 @@ def valider_fichier_pdf(pdf_path: Path) -> bool:
# ... autres validations # ... autres validations
``` ```
### 7. Nettoyage automatique ### 7. Nettoyage automatique
**Nouveau gestionnaire de contexte :** **Nouveau gestionnaire de contexte :**
```python ```python
@@ -185,7 +185,7 @@ def temporary_file_tracker():
- `CLEAN_TEMP_FILES=true` (défaut) : Nettoie automatiquement - `CLEAN_TEMP_FILES=true` (défaut) : Nettoie automatiquement
- `--no-clean` : Conserve pour débogage - `--no-clean` : Conserve pour débogage
### 8. Arguments CLI ### 8. Arguments CLI
**Nouveau point d'entrée :** **Nouveau point d'entrée :**
```python ```python
@@ -207,7 +207,7 @@ python convert.py --help # Aide
--- ---
## 📦 Améliorations Docker ## Améliorations Docker
### Dockerfile optimisé ### Dockerfile optimisé
@@ -232,7 +232,7 @@ Réduit la taille du contexte Docker et accélère le build.
--- ---
## 🛠️ Nouveaux outils ## Nouveaux outils
### Makefile (15 commandes) ### Makefile (15 commandes)
@@ -255,16 +255,16 @@ make status # Affiche le statut
``` ```
**Vérifie :** **Vérifie :**
- Python installé - Python installé
- Java installé - Java installé
- Dépendances Python - Dépendances Python
- Structure du projet - Structure du projet
- Docker disponible - Docker disponible
- Fichiers de configuration - Fichiers de configuration
--- ---
## 📚 Documentation complète ## Documentation complète
### README.md (amélioré) ### README.md (amélioré)
- **10 419 octets** de documentation détaillée - **10 419 octets** de documentation détaillée
@@ -285,7 +285,7 @@ make status # Affiche le statut
--- ---
## 📈 Statistiques ## Statistiques
### Code ### Code
- **Lignes de code :** 170 → 450+ (+165%) - **Lignes de code :** 170 → 450+ (+165%)
@@ -308,27 +308,27 @@ make status # Affiche le statut
--- ---
## 🎯 Résultats ## Résultats
### Qualité du code ### Qualité du code
- **Avant :** C (code fonctionnel mais basique) - **Avant :** C (code fonctionnel mais basique)
- **Après :** A+ (production-ready) - **Après :** A+ (production-ready)
### Maintenabilité ### Maintenabilité
- **Avant :** ⭐⭐ (difficile à modifier) - **Avant :** Difficile à modifier
- **Après :** ⭐⭐⭐⭐⭐ (structure claire, bien documentée) - **Après :** Structure claire, bien documentée
### Utilisabilité ### Utilisabilité
- **Avant :** ⚠️ (chemin hardcodé, pas d'options) - **Avant :** Chemin hardcodé, pas d'options
- **Après :** ✅ (CLI complet, configuration flexible) - **Après :** CLI complet, configuration flexible
### Documentation ### Documentation
- **Avant :** ⚠️ (README basique) - **Avant :** README basique
- **Après :** ✅ (documentation professionnelle complète) - **Après :** Documentation professionnelle complète
--- ---
## 🚀 Comment utiliser maintenant ## Comment utiliser maintenant
### Démarrage rapide (30 secondes) ### Démarrage rapide (30 secondes)
@@ -368,7 +368,7 @@ python convert.py --help
--- ---
## 📖 Documentation à consulter ## Documentation à consulter
1. **QUICK_START.md** - Commencer en 5 minutes 1. **QUICK_START.md** - Commencer en 5 minutes
2. **README.md** - Documentation complète 2. **README.md** - Documentation complète
@@ -378,37 +378,37 @@ python convert.py --help
--- ---
## 🎓 Ce que vous avez maintenant ## Ce que vous avez maintenant
### Production-ready ### Production-ready
- Gestion d'erreurs robuste - Gestion d'erreurs robuste
- Logging professionnel - Logging professionnel
- Validation des entrées - Validation des entrées
- Configuration flexible - Configuration flexible
- Documentation complète - Documentation complète
### Maintenable ### Maintenable
- Code structuré et typé - Code structuré et typé
- Séparation des responsabilités - Séparation des responsabilités
- Commentaires et docstrings - Commentaires et docstrings
- Standards Python respectés - Standards Python respectés
### Flexible ### Flexible
- Arguments CLI - Arguments CLI
- Variables d'environnement - Variables d'environnement
- Configuration par fichier - Configuration par fichier
- Mode verbeux pour debug - Mode verbeux pour debug
### Professionnel ### Professionnel
- Documentation exhaustive - Documentation exhaustive
- Scripts d'automatisation (Makefile) - Scripts d'automatisation (Makefile)
- Tests de validation - Tests de validation
- Fichiers .gitignore / .dockerignore - Fichiers .gitignore / .dockerignore
- Changelog et versioning - Changelog et versioning
--- ---
## 💡 Conseils pour la suite ## Conseils pour la suite
### Immédiat ### Immédiat
1. Tester avec vos PDFs réels : `make run-verbose` 1. Tester avec vos PDFs réels : `make run-verbose`
@@ -427,33 +427,33 @@ python convert.py --help
--- ---
## 🎉 Conclusion ## Conclusion
Votre projet **pdf2csv** est maintenant : Votre projet **pdf2csv** est maintenant :
### ⭐⭐⭐⭐⭐ Production-ready ### Production-ready
- Code robuste et bien testé - Code robuste et bien testé
- Gestion d'erreurs complète - Gestion d'erreurs complète
- Logging professionnel - Logging professionnel
### 📚 Bien documenté ### Bien documenté
- 4 fichiers de documentation - 4 fichiers de documentation
- Exemples concrets - Exemples concrets
- Troubleshooting complet - Troubleshooting complet
### 🔧 Facile à utiliser ### Facile à utiliser
- Makefile avec 15+ commandes - Makefile avec 15+ commandes
- CLI avec options flexibles - CLI avec options flexibles
- Configuration en 3 niveaux - Configuration en 3 niveaux
### 🚀 Prêt à évoluer ### Prêt à évoluer
- Architecture extensible - Architecture extensible
- Code typé et testé - Code typé et testé
- Standards respectés - Standards respectés
--- ---
## 📞 Support ## Support
Pour toute question : Pour toute question :
1. Consultez **README.md** (documentation complète) 1. Consultez **README.md** (documentation complète)
@@ -463,9 +463,9 @@ Pour toute question :
--- ---
**Bravo ! Votre projet est maintenant au niveau professionnel ! 🎊** **Bravo ! Votre projet est maintenant au niveau professionnel !**
Date : 11 octobre 2025 Date : 11 octobre 2025
Version : 2.0 Version : 2.0
Statut : Terminé et prêt à l'emploi Statut : Terminé et prêt à l'emploi

View File

@@ -281,11 +281,11 @@ def convertir_et_nettoyer(pdf_path: Path, out_dir: Path, config: Configuration,
pages=config.TABULA_PAGES, pages=config.TABULA_PAGES,
lattice=config.TABULA_LATTICE lattice=config.TABULA_LATTICE
) )
logger.info(f"Converti : {pdf_path.name}") logger.info(f"Converti : {pdf_path.name}")
# Nettoyage du CSV # Nettoyage du CSV
header_line = nettoyer_csv_texte(csv_brut, csv_final, config) header_line = nettoyer_csv_texte(csv_brut, csv_final, config)
logger.info(f"Nettoyé : {csv_final.name}") logger.info(f"Nettoyé : {csv_final.name}")
return csv_final, header_line return csv_final, header_line
@@ -334,7 +334,7 @@ def fusionner_csv(liste_csv: List[Path], fichier_sortie: Path,
logger.debug("En-tête ajoutée au fichier fusionné") logger.debug("En-tête ajoutée au fichier fusionné")
final_df.to_csv(fichier_sortie, index=False, header=False) final_df.to_csv(fichier_sortie, index=False, header=False)
logger.info(f"Fichier fusionné créé : {fichier_sortie} ({len(final_df)} lignes)") logger.info(f"Fichier fusionné créé : {fichier_sortie} ({len(final_df)} lignes)")
except Exception as e: except Exception as e:
logger.error(f"Erreur lors de la fusion des CSV : {e}") logger.error(f"Erreur lors de la fusion des CSV : {e}")

View File

@@ -22,9 +22,9 @@ echo ""
echo -e "${YELLOW}Test 1: Vérification de Python...${NC}" echo -e "${YELLOW}Test 1: Vérification de Python...${NC}"
if command -v python3 &> /dev/null; then if command -v python3 &> /dev/null; then
PYTHON_VERSION=$(python3 --version) PYTHON_VERSION=$(python3 --version)
echo -e "${GREEN} Python installé: $PYTHON_VERSION${NC}" echo -e "${GREEN}[OK] Python installé: $PYTHON_VERSION${NC}"
else else
echo -e "${RED} Python 3 n'est pas installé${NC}" echo -e "${RED}[ERREUR] Python 3 n'est pas installé${NC}"
exit 1 exit 1
fi fi
echo "" echo ""
@@ -33,9 +33,9 @@ echo ""
echo -e "${YELLOW}Test 2: Vérification de Java...${NC}" echo -e "${YELLOW}Test 2: Vérification de Java...${NC}"
if command -v java &> /dev/null; then if command -v java &> /dev/null; then
JAVA_VERSION=$(java -version 2>&1 | head -n 1) JAVA_VERSION=$(java -version 2>&1 | head -n 1)
echo -e "${GREEN} Java installé: $JAVA_VERSION${NC}" echo -e "${GREEN}[OK] Java installé: $JAVA_VERSION${NC}"
else else
echo -e "${RED} Java n'est pas installé (requis pour tabula)${NC}" echo -e "${RED}[ERREUR] Java n'est pas installé (requis pour tabula)${NC}"
echo -e "${YELLOW} Installation: sudo apt-get install openjdk-17-jre-headless${NC}" echo -e "${YELLOW} Installation: sudo apt-get install openjdk-17-jre-headless${NC}"
exit 1 exit 1
fi fi
@@ -44,24 +44,24 @@ echo ""
# Test 3: Vérifier les dépendances Python # Test 3: Vérifier les dépendances Python
echo -e "${YELLOW}Test 3: Vérification des dépendances Python...${NC}" echo -e "${YELLOW}Test 3: Vérification des dépendances Python...${NC}"
if [ -f "requirements.txt" ]; then if [ -f "requirements.txt" ]; then
echo -e "${GREEN} requirements.txt trouvé${NC}" echo -e "${GREEN}[OK] requirements.txt trouvé${NC}"
# Vérifier si les modules sont installés # Vérifier si les modules sont installés
if python3 -c "import tabula" 2>/dev/null; then if python3 -c "import tabula" 2>/dev/null; then
echo -e "${GREEN} tabula-py installé${NC}" echo -e "${GREEN}[OK] tabula-py installé${NC}"
else else
echo -e "${YELLOW} tabula-py non installé${NC}" echo -e "${YELLOW}[ATTENTION] tabula-py non installé${NC}"
echo -e "${YELLOW} Installation: pip install -r requirements.txt${NC}" echo -e "${YELLOW} Installation: pip install -r requirements.txt${NC}"
fi fi
if python3 -c "import pandas" 2>/dev/null; then if python3 -c "import pandas" 2>/dev/null; then
echo -e "${GREEN} pandas installé${NC}" echo -e "${GREEN}[OK] pandas installé${NC}"
else else
echo -e "${YELLOW} pandas non installé${NC}" echo -e "${YELLOW}[ATTENTION] pandas non installé${NC}"
echo -e "${YELLOW} Installation: pip install -r requirements.txt${NC}" echo -e "${YELLOW} Installation: pip install -r requirements.txt${NC}"
fi fi
else else
echo -e "${RED} requirements.txt non trouvé${NC}" echo -e "${RED}[ERREUR] requirements.txt non trouvé${NC}"
exit 1 exit 1
fi fi
echo "" echo ""
@@ -69,17 +69,17 @@ echo ""
# Test 4: Vérifier que le script existe # Test 4: Vérifier que le script existe
echo -e "${YELLOW}Test 4: Vérification du script convert.py...${NC}" echo -e "${YELLOW}Test 4: Vérification du script convert.py...${NC}"
if [ -f "convert.py" ]; then if [ -f "convert.py" ]; then
echo -e "${GREEN} convert.py trouvé${NC}" echo -e "${GREEN}[OK] convert.py trouvé${NC}"
# Vérifier que le script est exécutable # Vérifier que le script est exécutable
if [ -x "convert.py" ]; then if [ -x "convert.py" ]; then
echo -e "${GREEN} convert.py est exécutable${NC}" echo -e "${GREEN}[OK] convert.py est exécutable${NC}"
else else
echo -e "${YELLOW} convert.py n'est pas exécutable${NC}" echo -e "${YELLOW}[ATTENTION] convert.py n'est pas exécutable${NC}"
echo -e "${YELLOW} Correction: chmod +x convert.py${NC}" echo -e "${YELLOW} Correction: chmod +x convert.py${NC}"
fi fi
else else
echo -e "${RED} convert.py non trouvé${NC}" echo -e "${RED}[ERREUR] convert.py non trouvé${NC}"
exit 1 exit 1
fi fi
echo "" echo ""
@@ -87,9 +87,9 @@ echo ""
# Test 5: Tester l'aide du script # Test 5: Tester l'aide du script
echo -e "${YELLOW}Test 5: Test de l'aide du script...${NC}" echo -e "${YELLOW}Test 5: Test de l'aide du script...${NC}"
if python3 convert.py --help &> /dev/null; then if python3 convert.py --help &> /dev/null; then
echo -e "${GREEN} L'aide du script fonctionne${NC}" echo -e "${GREEN}[OK] L'aide du script fonctionne${NC}"
else else
echo -e "${RED} L'aide du script ne fonctionne pas${NC}" echo -e "${RED}[ERREUR] L'aide du script ne fonctionne pas${NC}"
exit 1 exit 1
fi fi
echo "" echo ""
@@ -98,41 +98,41 @@ echo ""
echo -e "${YELLOW}Test 6: Vérification de Docker...${NC}" echo -e "${YELLOW}Test 6: Vérification de Docker...${NC}"
if command -v docker &> /dev/null; then if command -v docker &> /dev/null; then
DOCKER_VERSION=$(docker --version) DOCKER_VERSION=$(docker --version)
echo -e "${GREEN} Docker installé: $DOCKER_VERSION${NC}" echo -e "${GREEN}[OK] Docker installé: $DOCKER_VERSION${NC}"
# Vérifier que Docker daemon fonctionne # Vérifier que Docker daemon fonctionne
if docker info &> /dev/null; then if docker info &> /dev/null; then
echo -e "${GREEN} Docker daemon fonctionne${NC}" echo -e "${GREEN}[OK] Docker daemon fonctionne${NC}"
else else
echo -e "${YELLOW} Docker daemon ne répond pas${NC}" echo -e "${YELLOW}[ATTENTION] Docker daemon ne répond pas${NC}"
echo -e "${YELLOW} Vérifier: sudo systemctl status docker${NC}" echo -e "${YELLOW} Vérifier: sudo systemctl status docker${NC}"
fi fi
else else
echo -e "${YELLOW} Docker n'est pas installé (optionnel)${NC}" echo -e "${YELLOW}[ATTENTION] Docker n'est pas installé (optionnel)${NC}"
fi fi
echo "" echo ""
# Test 7: Vérifier le Dockerfile # Test 7: Vérifier le Dockerfile
echo -e "${YELLOW}Test 7: Vérification du Dockerfile...${NC}" echo -e "${YELLOW}Test 7: Vérification du Dockerfile...${NC}"
if [ -f "Dockerfile" ]; then if [ -f "Dockerfile" ]; then
echo -e "${GREEN} Dockerfile trouvé${NC}" echo -e "${GREEN}[OK] Dockerfile trouvé${NC}"
else else
echo -e "${RED} Dockerfile non trouvé${NC}" echo -e "${RED}[ERREUR] Dockerfile non trouvé${NC}"
fi fi
echo "" echo ""
# Test 8: Vérifier les fichiers de configuration # Test 8: Vérifier les fichiers de configuration
echo -e "${YELLOW}Test 8: Vérification des fichiers de configuration...${NC}" echo -e "${YELLOW}Test 8: Vérification des fichiers de configuration...${NC}"
if [ -f "config.example.env" ]; then if [ -f "config.example.env" ]; then
echo -e "${GREEN} config.example.env trouvé${NC}" echo -e "${GREEN}[OK] config.example.env trouvé${NC}"
else else
echo -e "${YELLOW} config.example.env non trouvé${NC}" echo -e "${YELLOW}[ATTENTION] config.example.env non trouvé${NC}"
fi fi
if [ -f ".env" ]; then if [ -f ".env" ]; then
echo -e "${GREEN} .env trouvé${NC}" echo -e "${GREEN}[OK] .env trouvé${NC}"
else else
echo -e "${YELLOW} .env non trouvé (optionnel)${NC}" echo -e "${YELLOW}[ATTENTION] .env non trouvé (optionnel)${NC}"
echo -e "${YELLOW} Création: cp config.example.env .env${NC}" echo -e "${YELLOW} Création: cp config.example.env .env${NC}"
fi fi
echo "" echo ""
@@ -140,15 +140,15 @@ echo ""
# Test 9: Vérifier la documentation # Test 9: Vérifier la documentation
echo -e "${YELLOW}Test 9: Vérification de la documentation...${NC}" echo -e "${YELLOW}Test 9: Vérification de la documentation...${NC}"
if [ -f "README.md" ]; then if [ -f "README.md" ]; then
echo -e "${GREEN} README.md trouvé${NC}" echo -e "${GREEN}[OK] README.md trouvé${NC}"
else else
echo -e "${RED} README.md non trouvé${NC}" echo -e "${RED}[ERREUR] README.md non trouvé${NC}"
fi fi
if [ -f "CHANGELOG.md" ]; then if [ -f "CHANGELOG.md" ]; then
echo -e "${GREEN} CHANGELOG.md trouvé${NC}" echo -e "${GREEN}[OK] CHANGELOG.md trouvé${NC}"
else else
echo -e "${YELLOW} CHANGELOG.md non trouvé${NC}" echo -e "${YELLOW}[ATTENTION] CHANGELOG.md non trouvé${NC}"
fi fi
echo "" echo ""
@@ -159,17 +159,17 @@ OPTIONAL_FILES=(".gitignore" ".dockerignore" "Makefile" "config.example.env")
for file in "${REQUIRED_FILES[@]}"; do for file in "${REQUIRED_FILES[@]}"; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
echo -e "${GREEN} $file${NC}" echo -e "${GREEN}[OK] $file${NC}"
else else
echo -e "${RED} $file (requis)${NC}" echo -e "${RED}[ERREUR] $file (requis)${NC}"
fi fi
done done
for file in "${OPTIONAL_FILES[@]}"; do for file in "${OPTIONAL_FILES[@]}"; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
echo -e "${GREEN} $file${NC}" echo -e "${GREEN}[OK] $file${NC}"
else else
echo -e "${YELLOW} $file (optionnel)${NC}" echo -e "${YELLOW}[ATTENTION] $file (optionnel)${NC}"
fi fi
done done
echo "" echo ""
@@ -179,7 +179,7 @@ echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} Résumé des tests${NC}" echo -e "${BLUE} Résumé des tests${NC}"
echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}========================================${NC}"
echo "" echo ""
echo -e "${GREEN}Tous les tests principaux sont passés !${NC}" echo -e "${GREEN}Tous les tests principaux sont passés !${NC}"
echo "" echo ""
echo -e "${BLUE}Prochaines étapes :${NC}" echo -e "${BLUE}Prochaines étapes :${NC}"
echo -e " 1. ${YELLOW}Développement local :${NC}" echo -e " 1. ${YELLOW}Développement local :${NC}"

View File

@@ -1,58 +1,58 @@
╔═══════════════════════════════════════════════════════════════════════╗ ╔═══════════════════════════════════════════════════════════════════════╗
║ ║ ║ ║
🎉 PROJET PDF2CSV V2.0 - AMÉLIORÉ 🎉 PROJET PDF2CSV V2.0 - AMÉLIORÉ
║ ║ ║ ║
Toutes les améliorations terminées ! ║ ║ Toutes les améliorations terminées !
║ ║ ║ ║
╚═══════════════════════════════════════════════════════════════════════╝ ╚═══════════════════════════════════════════════════════════════════════╝
📁 STRUCTURE DU PROJET STRUCTURE DU PROJET
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 CONVERT-PDF-DOCKER/ CONVERT-PDF-DOCKER/
├── 🐍 convert.py ← CODE PRINCIPAL (450+ lignes, refactorisé) ├── convert.py ← CODE PRINCIPAL (450+ lignes, refactorisé)
├── 🐳 Dockerfile ← Configuration Docker optimisée ├── Dockerfile ← Configuration Docker optimisée
├── 📦 requirements.txt ← Dépendances Python (tabula-py, pandas) ├── requirements.txt ← Dépendances Python (tabula-py, pandas)
├── 📚 DOCUMENTATION ├── DOCUMENTATION
│ ├── README.md ← Documentation complète (10 KB) │ ├── README.md ← Documentation complète (10 KB)
│ ├── QUICK_START.md ← Démarrage rapide │ ├── QUICK_START.md ← Démarrage rapide
│ ├── CHANGELOG.md ← Liste des améliorations (9 KB) │ ├── CHANGELOG.md ← Liste des améliorations (9 KB)
│ └── RÉSUMÉ_AMÉLIORATIONS.md ← Ce qui a été fait │ └── RÉSUMÉ_AMÉLIORATIONS.md ← Ce qui a été fait
├── ⚙️ CONFIGURATION ├── CONFIGURATION
│ ├── config.example.env ← Template de configuration │ ├── config.example.env ← Template de configuration
│ ├── .env ← Votre config (à créer) │ ├── .env ← Votre config (à créer)
│ ├── .gitignore ← Exclusions Git │ ├── .gitignore ← Exclusions Git
│ └── .dockerignore ← Exclusions Docker │ └── .dockerignore ← Exclusions Docker
└── 🛠️ OUTILS └── OUTILS
├── Makefile ← 15+ commandes pratiques ├── Makefile ← 15+ commandes pratiques
├── test_script.sh ← Tests automatiques ├── test_script.sh ← Tests automatiques
└── 📋_LISEZ_MOI.txt ← Ce fichier ! └── LISEZ_MOI.txt ← Ce fichier !
🚀 DÉMARRAGE RAPIDE (3 ÉTAPES) DÉMARRAGE RAPIDE (3 ÉTAPES)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ Construire l'image Docker 1. Construire l'image Docker
$ make build $ make build
2️⃣ Placer vos PDFs dans le dossier data/ 2. Placer vos PDFs dans le dossier data/
$ mkdir -p data $ mkdir -p data
$ cp vos_pdfs/*.pdf data/ $ cp vos_pdfs/*.pdf data/
3️⃣ Lancer la conversion 3. Lancer la conversion
$ make run $ make run
Résultat dans : data/fusion_total.csv Résultat dans : data/fusion_total.csv
📖 COMMANDES UTILES COMMANDES UTILES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔨 Avec Makefile (recommandé) Avec Makefile (recommandé)
├─ make help Affiche toutes les commandes ├─ make help Affiche toutes les commandes
├─ make build Construit l'image Docker ├─ make build Construit l'image Docker
├─ make run Lance la conversion ├─ make run Lance la conversion
@@ -62,54 +62,54 @@
├─ make status Affiche le statut ├─ make status Affiche le statut
└─ make dev Configure l'environnement └─ make dev Configure l'environnement
🐳 Avec Docker Avec Docker
├─ docker build -t pdf2csv . ├─ docker build -t pdf2csv .
├─ docker run --rm -v $(pwd)/data:/data pdf2csv ├─ docker run --rm -v $(pwd)/data:/data pdf2csv
└─ docker run --rm -v $(pwd)/data:/data pdf2csv --verbose └─ docker run --rm -v $(pwd)/data:/data pdf2csv --verbose
🐍 Avec Python (local) Avec Python (local)
├─ pip install -r requirements.txt ├─ pip install -r requirements.txt
├─ python convert.py ./data --verbose ├─ python convert.py ./data --verbose
└─ python convert.py --help └─ python convert.py --help
NOUVELLES FONCTIONNALITÉS V2.0 NOUVELLES FONCTIONNALITÉS V2.0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Gestion d'erreurs robuste - Gestion d'erreurs robuste
→ Continue le traitement même en cas d'erreur → Continue le traitement même en cas d'erreur
→ Messages d'erreur détaillés avec contexte → Messages d'erreur détaillés avec contexte
Logging professionnel - Logging professionnel
→ Niveaux de log (INFO, DEBUG, ERROR) → Niveaux de log (INFO, DEBUG, ERROR)
→ Mode verbeux : --verbose → Mode verbeux : --verbose
→ Timestamps automatiques → Timestamps automatiques
Type hints complets - Type hints complets
→ Code entièrement typé → Code entièrement typé
→ Meilleure auto-complétion IDE → Meilleure auto-complétion IDE
Configuration flexible - Configuration flexible
→ Variables d'environnement (.env) → Variables d'environnement (.env)
→ Arguments CLI (--mot-debut, --mot-fin) → Arguments CLI (--mot-debut, --mot-fin)
→ Configuration par défaut intelligente → Configuration par défaut intelligente
Validation des entrées - Validation des entrées
→ Vérification des fichiers PDF → Vérification des fichiers PDF
→ Validation des répertoires → Validation des répertoires
→ Messages d'erreur clairs → Messages d'erreur clairs
Nettoyage automatique - Nettoyage automatique
→ Fichiers temporaires supprimés → Fichiers temporaires supprimés
→ Option --no-clean pour debug → Option --no-clean pour debug
Arguments CLI - Arguments CLI
→ Chemin personnalisable → Chemin personnalisable
→ Options de personnalisation → Options de personnalisation
→ Aide complète (--help) → Aide complète (--help)
⚙️ CONFIGURATION CONFIGURATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Variables d'environnement disponibles : Variables d'environnement disponibles :
@@ -126,26 +126,26 @@
3. Lancer : make run-custom 3. Lancer : make run-custom
📊 STATISTIQUES DU PROJET STATISTIQUES DU PROJET
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📝 Code et Documentation Code et Documentation
├─ Lignes totales : 2 131 lignes ├─ Lignes totales : 2 131 lignes
├─ Code Python : 450+ lignes (+165% vs v1.0) ├─ Code Python : 450+ lignes (+165% vs v1.0)
├─ Documentation : ~28 KB (+1300% vs v1.0) ├─ Documentation : ~28 KB (+1300% vs v1.0)
├─ Fichiers créés : 12 fichiers ├─ Fichiers créés : 12 fichiers
└─ Commandes Makefile : 15+ commandes └─ Commandes Makefile : 15+ commandes
🎯 Qualité du code Qualité du code
├─ Gestion d'erreurs : Complète ├─ Gestion d'erreurs : Complète
├─ Logging : Professionnel ├─ Logging : Professionnel
├─ Type hints : 100% ├─ Type hints : 100%
├─ Docstrings : 100% ├─ Docstrings : 100%
├─ Validation : Robuste ├─ Validation : Robuste
└─ Note globale : A+ (Production-ready) └─ Note globale : A+ (Production-ready)
🧪 TEST DE L'INSTALLATION TEST DE L'INSTALLATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Lancez le script de test automatique : Lancez le script de test automatique :
@@ -153,58 +153,58 @@
$ ./test_script.sh $ ./test_script.sh
Ce script vérifie : Ce script vérifie :
Python installé - Python installé
Java installé - Java installé
Dépendances Python - Dépendances Python
Structure du projet - Structure du projet
Docker disponible - Docker disponible
Configuration - Configuration
📚 DOCUMENTATION À CONSULTER DOCUMENTATION À CONSULTER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 🚀 QUICK_START.md 1. QUICK_START.md
→ Commencer en 5 minutes → Commencer en 5 minutes
→ Exemples concrets → Exemples concrets
→ Résolution de problèmes → Résolution de problèmes
2. 📖 README.md 2. README.md
→ Documentation complète → Documentation complète
→ Toutes les fonctionnalités → Toutes les fonctionnalités
→ Cas d'usage avancés → Cas d'usage avancés
3. 📋 CHANGELOG.md 3. CHANGELOG.md
→ Détails des améliorations → Détails des améliorations
→ Comparaison avant/après → Comparaison avant/après
→ Explications techniques → Explications techniques
4. 📊 RÉSUMÉ_AMÉLIORATIONS.md 4. RÉSUMÉ_AMÉLIORATIONS.md
→ Vue d'ensemble des changements → Vue d'ensemble des changements
→ Statistiques du projet → Statistiques du projet
→ Bonnes pratiques appliquées → Bonnes pratiques appliquées
🆘 BESOIN D'AIDE ? BESOIN D'AIDE ?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📘 Aide intégrée Aide intégrée
├─ make help ├─ make help
├─ python convert.py --help ├─ python convert.py --help
└─ ./test_script.sh └─ ./test_script.sh
📝 Documentation Documentation
├─ cat QUICK_START.md ├─ cat QUICK_START.md
├─ cat README.md ├─ cat README.md
└─ cat CHANGELOG.md └─ cat CHANGELOG.md
🐛 Debug Debug
├─ make run-verbose ├─ make run-verbose
├─ make status ├─ make status
└─ docker logs <container> └─ docker logs <container>
💡 EXEMPLES D'UTILISATION EXEMPLES D'UTILISATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Exemple 1 : Utilisation basique Exemple 1 : Utilisation basique
@@ -241,53 +241,53 @@
--verbose --verbose
🎯 CE QUI A ÉTÉ AMÉLIORÉ CE QUI A ÉTÉ AMÉLIORÉ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HAUTE PRIORITÉ (Terminé) HAUTE PRIORITÉ (Terminé)
├─ Gestion d'erreurs robuste ├─ Gestion d'erreurs robuste
├─ Logging professionnel ├─ Logging professionnel
├─ Type hints complets ├─ Type hints complets
├─ Configuration externalisée ├─ Configuration externalisée
├─ Validation des entrées ├─ Validation des entrées
├─ Nettoyage automatique ├─ Nettoyage automatique
└─ Arguments CLI └─ Arguments CLI
📚 DOCUMENTATION (Terminé) DOCUMENTATION (Terminé)
├─ README.md amélioré (10 KB) ├─ README.md amélioré (10 KB)
├─ QUICK_START.md ajouté ├─ QUICK_START.md ajouté
├─ CHANGELOG.md complet ├─ CHANGELOG.md complet
└─ Documentation inline └─ Documentation inline
🛠️ OUTILS (Terminé) OUTILS (Terminé)
├─ Makefile (15+ commandes) ├─ Makefile (15+ commandes)
├─ Script de test ├─ Script de test
├─ requirements.txt ├─ requirements.txt
├─ .gitignore ├─ .gitignore
└─ .dockerignore └─ .dockerignore
🎉 RÉSULTAT FINAL RÉSULTAT FINAL
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Votre projet pdf2csv est maintenant : Votre projet pdf2csv est maintenant :
⭐⭐⭐⭐⭐ Production-ready Production-ready
├─ Code robuste et testé ├─ Code robuste et testé
├─ Gestion d'erreurs complète ├─ Gestion d'erreurs complète
└─ Logging professionnel └─ Logging professionnel
📚 Bien documenté Bien documenté
├─ 4 fichiers de documentation ├─ 4 fichiers de documentation
├─ Exemples concrets ├─ Exemples concrets
└─ Troubleshooting complet └─ Troubleshooting complet
🔧 Facile à utiliser Facile à utiliser
├─ Makefile avec 15+ commandes ├─ Makefile avec 15+ commandes
├─ CLI avec options flexibles ├─ CLI avec options flexibles
└─ Configuration en 3 niveaux └─ Configuration en 3 niveaux
🚀 Prêt à évoluer Prêt à évoluer
├─ Architecture extensible ├─ Architecture extensible
├─ Code typé et testé ├─ Code typé et testé
└─ Standards respectés └─ Standards respectés
@@ -295,7 +295,7 @@
╔═══════════════════════════════════════════════════════════════════════╗ ╔═══════════════════════════════════════════════════════════════════════╗
║ ║ ║ ║
Projet modernisé avec succès ! Projet modernisé avec succès !
║ ║ ║ ║
║ Consultez QUICK_START.md pour commencer immédiatement ║ ║ Consultez QUICK_START.md pour commencer immédiatement ║
║ ║ ║ ║
@@ -303,6 +303,6 @@
Version : 2.0 Version : 2.0
Date : 11 octobre 2025 Date : 11 octobre 2025
Statut : Production-ready Statut : Production-ready
Qualité : A+ (Code professionnel) Qualité : A+ (Code professionnel)