Reconnaissance optique des caractères (OCR) avec Document AI et Python

1. Présentation

Qu'est-ce que Document AI ?

Document AI est une solution de reconnaissance de documents qui exploite des données non structurées (par exemple, des documents, des e-mails, des factures, des formulaires, etc.) et en facilite la compréhension, l'analyse et l'utilisation. L'API fournit une structure via la classification de contenu, l'extraction d'entités, la recherche avancée, etc.

Dans cet atelier, vous allez apprendre à effectuer une reconnaissance optique des caractères à l'aide de l'API Document AI avec Python.

Nous allons utiliser un fichier PDF du roman classique "Winnie l'ourson" d'Alan Alexander Milne, qui est récemment entré dans le domaine public aux États-Unis. Ce fichier a été scanné et numérisé par Google Livres.

Points abordés

  • Activer l'API Document AI
  • Authentifier les requêtes API
  • Installer la bibliothèque cliente pour Python
  • Utiliser les API de traitement en ligne et par lot
  • Analyser le texte d'un fichier PDF

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Chrome ou Firefox
  • Maîtrise de l'utilisation de Python (3.9+)

Enquête

Comment allez-vous utiliser ce tutoriel ?

Je vais le lire uniquement Je vais le lire et effectuer les exercices

Quel est votre niveau d'expérience avec Python ?

Débutant Intermédiaire Expert

Quel est votre niveau d'expérience avec les services Google Cloud ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

Sélectionner un projet

Nouveau projet

