Reconocimiento óptico de caracteres (OCR) con Document AI (Python)

1. Descripción general

¿Qué es Document AI?

Document AI es una solución de comprensión de documentos que toma datos no estructurados, como documentos, correos electrónicos, facturas y formularios, entre otros, y permite que los datos sean más fáciles de comprender, analizar y consumir. La API proporciona una estructura mediante la clasificación de contenido, la extracción de entidades, la búsqueda avanzada y mucho más.

En este lab, aprenderás a realizar reconocimiento óptico de caracteres con la API de Document AI con Python.

Utilizaremos un archivo PDF de la novela clásica “Winnie the Pooh” de A. A. Milne que, hace poco, se hizo parte del dominio público en Estados Unidos. Este archivo se escaneó y digitalizó con Google Libros.

Qué aprenderás

  • Cómo habilitar la API de Document AI
  • Cómo autenticar solicitudes a la API
  • Cómo instalar la biblioteca cliente de Python
  • Cómo usar las APIs en línea y de procesamiento por lotes
  • Cómo analizar texto de un archivo PDF

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Chrome o Firefox
  • Experiencia en Python (versión 3.9 o superior)

Encuesta

¿Cómo usarás este instructivo?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia en Python?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

Seleccionar proyecto

Nuevo proyecto

Obtener ID del proyecto

Recuerda el ID del proyecto, un nombre único en todos los proyectos de Google Cloud. El ID del proyecto anterior ya está en uso y no funcionará. Debes proporcionar este ID más adelante como PROJECT_ID.

  1. Luego, debes habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud.

Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza”. En la sección, se aconseja cómo cerrar recursos para que no se te facture más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Inicia Cloud Shell

Si bien puedes usar Google Cloud de forma remota desde tu laptop, este codelab usa Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

Activa Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud Shell Activar Cloud Shell

Activar Cloud Shell

Si nunca has iniciado Cloud Shell, aparecerá una pantalla intermedia (mitad inferior de la página) en la que se describirá qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verla). Así es como se ve la pantalla única:

Introducción a Cloud Shell

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos. Cloud Shell

Cloud Shell te brinda acceso mediante una terminal a una máquina virtual alojada en la nube. La máquina virtual incluye todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador.

Una vez que estés conectado a Cloud Shell, deberías ver que ya te autenticaste y que el proyecto ya se configuró con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que te autenticaste:
gcloud auth list

Resultado del comando

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

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

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Habilita la API de Document AI

Antes de comenzar a usar Document AI, debes habilitar la API. Para ello, usa la interfaz de línea de comandos de gcloud o la consola de Cloud.

Usa la CLI de gcloud

  1. Si no usas Cloud Shell, sigue los pasos que se indican en Instala la CLI de gcloud en tu máquina local.
  2. Se pueden habilitar las APIs con los siguientes comandos gcloud.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Debería ver algo como esto:

Operation "operations/..." finished successfully.

Usar la consola de Cloud

Abre la consola de Cloud en tu navegador.

  1. Con la barra de búsqueda en la parte superior de la consola, busca “API de Document AI” y, luego, haz clic en Habilitar para usar la API en tu proyecto de Google Cloud.

Buscar API

  1. Repite el paso anterior para la API de Google Cloud Storage.

Ahora puedes usar Document AI.

4. Crea y prueba un procesador

Primero, debes crear una instancia del procesador de OCR en documentos que realizará la extracción. Esto se puede completar con la consola de Cloud o la API de Processor Management.

Consola de Cloud

  1. En la consola, navega a Descripción general de la plataforma de Document AI.Consola de la descripción general de Document AI
  2. Haz clic en Explorar procesadores y selecciona Document OCR.Procesadores
  3. Asígnale el nombre codelab-ocr (o un nombre que no vayas a olvidar) y selecciona la región más cercana de la lista.
  4. Haz clic en Crear para crear tu procesador.
  5. Copia el ID del procesador. Debes usarlo en el código más adelante. ID del procesador

