Un utilitaire qui surveille un répertoire pour détecter des PDFs entrants, tente d'exécuter l'OCR (via ocrmypdf), compresse les PDFs (Ghostscript) et écrit deux sorties : <nom>_ocr.pdf et <nom>.base64. Optionnellement, il peut envoyer les fichiers encodés vers un serveur Odoo.
Le code expose des scripts en racine (wrappers) et la logique réutilisable dans le package watcher/.
- Fonctionnalités
- Prérequis système
- Installation Python
- Démarrage rapide
- Mode Odoo (envoi)
- Envoi massif (send_base64_to_odoo.py)
- Mode CSV (batch)
- Déploiement en service (systemd / WSL)
- Options CLI principales
- Sorties & historique
- Dépannage rapide
- Exemples rapides
- Détection et traitement automatique des nouveaux fichiers PDF dans un répertoire.
- OCR (
ocrmypdf) avec fallback sur l'original si l'OCR échoue. - Compression Ghostscript (best-effort) et options de sortie PDF/A.
- Support JBIG2 (lossless/lossy) si un binaire compatible est présent.
- Historique
.processed_historypour éviter les retraitements. - Mode CSV pour traiter des lots listés en entrée.
- Envoi vers Odoo (mode connecté) avec nettoyage automatique après envoi réussi.
- Traitement parallèle configurable (workers, workers-auto).
Sur Debian/Ubuntu, installez au minimum :
sudo apt update
sudo apt install -y tesseract-ocr tesseract-ocr-eng ghostscript qpdf libtiff5Pour JBIG2 (optionnel) : installez un binaire jbig2 ou jbig2enc disponible dans le PATH.
Assurez-vous que ocrmypdf est installé (le dépôt contient requirements.txt).
Créer et activer un virtualenv puis installer les dépendances :
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtLe projet cible Python 3.x (testé sur 3.10+). Des optimisations pour versions récentes peuvent exister dans le code.
Surveiller un dossier et écrire les sorties :
export OCR_INPUT_DIRECTORY=./pdfs
export OCR_OUTPUT_DIRECTORY=./ocr_out # facultatif, défaut: <input>/base64
python3 watcher_base64_threading.py --input-dir ./pdfs --output-dir ./ocr_outSorties attendues : ./ocr_out/<nom>_ocr.pdf (ou l'original si pas d'OCR) et ./ocr_out/<nom>.base64.
Variables d'environnement attendues :
ODOO_URL=https://mon-odoo.com # /jsonrpc ajouté si absent
ODOO_DATABASE=ma-base # ou ODOO_DB
ODOO_USER=mon-user
ODOO_API_KEY=mon-api-key # ou ODOO_PASSWORDLancer le watcher en mode connecté :
python3 watcher_base64_threading.py --input-dir ./pdfs --output-dir ./ocr_outComportement principal :
- Recherche d'un
quality.documentportant le même nom, ou correspondance par préfixe avec unaa.worksheet.template. - Si l'envoi est réussi : suppression des fichiers
_ocr.pdfet.base64, et ajout à l'historique. - Si échec logique (ex : template introuvable) : fichiers conservés et nom inscrit dans l'historique pour éviter des boucles.
Si vous avez déjà des fichiers .base64 et souhaitez les envoyer en masse vers Odoo :
python3 send_base64_to_odoo.pyOptions utiles :
--csvpour fournir une liste de fichiers.- Le script utilise les variables Odoo de l'environnement et gère plusieurs workers en parallèle.
- Un fichier
processed_history.txtthread-safe recense uniquement les envois ayant retourné un succès strict.
Exemple :
python3 watcher_csv.py \
--input-dir /mnt/share \
--output-dir ./ocr_out \
--csv-file ./files_to_process.csv \
--csv-onlyCSV attendu : colonnes complete_name et file_path. Le script tente plusieurs heuristiques pour résoudre les chemins relatifs/absolus.
Résumé :
- (WSL) Activer systemd si nécessaire :
[boot]
systemd=true-
Créer un service systemd (ex :
/etc/systemd/system/ocr-watcher.service) en injectant les variables d'environnement et en utilisant le venv pourExecStart. -
Activer et démarrer :
sudo systemctl daemon-reload
sudo systemctl enable ocr-watcher.service
sudo systemctl start ocr-watcher.serviceConsultez les scripts d'exemple fournis dans le dépôt pour un service type.
--input-dir(obligatoire) : dossier à surveiller.--output-dir: dossier de sortie (par défaut:<input>/base64).--workers: nombre max de PDFs traités en parallèle.--workers-auto: auto-calcul (halfoufull).--ocr-jobs: jobs par fichier pourocrmypdf.--output-type {pdf,pdfa}: sortie classique ou PDF/A-2B.--jbig2 {off,lossless,lossy}: compression JBIG2 (nécessite binaire).--initial-scan / --no-initial-scan: contrôler le scan initial.--csv-file+--csv-only: options CSV.--poll / --no-poll: forcer polling ou inotify.--retries: tentatives d'attente de stabilité de fichier.--loglevel:DEBUG,INFO,WARNING,ERROR.
_ocr.pdf: résultat OCR (ou original si non disponible)..base64: encodage du PDF écrit..processed_history: historique horodaté dans le dossier de sortie.
- Activer les logs détaillés :
python3 watcher_base64_threading.py --loglevel DEBUG- Voir les logs systemd :
sudo journalctl -u ocr-watcher.service -f- Vérifier les permissions et le fichier
.processed_historysi un fichier est traité en boucle. - Si les performances OCR sont faibles : réduire
--ocr-jobslorsque--workersest élevé.
- Local, sans Odoo :
python3 watcher_base64_threading.py --input-dir ./pdfs --output-dir ./ocr_out --workers 2 --ocr-jobs 1- Odoo + PDF/A + JBIG2 :
ODOO_URL=https://odoo.example.com ODOO_DATABASE=ma-base ODOO_USER=me ODOO_API_KEY=cle \
python3 watcher_base64_threading.py --input-dir ./pdfs --output-dir ./ocr_out --output-type pdfa --jbig2 lossless- Batch CSV puis watcher continu :
python3 watcher_csv.py --input-dir /mnt/share --output-dir ./ocr_out --csv-file ./files_to_process.csv