Aller au contenu principal

Premier appel OCR en Python

Votre premier appel OCR

Dans cette leçon, vous allez écrire un script Python complet pour extraire le texte d’un document PDF via l’API OCR de Mistral. Vous verrez comment envoyer le document, récupérer la réponse et reconstruire le contenu.

Prérequis

Assurez-vous d’avoir :

pip install mistralai

Et votre clé API configurée :

export MISTRAL_API_KEY="votre-cle-api"

Script complet : extraction de texte

Voici un script de bout en bout pour extraire le texte d’un PDF :

import os
from mistralai import Mistral

# Initialisation du client
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

# Appel OCR sur un PDF public
ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document={
        "type": "document_url",
        "document_url": "https://arxiv.org/pdf/2201.04234"
    }
)

# Affichage du nombre de pages
print(f"Nombre de pages : {len(ocr_response.pages)}")

# Affichage du contenu de chaque page
for page in ocr_response.pages:
    print(f"\n--- Page {page.index + 1} ---")
    print(page.markdown)

Extraction d’un fichier local

Pour traiter un fichier sur votre machine :

import os
import base64
from mistralai import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

# Lecture et encodage du fichier local
chemin_fichier = "facture_fournisseur.pdf"

with open(chemin_fichier, "rb") as f:
    document_base64 = base64.b64encode(f.read()).decode("utf-8")

# Appel OCR
ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document={
        "type": "document_base64",
        "document_base64": document_base64
    }
)

# Concaténation de tout le texte
texte_complet = "\n\n".join(
    page.markdown for page in ocr_response.pages
)

print(texte_complet)

Sauvegarde du résultat en fichier Markdown

En pratique, vous voudrez souvent sauvegarder l’extraction :

import os
import base64
from mistralai import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

def extraire_pdf(chemin_pdf: str, chemin_sortie: str) -> None:
    """Extrait le texte d'un PDF et le sauvegarde en Markdown."""

    with open(chemin_pdf, "rb") as f:
        document_base64 = base64.b64encode(f.read()).decode("utf-8")

    ocr_response = client.ocr.process(
        model="mistral-ocr-latest",
        document={
            "type": "document_base64",
            "document_base64": document_base64
        }
    )

    with open(chemin_sortie, "w", encoding="utf-8") as f:
        for page in ocr_response.pages:
            f.write(f"<!-- Page {page.index + 1} -->\n\n")
            f.write(page.markdown)
            f.write("\n\n---\n\n")

    print(f"Extraction terminée : {len(ocr_response.pages)} pages")
    print(f"Résultat sauvegardé dans : {chemin_sortie}")


# Utilisation
extraire_pdf("rapport_annuel.pdf", "rapport_annuel.md")

Extraction d’une image

OCR 3 fonctionne aussi sur les images individuelles :

import os
import base64
from mistralai import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

# Encodage d'une image
with open("facture_scan.png", "rb") as f:
    image_base64 = base64.b64encode(f.read()).decode("utf-8")

# Appel OCR sur une image
ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document={
        "type": "image_base64",
        "image_base64": image_base64
    }
)

# Une seule "page" pour une image
print(ocr_response.pages[0].markdown)

Reconstruction du document avec images

Le Markdown retourné contient des références aux images sous forme ![imageN.jpg](imageN.jpg). Vous pouvez les remplacer par les images base64 extraites :

import os
import base64
import re
from mistralai import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document={
        "type": "document_url",
        "document_url": "https://arxiv.org/pdf/2201.04234"
    },
    include_image_base64=True
)

for page in ocr_response.pages:
    markdown = page.markdown

    # Remplacement des références images par le base64
    for image in page.images:
        placeholder = f"![{image.id}]({image.id})"
        data_uri = f"![{image.id}](data:image/jpeg;base64,{image.image_base64})"
        markdown = markdown.replace(placeholder, data_uri)

    print(markdown[:500])

Exercice pratique

Essayez d’extraire le contenu d’un de vos propres documents :

  1. Choisissez un PDF ou une image scannée
  2. Adaptez le script d’extraction locale
  3. Comparez le résultat avec le document original
  4. Identifiez les éventuelles erreurs d’extraction

Points clés à retenir

  • L’appel OCR se fait en 3 lignes : client, process, lecture des pages
  • Utilisez base64 pour les fichiers locaux, URL pour les documents publics
  • Le résultat est du Markdown structuré, directement exploitable
  • Les images extraites peuvent être recombinées avec le texte
  • Sauvegardez toujours vos extractions pour éviter des appels API répétés