Para probar tu procesador en la consola, puedes subir un documento. Haz clic en Subir documento de prueba (Upload Test Document) y selecciona un documento para analizarlo.

Puedes descargar el archivo PDF a continuación, que contiene las 3 primeras páginas de la novela.

Página del título

Tu resultado debería tener la siguiente apariencia: Libro analizado

Biblioteca cliente de Python

Sigue este codelab para descubrir cómo administrar procesadores de Document AI con la biblioteca cliente de Python:

Administra procesadores de Document AI con Python: Codelab

5. Autentica solicitudes a la API

Para realizar solicitudes a la API de Document AI, debes usar una cuenta de servicio. Una cuenta de servicio pertenece a tu proyecto y la biblioteca cliente de Python la usa para realizar solicitudes a la API. Al igual que cualquier otra cuenta de usuario, una cuenta de servicio está representada por una dirección de correo electrónico. En esta sección, usarás el SDK de Cloud para crear una cuenta de servicio y, luego, crear las credenciales que necesitas para autenticarte como la cuenta de servicio.

Primero, abre Cloud Shell y configura una variable de entorno con tu PROJECT_ID que usarás durante este codelab:

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

A continuación, crea una cuenta de servicio nueva para acceder a la API de Document AI con el siguiente comando:

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

Luego, otórgale a tu cuenta de servicio permisos para acceder a Document AI y Cloud Storage en tu proyecto.

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"

A continuación, crea credenciales para que tu código de Python las use para acceder como tu cuenta de servicio nueva. Crea estas credenciales y guárdalas como un archivo JSON ~/key.json con el siguiente comando:

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

Por último, configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, que la biblioteca usa para encontrar tus credenciales. Para leer más sobre esta forma de autenticación, consulta la guía. La variable de entorno se debe establecer en la ruta de acceso completa del archivo JSON de credenciales que creaste, con el siguiente código:

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

6. Instala la biblioteca cliente

Instala las bibliotecas cliente de Python para Document AI, Cloud Storage y Document AI Toolbox:

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

Debería ver algo como esto:

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

Ya está todo listo para usar la API de Document AI.

7. Descarga el PDF de muestra

Tenemos un documento de muestra que contiene las primeras 3 páginas de la novela.

Puedes descargar el PDF mediante el siguiente vínculo. Luego, súbelo a la instancia de cloudshell.

También puedes descargarlo de nuestro bucket público de Google Cloud Storage con gsutil.

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

8. Realiza una solicitud de procesamiento en línea

En este paso, procesarás las primeras 3 páginas de la novela con la API de procesamiento en línea (síncrono). Este método funciona mejor en documentos más pequeños que están almacenados de forma local. Consulta la lista completa de procesadores para conocer la cantidad máxima de páginas y el tamaño máximo de los archivos que admite cada tipo de procesador.

Usa el editor de Cloud Shell o un editor de texto en tu máquina local para crear un archivo llamado online_processing.py y usa el siguiente código.

Reemplaza YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID y el FILE_PATH con valores adecuados para tu entorno.

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}")

Ejecuta el código, que extraerá el texto y lo imprimirá en la consola.

Deberías ver el siguiente resultado si usas nuestro documento de muestra:

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. Realiza una solicitud de procesamiento por lotes

Ahora, supongamos que quieres leer el texto de toda la novela.

  • El procesamiento en línea tiene límites para la cantidad de páginas y el tamaño de los archivos que se pueden enviar y solo permite un documento por llamada a la API.
  • En cambio, el procesamiento por lotes permite procesar archivos más grandes o varios archivos en un método asíncrono.

En este paso, procesaremos toda la novela "Winnie the Pooh" con la API de procesamiento por lotes de Document AI y generaremos el texto en un bucket de Google Cloud Storage.

El procesamiento por lotes usa operaciones de larga duración para administrar solicitudes de forma asíncrona, por lo que debemos realizar la solicitud y recuperar el resultado de forma distinta al procesamiento en línea. Sin embargo, el resultado estará en el mismo formato de objeto Document, independiente de si se usa procesamiento por lotes o en línea.

