Skip to content

Repository files navigation

Watcher OCR PDF → Base64

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/.

Table des matières

Fonctionnalités

  • 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_history pour é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).

Prérequis système

Sur Debian/Ubuntu, installez au minimum :

sudo apt update
sudo apt install -y tesseract-ocr tesseract-ocr-eng ghostscript qpdf libtiff5

Pour 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).

Installation Python

Créer et activer un virtualenv puis installer les dépendances :

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Le projet cible Python 3.x (testé sur 3.10+). Des optimisations pour versions récentes peuvent exister dans le code.

Démarrage rapide

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_out

Sorties attendues : ./ocr_out/<nom>_ocr.pdf (ou l'original si pas d'OCR) et ./ocr_out/<nom>.base64.

Mode Odoo (envoi)

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_PASSWORD

Lancer le watcher en mode connecté :

python3 watcher_base64_threading.py --input-dir ./pdfs --output-dir ./ocr_out

Comportement principal :

  • Recherche d'un quality.document portant le même nom, ou correspondance par préfixe avec un aa.worksheet.template.
  • Si l'envoi est réussi : suppression des fichiers _ocr.pdf et .base64, et ajout à l'historique.
  • Si échec logique (ex : template introuvable) : fichiers conservés et nom inscrit dans l'historique pour éviter des boucles.

Envoi massif

Si vous avez déjà des fichiers .base64 et souhaitez les envoyer en masse vers Odoo :

python3 send_base64_to_odoo.py

Options utiles :

  • --csv pour 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.txt thread-safe recense uniquement les envois ayant retourné un succès strict.

Mode CSV (batch)

Exemple :

python3 watcher_csv.py \
  --input-dir /mnt/share \
  --output-dir ./ocr_out \
  --csv-file ./files_to_process.csv \
  --csv-only

CSV attendu : colonnes complete_name et file_path. Le script tente plusieurs heuristiques pour résoudre les chemins relatifs/absolus.

Déploiement en service (systemd / WSL)

Résumé :

  1. (WSL) Activer systemd si nécessaire :
[boot]
systemd=true
  1. Créer un service systemd (ex : /etc/systemd/system/ocr-watcher.service) en injectant les variables d'environnement et en utilisant le venv pour ExecStart.

  2. Activer et démarrer :

sudo systemctl daemon-reload
sudo systemctl enable ocr-watcher.service
sudo systemctl start ocr-watcher.service

Consultez les scripts d'exemple fournis dans le dépôt pour un service type.

Options CLI principales

  • --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 (half ou full).
  • --ocr-jobs : jobs par fichier pour ocrmypdf.
  • --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.

Sorties & historique

  • _ocr.pdf : résultat OCR (ou original si non disponible).
  • .base64 : encodage du PDF écrit.
  • .processed_history : historique horodaté dans le dossier de sortie.

Dépannage rapide

  • 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_history si un fichier est traité en boucle.
  • Si les performances OCR sont faibles : réduire --ocr-jobs lorsque --workers est élevé.

Exemples rapides

  • 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

About

Un utilitaire surveille un répertoire pour détecter des fichiers PDF entrants, tente d'exécuter l'OCR (via ocrmypdf) et écrit deux sorties <nom>_ocr.pdf et <nom>.base64

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages