Aller au contenu principal
Guide développeur

Tesseract OCR en Python
avec pytesseract.

Un guide complet et testé de pytesseract : installation, API principale, prétraitement d'images, PDF, scores de confiance, configuration PSM/OEM, performance et erreurs courantes.

Démarrage rapide (trois lignes)

Installez d'abord le moteur, puis exécutez ceci. La configuration complète suit plus bas.

ocr.py
import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("image.png"))
print(text)

Installer pytesseract

pytesseract n'est qu'un wrapper : il appelle le binaire Tesseract, donc le moteur doit être installé au préalable.

bash
pip install pytesseract pillow
# optionnel, pour le prétraitement :
pip install opencv-python numpy
# optionnel, pour l'entrée PDF :
pip install pdf2image

Si le moteur n'est pas dans votre PATH (fréquent sous Windows), indiquez-le explicitement :

python
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

Nouveau avec le moteur ? Consultez le guide d'installation pour Windows, macOS, Linux, Docker et WSL.

API principale

pytesseract expose une fonction par type de sortie. Choisissez celle qui correspond à votre besoin.

FonctionRenvoieÀ utiliser quand
image_to_stringTexte brutVous ne voulez que le texte reconnu
image_to_dataBoîtes par mot + confianceSurligner le texte, filtrer les mots peu sûrs
image_to_boxesBoîtes par caractèreGéométrie au niveau du caractère
image_to_pdf_or_hocrPDF interrogeable ou hOCRCréer des PDF interrogeables ou des overlays web
image_to_osdDétection d'orientation et de scriptDétecter la rotation ou le script avant l'OCR
image_to_alto_xmlALTO XMLPipelines d'archivage / bibliothèques

Configuration : PSM, OEM, langues et liste de caractères

Passez les options sous forme de chaîne séparée par des espaces à config=.

config.py
# Un seul bloc de texte, moteur LSTM, français
text = pytesseract.image_to_string(img, lang="fra", config="--oem 3 --psm 6")

# Chiffres uniquement (totaux de reçus, relevés de compteurs)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")

# Langues combinées
text = pytesseract.image_to_string(img, lang="eng+fra")
PSMModeIdéal pour
3Entièrement automatique (par défaut)Documents standards
4Une colonne de tailles variablesArticles, pages à une colonne
6Un bloc de texte uniformeParagraphes, étiquettes
7Une seule ligne de texteLégendes d'une ligne, champs isolés
8Un seul motMots individuels
11Texte éparsReçus, texte d'interface dispersé
13Ligne bruteUne ligne sans astuces Tesseract

Modes OEM : --oem 1 (LSTM seul, par défaut en v5), --oem 0 (hérité), --oem 3 (auto). Référence complète dans la documentation.

Prétraitement d'images

Une entrée propre est le principal facteur de précision. Voici les étapes qui comptent le plus.

pretraitement.py
import cv2, numpy as np, pytesseract
from PIL import Image

image = cv2.imread("recu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Mettre à l'échelle le petit texte vers ~300 DPI
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# Réduire le bruit puis seuillage d'Otsu en noir et blanc
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

text = pytesseract.image_to_string(Image.fromarray(binary))

Positions et scores de confiance

Utilisez image_to_data pour obtenir des boîtes par mot et une confiance de 0 à 100, puis filtrez le bruit.

confiance.py
from pytesseract import Output

data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
    if text.strip() and float(conf) > 60:   # écarter le bruit peu fiable
        print(round(float(conf)), text)

OCR d'un PDF en Python

Tesseract travaille sur des images : rastérisez d'abord les pages avec pdf2image (qui nécessite poppler).

pdf.py
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader

pages = convert_from_path("scan.pdf", dpi=300)   # nécessite poppler
writer = PdfWriter()
for page in pages:
    pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
    writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("scan_interrogeable.pdf", "wb") as f:
    writer.write(f)

Sous Windows, passez le dossier bin de poppler via poppler_path=. Pour un flux plus complet, voir la documentation sur les formats de sortie.

Performance

pytesseract appelle la CLI à chaque appel, donc le débit dépend de la structure.

ApprocheQuandCompromis
pytesseract par appelScripts et tâches ponctuellesLance un processus par appel — lent en boucle
Regrouper en TIFF multipageBeaucoup de pages, mêmes réglagesUn processus pour plusieurs pages
multiprocessingBeaucoup d'images indépendantesUtilise tous les cœurs ; plus de mémoire
tesserocrFort volume, en processusBinding natif, configuration plus lourde

Catalogue d'erreurs

Ces erreurs couvrent la majorité des problèmes avec pytesseract.

ErreurCauseSolution
TesseractNotFoundErrorBinaire non installé ou absent du PATHInstallez le moteur ou définissez pytesseract.pytesseract.tesseract_cmd.
(-215:Assertion failed) src.type() == CV_8UC1Seuillage sur une image à 3 canauxConvertissez avec cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) d'abord.
Error opening data file ...fra.traineddataPaquet de langue manquantInstallez la langue ou définissez TESSDATA_PREFIX.
Sortie videDPI faible, mauvais PSM ou pas de texteMettez à l'échelle, testez --psm 6/7/11, prétraitez.
Très lent en boucleUn processus par appelRegroupez, utilisez multiprocessing ou tesserocr.

Mesurer la précision

Mesurez les taux d'erreur de caractères et de mots au lieu de juger la sortie à l'œil.

eval.py
import pytesseract, jiwer
from PIL import Image

hypothesis = pytesseract.image_to_string(Image.open("exemple.png"))
reference  = open("exemple.gt.txt").read()

print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))

Gardez un petit jeu d'images représentatives avec leur texte de référence comme tests de régression et relancez-les quand vous changez le prétraitement ou la configuration.

FAQ Python

Comment utiliser Tesseract OCR en Python ?

Installez d'abord le moteur, puis pip install pytesseract pillow. Ouvrez l'image avec Pillow et appelez pytesseract.image_to_string(img).

Pourquoi TesseractNotFoundError ?

pytesseract ne trouve pas le binaire. Installez le moteur, mettez-le dans le PATH ou définissez pytesseract.pytesseract.tesseract_cmd avec le chemin complet.

Comment améliorer la précision ?

Mettez à l'échelle ~300 DPI, niveaux de gris, seuillage, réduction du bruit, redressement et le bon --psm. Utilisez le lang= adapté et, pour les champs fixes, une liste de caractères autorisés.

Comment faire l'OCR d'un PDF ?

Utilisez pdf2image (avec poppler) pour convertir les pages en images, lancez pytesseract sur chacune et combinez avec image_to_pdf_or_hocr(..., extension="pdf").

Comment obtenir les scores de confiance ?

Utilisez image_to_data(..., output_type=Output.DICT) et filtrez la liste conf.

pytesseract est-il lent ?

Chaque appel lance un processus. Regroupez, utilisez multiprocessing ou passez au binding en processus tesserocr pour un fort débit.

Approfondissez le moteur et l'écosystème.