erase icons in docs
This commit is contained in:
102
CHANGELOG.md
102
CHANGELOG.md
@@ -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+**
|
||||||
|
|
||||||
|
|||||||
62
Makefile
62
Makefile
@@ -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)/"
|
||||||
|
|||||||
@@ -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 !
|
||||||
|
|
||||||
|
|||||||
76
README.md
76
README.md
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -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}"
|
||||||
|
|||||||
162
📋_LISEZ_MOI.txt
162
📋_LISEZ_MOI.txt
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user