Obtenir l&#39;ID du projet

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud. (L'ID ci-dessus est déjà pris ; vous devez en trouver un autre). Vous devrez indiquer cet ID ultérieurement en tant que PROJECT_ID.

  1. Vous devez ensuite activer la facturation dans la console Cloud pour pouvoir utiliser les ressources Google Cloud.

Veillez à suivre les instructions figurant dans la section "Effectuer un nettoyage". Cette section vous indique comment arrêter les ressources afin d'éviter qu'elles ne vous soient facturées au-delà de ce tutoriel. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que vous puissiez exécuter Google Cloud à distance depuis votre ordinateur portable, vous allez utiliser Google Cloud Shell, un environnement de ligne de commande exécuté dans le cloud, lors de cet atelier de programmation.

Activer Cloud Shell

  1. Dans la console Cloud, cliquez sur Activer Cloud Shell Activer Cloud Shell.

Activer Cloud Shell

Si vous n'avez jamais démarré Cloud Shell auparavant, un écran intermédiaire s'affiche en dessous de la ligne de flottaison, décrivant de quoi il s'agit. Si tel est le cas, cliquez sur Continuer. Cet écran ne s'affiche qu'une seule fois. Voici à quoi il ressemble :

Intro Cloud Shell

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes. Cloud Shell

Cloud Shell vous permet d'accéder au terminal d'une machine virtuelle hébergée dans le cloud. La machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un simple navigateur.

Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est déjà défini avec votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*      <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

3. Activer l'API Document AI

Avant de pouvoir utiliser Document AI, vous devez activer l'API. Pour ce faire, utilisez l'interface de ligne de commande gcloud ou Cloud Console.

Utiliser la CLI gcloud

  1. Si vous n'utilisez pas Cloud Shell, suivez la procédure décrite dans Installer la CLI gcloud sur votre ordinateur local.
  2. Les API peuvent être activées à l'aide des commandes gcloud suivantes.
gcloud services enable documentai.googleapis.com storage.googleapis.com

L'écran qui s'affiche devrait ressembler à ce qui suit :

Operation "operations/..." finished successfully.

Utiliser Cloud Console

Ouvrez la console Cloud dans votre navigateur.

  1. Dans la barre de recherche située en haut de la console, recherchez l'API Document AI, puis cliquez sur Activer pour utiliser l'API dans votre projet Google Cloud.

API Search

  1. Répétez l'étape précédente pour l'API Google Cloud Storage.

Vous pouvez maintenant utiliser Document AI.

4. Créer et tester un processeur

Vous devez d'abord créer une instance du processeur de reconnaissance optique des caractères dans les documents qui exécutera l'extraction. Pour ce faire, utilisez la console Cloud ou l'API de gestion des processeurs.

Console Cloud

  1. Dans la console, accédez à la page de présentation de la plate-forme Document AI.Console de présentation de Document AI
  2. Cliquez sur Explorer les processeurs et sélectionnez Reconnaissance optique des caractères dans les documentsProcesseurs
  3. Donnez-lui le nom codelab-ocr (ou un autre nom facile à mémoriser), puis sélectionnez la région la plus proche sur la liste.
  4. Cliquez sur Créer pour créer le processeur.
  5. Copiez l'ID de votre processeur. Vous devrez l'utiliser ultérieurement dans votre code. ID du processeur

Vous pouvez tester votre processeur dans la console en important un document. Cliquez sur Importer un document de test, puis sélectionnez le document à analyser.

Vous pouvez télécharger le fichier PDF ci-dessous, qui contient les 3 premières pages de notre roman.

Page de titre

Votre résultat doit se présenter comme suit : Livre analysé

Bibliothèque cliente Python

Suivez l'atelier de programmation suivant pour apprendre à gérer les processeurs Document AI avec la bibliothèque cliente Python :

Gérer les processeurs Document AI avec Python (atelier de programmation)

5. Authentifier les requêtes API

Pour envoyer des requêtes à l'API Document AI, vous devez utiliser un compte de service. Ce compte de service appartient à votre projet. Il permet à la bibliothèque cliente Python d'envoyer des requêtes API. Comme tout autre compte utilisateur, un compte de service est représenté par une adresse e-mail. Dans cette section, vous allez utiliser le Cloud SDK pour créer un compte de service, puis créer les identifiants nécessaires pour vous authentifier en tant que compte de service.

Ouvrez d'abord Cloud Shell et définissez une variable d'environnement avec votre PROJECT_ID que vous utiliserez tout au long de cet atelier de programmation :

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

Créez ensuite un compte de service pour accéder à l'API Document AI à l'aide de la commande suivante :

gcloud iam service-accounts create my-docai-sa \
  --display-name "my-docai-service-account"

Accordez à votre compte de service l'autorisation d'accéder à Document AI et à Cloud Storage dans votre projet.

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/documentai.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/storage.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/serviceusage.serviceUsageConsumer"

Créez ensuite des identifiants permettant à votre code Python de se connecter avec ce nouveau compte de service, et enregistrez-les dans un fichier JSON ~/key.json à l'aide de la commande suivante :

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Enfin, définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS, qui permet à la bibliothèque de rechercher vos identifiants. Pour en savoir plus sur ce type d'authentification, consultez ce guide. La variable d'environnement doit être définie sur le chemin d'accès complet au fichier JSON d'identifiants que vous avez créé, à l'aide de la commande suivante :

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

6. Installer la bibliothèque cliente

Installez les bibliothèques clientes Python pour Document AI, Cloud Storage et la boîte à outils Document AI:

pip3 install --upgrade google-cloud-documentai
pip3 install --upgrade google-cloud-storage
pip3 install --upgrade google-cloud-documentai-toolbox

L'écran qui s'affiche devrait ressembler à ce qui suit :

...
Installing collected packages: google-cloud-documentai
Successfully installed google-cloud-documentai-2.15.0
.
.
Installing collected packages: google-cloud-storage
Successfully installed google-cloud-storage-2.9.0
.
.
Installing collected packages: google-cloud-documentai-toolbox
Successfully installed google-cloud-documentai-toolbox-0.6.0a0

Vous êtes maintenant prêt à utiliser l'API Document AI.

7. Télécharger l'exemple de PDF

Notre exemple de document contient les 3 premières pages du roman.

Vous pouvez télécharger le PDF à l'aide du lien suivant. Ensuite, importez-le dans l'instance cloudshell.

Vous pouvez également le télécharger depuis notre bucket public Google Cloud Storage en utilisant gsutil.

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh_3_Pages.pdf .

8. Envoyer une requête de traitement en ligne

Au cours de cette étape, vous allez traiter les trois premières pages du roman en utilisant l'API (synchrone) de traitement en ligne. Cette méthode est particulièrement adaptée au documents peu volumineux stockés localement. Consultez la liste complète des processeurs pour voir le nombre de pages et la taille de fichier à ne pas dépasser pour chaque type de processeur.

Utilisez l'éditeur Cloud Shell ou un éditeur de texte sur votre ordinateur local pour créer un fichier nommé online_processing.py et utilisez le code ci-dessous.

Remplacez YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID et le FILE_PATH par les valeurs appropriées de votre environnement.

online_processing.py

from google.api_core.client_options import ClientOptions
from google.cloud import documentai


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "YOUR_PROCESSOR_ID"  # Create processor in Cloud Console

# The local file in your current working directory
FILE_PATH = "Winnie_the_Pooh_3_Pages.pdf"
# Refer to https://cloud.google.com/document-ai/docs/file-types
# for supported file types
MIME_TYPE = "application/pdf"

# Instantiates a client
docai_client = documentai.DocumentProcessorServiceClient(
    client_options=ClientOptions(api_endpoint=f"{LOCATION}-documentai.googleapis.com")
)

# The full resource name of the processor, e.g.:
# projects/project-id/locations/location/processor/processor-id
# You must create new processors in the Cloud Console first
RESOURCE_NAME = docai_client.processor_path(PROJECT_ID, LOCATION, PROCESSOR_ID)

# Read the file into memory
with open(FILE_PATH, "rb") as image:
    image_content = image.read()

# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(content=image_content, mime_type=MIME_TYPE)

# Configure the process request
request = documentai.ProcessRequest(name=RESOURCE_NAME, raw_document=raw_document)

# Use the Document AI client to process the sample form
result = docai_client.process_document(request=request)

document_object = result.document
print("Document processing complete.")
print(f"Text: {document_object.text}")

Exécutez le code, qui permet d'extraire le texte et de l'imprimer dans la console.

Si vous utilisez notre exemple de document, vous devriez obtenir le résultat suivant :

Document processing complete.
Text: CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
Here is Edward Bear, coming
downstairs now, bump, bump, bump, on the back
of his head, behind Christopher Robin. It is, as far
as he knows, the only way of coming downstairs,
but sometimes he feels that there really is another
way, if only he could stop bumping for a moment
and think of it. And then he feels that perhaps there
isn't. Anyhow, here he is at the bottom, and ready
to be introduced to you. Winnie-the-Pooh.
When I first heard his name, I said, just as you
are going to say, "But I thought he was a boy?"
"So did I," said Christopher Robin.
"Then you can't call him Winnie?"
"I don't."
"But you said "

...

Digitized by
Google

9. Envoyer une requête de traitement par lot

Supposons maintenant que vous souhaitiez lire le texte du roman dans son intégralité.

  • Le traitement en ligne limite le nombre de pages et la taille des fichiers pouvant être envoyées. En outre, elle ne permet d'utiliser qu'un fichier de document par appel d'API.
  • Le traitement par lot prend en charge des fichiers plus volumineux et en plus grand nombre grâce à une méthode asynchrone.

Au cours de cette étape, nous allons traiter l'intégralité du roman "Winnie l'ourson" avec l'API de traitement par lot Document AI et générer le texte dans un bucket Google Cloud Storage.

Le traitement par lot utilise des opérations de longue durée pour gérer les requêtes de manière asynchrone. Nous devons donc envoyer la requête et récupérer la sortie différemment qu'avec le traitement en ligne. Cependant, la sortie aura le même format d'objet Document que nous utilisions le traitement en ligne ou par lot.

Cette étape indique comment fournir des documents spécifiques à Document AI pour qu'il les traite. Une étape ultérieure abordera comment traiter l'intégralité d'un répertoire de documents.

Importer un PDF dans Cloud Storage

La méthode batch_process_documents() accepte actuellement les fichiers provenant de Google Cloud Storage. Pour en savoir plus sur la structure des objets, consultez la section documentai_v1.types.BatchProcessRequest.

Dans cet exemple, vous pouvez lire le fichier directement depuis notre exemple de bucket.

Vous pouvez également copier le fichier dans votre bucket en utilisant gsutil,

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf gs://YOUR_BUCKET_NAME/

ou télécharger l'exemple de fichier du roman à partir du lien ci-dessous et l'importer dans votre bucket.

Vous aurez également besoin d'un bucket GCS pour stocker la sortie de l'API.

Accédez à la documentation Cloud Storage pour apprendre à créer des buckets de stockage.

Utiliser la méthode batch_process_documents()

Créez un fichier appelé batch_processing.py et utilisez le code ci-dessous.

Remplacez YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI et YOUR_OUTPUT_URI par les valeurs appropriées pour votre environnement.

Assurez-vous que YOUR_INPUT_URI pointe directement vers le fichier PDF, par exemple: gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf.

batch_processing.py

"""
Makes a Batch Processing Request to Document AI
"""

import re

from google.api_core.client_options import ClientOptions
from google.api_core.exceptions import InternalServerError
from google.api_core.exceptions import RetryError
from google.cloud import documentai
from google.cloud import storage

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf` or `gs://bucket/directory/`
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_documents(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
    timeout: int = 400,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Continually polls the operation until it is complete.
    # This could take some time for larger files
    # Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    try:
        print(f"Waiting for operation {operation.operation.name} to complete...")
        operation.result(timeout=timeout)
    # Catch exception when operation doesn"t finish before timeout
    except (RetryError, InternalServerError) as e:
        print(e.message)

    # NOTE: Can also use callbacks for asynchronous processing
    #
    # def my_callback(future):
    #   result = future.result()
    #
    # operation.add_done_callback(my_callback)

    # Once the operation is complete,
    # get output document information from operation metadata
    metadata = documentai.BatchProcessMetadata(operation.metadata)

    if metadata.state != documentai.BatchProcessMetadata.State.SUCCEEDED:
        raise ValueError(f"Batch Process Failed: {metadata.state_message}")

    storage_client = storage.Client()

    print("Output files:")
    # One process per Input Document
    for process in list(metadata.individual_process_statuses):
        # output_gcs_destination format: gs://BUCKET/PREFIX/OPERATION_NUMBER/INPUT_FILE_NUMBER/
        # The Cloud Storage API requires the bucket name and URI prefix separately
        matches = re.match(r"gs://(.*?)/(.*)", process.output_gcs_destination)
        if not matches:
            print(
                "Could not parse output GCS destination:",
                process.output_gcs_destination,
            )
            continue

        output_bucket, output_prefix = matches.groups()

        # Get List of Document Objects from the Output Bucket
        output_blobs = storage_client.list_blobs(output_bucket, prefix=output_prefix)

        # Document AI may output multiple JSON files per source file
        for blob in output_blobs:
            # Document AI should only output JSON files to GCS
            if blob.content_type != "application/json":
                print(
                    f"Skipping non-supported file: {blob.name} - Mimetype: {blob.content_type}"
                )
                continue

            # Download JSON File as bytes object and convert to Document Object
            print(f"Fetching {blob.name}")
            document = documentai.Document.from_json(
                blob.download_as_bytes(), ignore_unknown_fields=True
            )

            # For a full list of Document object attributes, please reference this page:
            # https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document

            # Read the text recognition output from the processor
            print("The document contains the following text:")
            print(document.text)


if __name__ == "__main__":
    batch_process_documents(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

Exécutez le code. Vous devriez obtenir le texte complet du roman, extrait et imprimé dans votre console.

Cela peut prendre un certain temps, car le fichier est beaucoup plus volumineux que l'exemple précédent. (D'accord...)

Toutefois, avec l'API de traitement par lot, vous recevrez un ID d'opération que vous pouvez utiliser pour obtenir la sortie de GCS une fois la tâche terminée.

Votre résultat doit se présenter comme suit :

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-0.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-1.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-10.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-11.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-12.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-13.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-14.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-15.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-16.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-17.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-18.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-2.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-3.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-4.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-5.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-6.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-7.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-8.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-9.json

This is a reproduction of a library book that was digitized
by Google as part of an ongoing effort to preserve the
information in books and make it universally accessible.
TM
Google books
https://books.google.com

.....

He nodded and went
out ... and in a moment
I heard Winnie-the-Pooh
-bump, bump, bump-go-ing up the stairs behind
him.
Digitized by
Google

10. Envoyer une requête de traitement par lot pour un répertoire

Dans certains cas, vous souhaiterez peut-être traiter l'intégralité d'un répertoire de documents, sans devoir indiquer chacun des documents. La méthode batch_process_documents() prend en charge l'entrée d'une liste de documents spécifiques ou d'un chemin d'accès au répertoire.

Au cours de cette étape, vous apprendrez à traiter l'intégralité d'un répertoire de fichiers de document. La plupart du code fonctionne de la même manière que l'étape précédente. La seule différence est l'URI GCS envoyé avec BatchProcessRequest.

Notre exemple de bucket contient un répertoire ayant plusieurs pages du roman dans des fichiers distincts.

  • gs://cloud-samples-data/documentai/codelabs/ocr/multi-document/

Vous pouvez lire les fichiers directement ou les copier dans votre propre bucket Cloud Storage.

Exécutez à nouveau le code de l'étape précédente, en remplaçant YOUR_INPUT_URI par un répertoire dans Cloud Storage.

Exécutez le code. Vous devriez obtenir le texte extrait de tous les fichiers de document dans le répertoire Cloud Storage.

Votre résultat doit se présenter comme suit :

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh_Page_0-0.json
Fetching docai-output/OPERATION_NUMBER/1/Winnie_the_Pooh_Page_1-0.json
Fetching docai-output/OPERATION_NUMBER/2/Winnie_the_Pooh_Page_10-0.json
Fetching docai-output/OPERATION_NUMBER/3/Winnie_the_Pooh_Page_12-0.json
Fetching docai-output/OPERATION_NUMBER/4/Winnie_the_Pooh_Page_16-0.json
Fetching docai-output/OPERATION_NUMBER/5/Winnie_the_Pooh_Page_7-0.json

Introduction
(I₂
F YOU happen to have read another
book about Christopher Robin, you may remember
th
CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
HERE is
10
WINNIE-THE-POOH
"I wonder if you've got such a thing as a balloon
about you?"
"A balloon?"
"Yes, 
12
WINNIE-THE-POOH
and you took your gun with you, just in case, as
you always did, and Winnie-the-P
16
WINNIE-THE-POOH
this song, and one bee sat down on the nose of the
cloud for a moment, and then g
WE ARE INTRODUCED
7
"Oh, help!" said Pooh, as he dropped ten feet on
the branch below him.
"If only 

11. Gérer une réponse de traitement par lot avec la boîte à outils Document AI

Le traitement par lot nécessite un certain nombre d'étapes en raison de l'intégration à Cloud Storage. La sortie Document peut également être "segmentée" en plusieurs fichiers .json en fonction de la taille du document d'entrée.

Le SDK Python de la boîte à outils Document AI a été créé pour simplifier le post-traitement et d'autres tâches courantes avec Document AI. Cette bibliothèque est destinée à compléter la bibliothèque cliente Document AI, et non à la remplacer. Pour obtenir la spécification complète, consultez la documentation de référence.

Cette étape explique comment envoyer une requête de traitement par lot et récupérer le résultat à l'aide de la boîte à outils Document AI.

batch_processing_toolbox.py

"""
Makes a Batch Processing Request to Document AI using Document AI Toolbox
"""

from google.api_core.client_options import ClientOptions
from google.cloud import documentai
from google.cloud import documentai_toolbox

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf`` or `gs://bucket/directory/``
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_toolbox(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Operation Name Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    documents = documentai_toolbox.document.Document.from_batch_process_operation(
        location=location, operation_name=operation.operation.name
    )

    for document in documents:
        # Read the text recognition output from the processor
        print("The document contains the following text:")
        # Truncated at 100 characters for brevity
        print(document.text[:100])


if __name__ == "__main__":
    batch_process_toolbox(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

12. Félicitations

Vous avez utilisé Document AI pour extraire le texte d'un roman à l'aide du traitement en ligne, du traitement par lot et de la boîte à outils Document AI.

Nous vous encourageons à tester d'autres documents et à découvrir les autres processeurs disponibles sur la plate-forme.

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, procédez comme suit :

  • Dans la console Cloud, accédez à la page Gérer les ressources.
  • Dans la liste des projets, sélectionnez votre projet, puis cliquez sur "Supprimer".
  • Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur "Arrêter" pour supprimer le projet.

En savoir plus

Continuez à vous familiariser avec Document AI grâce aux ateliers de programmation suivants.

Ressources

Licence

Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.