Ticket de caisse photographié, rendu en JSON par un LLM
Receipt OCR est une bibliothèque Python, avec sa commande receipt-ocr, qui transforme la photo d'un ticket de caisse en JSON : commerçant, adresse, date, heure, total et lignes d'achat. La lecture ne se fait pas sur la machine. Le paquet ramène l'image à 1080 pixels de côté au plus, l'encode en PNG et l'envoie à un modèle de vision par l'API Chat Completions d'OpenAI, le schéma attendu glissé dans le prompt.
Le dépôt contient un second module, indépendant : il repère les bords du ticket avec OpenCV, redresse l'image et la passe à Tesseract, qui rend du texte brut. Le LLM reçoit l'image, jamais ce texte. Tesseract.js porte le même moteur Tesseract dans le navigateur et sous Node.js, sans serveur.
Le comparatif des outils d'OCR open source situe Receipt OCR parmi les moteurs OCR, les modèles de vision et les convertisseurs de documents.
Schéma au choix, fournisseurs compatibles OpenAI
- Un premier JSON en trois commandes :
pip install receipt-ocr, une variableOPENAI_API_KEY, puisreceipt-ocr ticket.jpg. - Schéma au choix : un fichier JSON passé par
--schema_path, ou un dictionnaire en Python. Depuis la v0.3.1, le modejson_schemaexige du modèle un JSON Schema strict. - Un SDK, plusieurs fournisseurs : le paquet s'appuie sur le SDK
openai, queOPENAI_BASE_URLredirige. Le README donne les réglages de Gemini et de Groq. Le modèle par défaut estgpt-4.1. - Service web FastAPI :
docker compose -f app/docker-compose.yml uplance une API sur le port 8000, avecPOST /ocr/(image de 5 Mo au plus, schéma optionnel). - Un paquet court à relire : neuf fichiers Python et trois dépendances épinglées ; le prompt système tient dans
prompts.py.
Clé d'API requise et JSON non contrôlé par défaut
Une clé d'API et un modèle qui lit les images sont obligatoires. Le module LLM n'a aucun mode local, et le README rappelle que la clé doit avoir des crédits. Le code accepte toute adresse compatible OpenAI, mais la documentation ne décrit que trois services en ligne, OpenAI, Gemini et Groq : chaque ticket part chez le fournisseur configuré. Unstract, qui extrait lui aussi du JSON par LLM, accepte un modèle local via Ollama, mais fait tourner PostgreSQL, Redis et RabbitMQ, avec 8 Go de RAM au minimum.
Le JSON n'est pas contrôlé par défaut. Le schéma n'est alors qu'une consigne dans le prompt. Le mode json_schema ne s'active que depuis Python : ni la commande ni le service web ne l'exposent. Une réponse qui n'est pas du JSON valide ne lève pas d'erreur : la bibliothèque renvoie un objet {"error": ...}. Rien ne vérifie que les lignes s'additionnent au total.
Le service web est un point de départ. Le README le dit « production-ready », mais POST /ocr/ n'a pas d'authentification, traite une image par requête et refuse tout fichier qui n'est pas une image, PDF compris. Aucune image Docker n'est publiée (la demande de fusion #52 attend depuis mai 2026). Dans l'issue #29, ouverte en novembre 2025, un utilisateur relève environ 22 secondes par requête.
Le module Tesseract ne vient pas avec le paquet. pip install receipt-ocr n'installe que le module LLM. Pour le module Tesseract, il faut cloner le dépôt et installer Tesseract et OpenCV. Ce module échoue s'il ne trouve pas un contour à quatre coins, et l'issue #4, ouverte, signale que le redressement abîme parfois le texte. Aucune langue n'est passée à Tesseract, qui lit alors en anglais par défaut.
Un mainteneur, une v0.4.0 sans fonction nouvelle. Sortie le 6 octobre 2026, près d'un an après la v0.3.1, la v0.4.0 apporte des tests, de la CI, des dépendances à jour et l'abandon de Python 3.9. Bhimraj Yadav signe 66 des 86 commits, les autres viennent de Dependabot et de pre-commit.ci. Le paquet PyPI se déclare en « Beta ».
