# 📄 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