En este paso, se muestra cómo proporcionar documentos específicos para que Document AI los procese. Más adelante, aprenderás a procesar un directorio de documentos completo.

Sube el PDF a Cloud Storage

El método batch_process_documents() actualmente acepta archivos de Google Cloud Storage. Puedes consultar documentai_v1.types.BatchProcessRequest para obtener más información sobre la estructura del objeto.

Para este ejemplo, puedes leer el archivo directamente en nuestro bucket de muestra.

También puedes copiar el archivo en tu propio bucket con gsutil.

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

O bien, puedes descargar el archivo de muestra de la novela del vínculo a continuación y subirlo a tu propio bucket.

También necesitarás un bucket de GCS para almacenar el resultado de la API.

Puedes consultar la documentación de Cloud Storage para descubrir cómo crear buckets de almacenamiento.

Usa el método batch_process_documents()

Crea un archivo llamado batch_processing.py y usa el código que se proporciona a continuación.

Reemplaza YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI y YOUR_OUTPUT_URI con los valores adecuados para tu entorno.

Asegúrate de que YOUR_INPUT_URI apunte directamente al archivo PDF, por ejemplo: 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,
    )

Ejecuta el código y deberías ver el texto de la novela completa extraído y, además, impreso en tu consola.

Este proceso puede tardar en completarse, ya que el archivo es mucho más grande que el del ejemplo anterior. Tendremos que esperar.

Sin embargo, con la API de procesamiento por lotes, recibirás un ID de operación que se puede usar para obtener el resultado de GCS cuando se complete la tarea.

El resultado debería ser similar a este:

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. Realiza una solicitud de procesamiento por lotes para un directorio

A veces, es posible que quieras procesar un directorio de documentos completo, sin tener que enumerar cada documento de forma individual. El método batch_process_documents() admite la entrada de una lista de documentos específicos o una ruta de acceso a un directorio.

En este paso, aprenderás a procesar un directorio de documentos completo. La mayor parte del código funciona igual que en el paso anterior. La única diferencia es el URI de GCS que se envió con el BatchProcessRequest.

Tenemos un directorio en nuestro bucket de muestra que contiene varias páginas de la novela en archivos separados.

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

Puedes leer los archivos directamente o copiarlos en tu propio bucket de Cloud Storage.

Vuelve a ejecutar el código del paso anterior y reemplaza YOUR_INPUT_URI por un directorio en Cloud Storage.

Ejecuta el código y deberías ver el texto extraído de todos los documentos del directorio de Cloud Storage.

El resultado debería ser similar a este:

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. Controla la respuesta de procesamiento por lotes con Document AI Toolbox

El procesamiento por lotes requiere bastantes pasos debido a la integración con Cloud Storage. Es posible que el resultado de Document también esté “fragmentado” en varios archivos .json según el tamaño del documento de entrada.

El SDK de la Caja de herramientas de Document AI para Python se creó para simplificar el procesamiento posterior y otras tareas comunes con Document AI. Esta biblioteca está diseñada para ser complementaria a la biblioteca cliente de Document AI, no un reemplazo. Ve a la documentación de referencia para obtener la especificación completa.

En este paso, se muestra cómo realizar una solicitud de procesamiento por lotes y recuperar el resultado usando Document AI Toolbox.

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

Usaste Document AI de forma correcta para extraer texto de una novela con procesamiento en línea, procesamiento por lotes y Document AI Toolbox.

Te animamos a experimentar con otros documentos y explorar los otros procesadores disponibles en la plataforma.

Realiza una limpieza

Para evitar que se generen cargos en tu cuenta de Google Cloud por los recursos que usaste en este instructivo, sigue estos pasos:

  • En la consola de Cloud, ve a la página Administrar recursos.
  • En la lista de proyectos, selecciona tu proyecto y haz clic en Borrar.
  • En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.

Más información

Sigue aprendiendo sobre Document AI con estos codelabs de seguimiento.

Recursos

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.