Files
pdf2csv/README.md
2025-10-12 02:10:57 +02:00

382 lines
10 KiB
Markdown

# 📄 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.
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
-**Gestion d'erreurs robuste** : Traitement gracieux des erreurs avec logs détaillés
-**Logging professionnel** : Logs structurés avec niveaux (INFO, DEBUG, ERROR)
-**Type hints** : Code entièrement typé pour une meilleure maintenabilité
-**Configuration flexible** : Variables d'environnement et arguments CLI
-**Validation des entrées** : Vérification de la validité des fichiers PDF
-**Nettoyage automatique** : Suppression des fichiers temporaires
-**Arguments CLI** : Paramétrage via ligne de commande
-**Requirements.txt** : Gestion des dépendances standardisée
---
## 🚀 Fonctionnalités
### Extraction
- Utilise `tabula-py` pour extraire les tableaux depuis tous les fichiers PDF
- Supporte les PDFs multi-pages
- Gestion d'erreurs pour chaque fichier (continue en cas d'échec)
### Nettoyage des données
- Supprime les **N premières lignes** (configurable, défaut: 3)
- Supprime jusqu'à la ligne contenant un mot-clé de début (défaut: `SOLDE`)
- Supprime toute ligne dont la première colonne contient un mot-clé (défaut: `date`)
- Supprime à partir d'un mot-clé de fin (défaut: `Total des mouvements`)
- Fusionne les lignes fragmentées
- Nettoie les séparateurs de milliers dans les montants
### Fusion et export
- Fusionne tous les CSV en un seul fichier final
- Ajoute l'en-tête automatiquement
- Produit un fichier CSV propre et standardisé
### Logging et monitoring
- Logs détaillés de chaque étape
- Mode verbeux disponible (`--verbose`)
- Résumé de traitement avec statistiques
---
## 📦 Installation
### Option 1 : Docker (Recommandé)
```bash
# Cloner le dépôt
git clone https://github.com/votre-user/pdf2csv.git
cd pdf2csv
# Construire l'image
docker build -t pdf2csv:latest .
```
### Option 2 : Installation locale
```bash
# Cloner le dépôt
git clone https://github.com/votre-user/pdf2csv.git
cd pdf2csv
# Installer les dépendances (Python 3.11+ recommandé)
pip install -r requirements.txt
# Java est requis pour tabula-py
# Sur Ubuntu/Debian :
sudo apt-get install openjdk-17-jre-headless
```
---
## 🎯 Utilisation
### Utilisation avec Docker
**Utilisation basique :**
```bash
# Placez vos PDFs dans un dossier (ex: ./mes_pdfs/)
docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest
```
**Mode verbeux :**
```bash
docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest --verbose
```
**Avec variables d'environnement personnalisées :**
```bash
docker run --rm \
-v $(pwd)/mes_pdfs:/data \
-e MOT_DEBUT="BALANCE" \
-e MOT_FIN="Total général" \
pdf2csv:latest
```
**Avec fichier de configuration :**
```bash
# Copiez le fichier d'exemple
cp config.example.env .env
# Éditez .env selon vos besoins
nano .env
# Lancez avec le fichier de configuration
docker run --rm \
-v $(pwd)/mes_pdfs:/data \
--env-file .env \
pdf2csv:latest
```
**Conserver les fichiers temporaires :**
```bash
docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest --no-clean
```
### Utilisation locale (Python)
```bash
# Utilisation basique
python convert.py /chemin/vers/pdfs
# Mode verbeux
python convert.py /chemin/vers/pdfs --verbose
# Personnaliser les mots-clés
python convert.py /chemin/vers/pdfs --mot-debut "BALANCE" --mot-fin "Total"
# Afficher l'aide
python convert.py --help
```
---
## ⚙️ Configuration
### Variables d'environnement
| Variable | Défaut | Description |
|----------|--------|-------------|
| `MOT_DEBUT` | `SOLDE` | Mot-clé marquant le début des données (supprime tout avant) |
| `MOT_FIN` | `Total des mouvements` | Mot-clé marquant la fin des données (supprime tout après) |
| `MOT_DATE` | `date` | Mot-clé dans les en-têtes à ignorer |
| `SKIP_LINES` | `3` | Nombre de lignes à sauter au début |
| `CLEAN_TEMP_FILES` | `true` | Supprime les fichiers temporaires (`true`/`false`) |
| `TABULA_LATTICE` | `true` | Mode lattice de Tabula (`true`/`false`) |
| `TABULA_PAGES` | `all` | Pages à extraire (`all`, `1`, `1-3`, etc.) |
### Arguments CLI
```bash
usage: convert.py [-h] [-v] [--mot-debut MOT_DEBUT] [--mot-fin MOT_FIN]
[--no-clean] [workdir]
Arguments positionnels:
workdir Répertoire contenant les PDFs (défaut: /data)
Options:
-h, --help Affiche l'aide
-v, --verbose Active le mode verbeux (DEBUG)
--mot-debut Surcharge le mot-clé de début
--mot-fin Surcharge le mot-clé de fin
--no-clean Conserve les fichiers temporaires
```
---
## 📝 Exemples
### Exemple 1 : Relevés bancaires standards
```bash
# Structure :
mes_pdfs/
├── releve_janvier.pdf
├── releve_fevrier.pdf
└── releve_mars.pdf
# Commande :
docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest
# Résultat :
mes_pdfs/
├── releve_janvier.pdf
├── releve_janvier_final.csv
├── releve_fevrier.pdf
├── releve_fevrier_final.csv
├── releve_mars.pdf
├── releve_mars_final.csv
└── fusion_total.csv ← Fichier final fusionné
```
### Exemple 2 : Format personnalisé
```bash
# Pour des relevés avec des mots-clés différents
docker run --rm \
-v $(pwd)/mes_pdfs:/data \
-e MOT_DEBUT="BALANCE" \
-e MOT_FIN="TOTAL OPERATIONS" \
-e SKIP_LINES="5" \
pdf2csv:latest --verbose
```
### Exemple 3 : Développement local
```bash
# Installation des dépendances
pip install -r requirements.txt
# Test sur un dossier local
python convert.py ./test_pdfs --verbose
# Avec personnalisation
python convert.py ./test_pdfs \
--mot-debut "SOLDE INITIAL" \
--mot-fin "SOLDE FINAL" \
--verbose
```
---
## 🔍 Logs et débogage
### Logs normaux
```
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: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 - 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:25 - INFO - ✓ Fichier fusionné créé : fusion_total.csv (132 lignes)
2025-10-11 14:23:25 - INFO - ============================================================
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 - - Erreurs : 0
2025-10-11 14:23:25 - INFO - ============================================================
```
### Mode verbeux
Utilisez `--verbose` pour des logs détaillés :
```bash
docker run --rm -v $(pwd)/mes_pdfs:/data pdf2csv:latest --verbose
```
Affiche des informations supplémentaires sur :
- Délimiteurs CSV détectés
- Nombre de lignes supprimées à chaque étape
- En-têtes détectées
- Fusion de lignes
- Fichiers temporaires
---
## 🐛 Résolution de problèmes
### Erreur : "Aucun PDF trouvé"
- Vérifiez que les fichiers ont bien l'extension `.pdf`
- Vérifiez le montage du volume Docker : `-v $(pwd)/mes_pdfs:/data`
### Erreur : "Erreur lors de la conversion"
- Vérifiez que le PDF contient bien des tableaux (pas juste du texte)
- Essayez avec `TABULA_LATTICE=false` pour les PDFs sans bordures
- Utilisez `--verbose` pour voir les détails de l'erreur
### Les données sont incorrectes
- Ajustez les mots-clés : `--mot-debut`, `--mot-fin`
- Modifiez `SKIP_LINES` si nécessaire
- Utilisez `--verbose` pour voir les étapes de nettoyage
### Encodage de caractères
- Le script utilise UTF-8 par défaut
- Java est configuré avec `JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"`
---
## 🏗️ Architecture du code
```
convert.py
├── Configuration # Classe de configuration centralisée
├── temporary_file_tracker() # Gestionnaire de contexte pour fichiers temporaires
├── valider_fichier_pdf() # Validation des entrées
├── detect_delimiter() # Détection auto du séparateur CSV
├── supprimer_lignes_par_mot_cle() # Fonction utilitaire
├── nettoyer_csv_texte() # Logique de nettoyage principale
├── convertir_et_nettoyer() # Orchestration conversion + nettoyage
├── fusionner_csv() # Fusion des fichiers
├── traitement_batch() # Traitement complet batch
└── main() # Point d'entrée CLI
```
---
## 🧪 Tests
```bash
# Créer un dossier de test avec des PDFs échantillons
mkdir test_pdfs
cp vos_pdfs_test/*.pdf test_pdfs/
# Test local
python convert.py test_pdfs --verbose
# Test Docker
docker build -t pdf2csv:test .
docker run --rm -v $(pwd)/test_pdfs:/data pdf2csv:test --verbose
# Vérifier les résultats
ls -lh test_pdfs/
cat test_pdfs/fusion_total.csv
```
---
## 📄 Licence
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
---
## 🤝 Contribution
Les contributions sont les bienvenues ! N'hésitez pas à :
1. Fork le projet
2. Créer une branche (`git checkout -b feature/amelioration`)
3. Commit vos changements (`git commit -am 'Ajout nouvelle fonctionnalité'`)
4. Push vers la branche (`git push origin feature/amelioration`)
5. Créer une Pull Request
---
## 📞 Support
Pour toute question ou problème :
- Ouvrez une issue sur GitHub
- Consultez les logs avec `--verbose`
- Vérifiez la configuration des variables d'environnement
---
## 🔄 Changelog
### v2.0 (2025-10-11)
- ✨ Refactoring complet du code
- ✨ Ajout de la gestion d'erreurs robuste
- ✨ Logging professionnel avec niveaux
- ✨ Type hints pour tout le code
- ✨ Configuration via variables d'environnement
- ✨ Arguments CLI avec argparse
- ✨ Validation des entrées
- ✨ Nettoyage automatique des fichiers temporaires
- ✨ Documentation complète
- 📦 requirements.txt standardisé
- 🐛 Corrections de bugs divers
### v1.0
- 🎉 Version initiale
- Conversion PDF → CSV avec tabula
- Nettoyage basique
- Fusion de fichiers