Reconhecimento óptico de caracteres (OCR) com a Document AI (Python)

1. Aspectos gerais

O que é a Document AI?

A Document AI é uma solução para compreensão de dados não estruturados, como documentos, e-mails, faturas, formulários etc., que facilita o entendimento, a análise e o consumo desses dados. A API fornece estrutura por meio da classificação do conteúdo, extração de entidades, pesquisa avançada e muito mais.

Neste laboratório, você vai aprender como realizar o reconhecimento óptico de caracteres usando a API Document AI com Python.

Vamos usar um arquivo PDF do romance clássico "Winnie the Pooh" de A.A. Milne, que recentemente se tornou domínio público nos Estados Unidos. Este arquivo foi verificado e digitalizado pelo Google Livros.

O que você vai aprender

  • Como ativar a API Document AI
  • Como autenticar solicitações de API
  • Como instalar a biblioteca de cliente para Python
  • Como usar as APIs de processamento on-line e em lote
  • Como analisar textos de um arquivo PDF

O que é necessário

  • Um projeto do Google Cloud
  • Um navegador, como o Chrome ou o Firefox
  • Familiaridade com Python (3.9+)

Pesquisa

Como você vai usar este tutorial?

Apenas leitura Ler e fazer os exercícios

Como você classificaria sua experiência com Python?

Iniciante Intermediário Proficiente

Como você classificaria sua experiência de uso dos serviços do Google Cloud?

Iniciante Intermediário Proficiente

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

Selecionar projeto

Novo projeto

Obter ID do projeto

Lembre-se do ID do projeto, um nome exclusivo em todos os projetos do Google Cloud. (O ID do projeto acima já foi usado e não vai funcionar para você). Você vai precisar fornecer esse ID posteriormente como PROJECT_ID.

  1. Em seguida, é necessário ativar o faturamento no console do Cloud para usar os recursos do Google Cloud.

Siga todas as instruções da seção "Limpeza". Na seção, você aprende a encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud possa ser operado remotamente em seu laptop, neste codelab vamos usar o Google Cloud Shell, um ambiente de linha de comando executado no Google Cloud.

Ative o Cloud Shell

  1. No console do Cloud, clique em Ativar o Cloud Shell Ativar o Cloud Shell

Ativar o Cloud Shell

Se você nunca iniciou o Cloud Shell, vai ver uma tela intermediária abaixo da dobra com a descrição dele. Se esse for o caso, clique em Continuar e você não a verá novamente. Esta é a aparência dessa tela única:

Introdução ao Cloud Shell

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell. Cloud Shell

O Cloud Shell oferece acesso de terminal a uma máquina virtual hospedada na nuvem. A máquina virtual tem todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, quase todo o trabalho pode ser feito simplesmente com um navegador.

Após se conectar ao Cloud Shell, sua conta já está autenticada e o projeto está configurado com seu ID do projeto.

  1. Execute o seguinte comando no Cloud Shell para confirmar se a conta está autenticada:
gcloud auth list

Resposta ao 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

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Ative a API Document AI

Antes de começar a usar a Document AI, você precisa ativar a API. Para isso, use a interface de linha de comando gcloud ou o Console do Cloud.

Usar a CLI gcloud

  1. Se você não estiver usando o Cloud Shell, siga as etapas em Instalar a CLI gcloud na máquina local.
  2. As APIs podem ser ativadas usando os comandos gcloud a seguir.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Você verá algo como:

Operation "operations/..." finished successfully.

Use o Console do Cloud

Abra o console do Cloud no navegador.

  1. Pesquise "API Document AI" na barra de pesquisa da parte superior do console e clique em Ativar para usar a API no projeto do Google Cloud

Pesquisar API

  1. Repita a etapa anterior para a API Google Cloud Storage.

Agora você pode usar a Document AI.

4. Crie e teste um processador

Primeiro, crie uma instância do processador de OCR de documentos que vai fazer a extração. Isso pode ser concluído pelo Cloud Console ou pela API de gerenciamento do processador.

Console do Cloud

  1. No console, navegue até Aspectos gerais do Document AI PlatformConsole de aspectos gerais da Document AI
  2. Clique em Explore Processors e selecione Document OCR.Processadores
  3. Nomeie como codelab-ocr ou de outra forma, desde que você lembre. Em seguida, selecione a região mais próxima na lista.
  4. Clique em Criar para criar seu processador.
  5. Copie o ID do processador. Você vai precisar usá-lo no código mais tarde. ID do processador

É possível fazer upload de um documento para testar o processador no console. Clique em Fazer upload do documento de teste e selecione o documento para análise.

Faça o download do arquivo PDF a seguir, que contém as primeiras 3 páginas do romance.

Página do título

A resposta será parecida com esta: Livro analisado

Biblioteca de cliente Python

Siga este codelab para saber como gerenciar processadores da Document AI com a biblioteca de cliente Python:

Como gerenciar processadores da Document AI com Python - Codelab

5. Autentique as solicitações de API

Para fazer solicitações à API Document AI, você precisa usar uma conta de serviço. Uma conta de serviço pertence ao seu projeto. Ela é usada pela biblioteca de cliente Python para fazer solicitações de API. Como qualquer outra conta de usuário, uma conta de serviço é representada por um endereço de e-mail. Nesta seção, você vai usar o SDK Cloud para criar uma conta de serviço e, em seguida, criar as credenciais necessárias para realizar a autenticação.

Primeiro, abra o Cloud Shell e defina uma variável de ambiente com o PROJECT_ID, que você vai usar neste codelab:

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

Em seguida, crie uma nova conta de serviço para acessar a API Document AI usando:

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

Depois conceda permissões à conta de serviço para acessar a Document AI e o Cloud Storage no projeto.

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"

Crie credenciais que o código Python usa para fazer login como a nova conta de serviço. Crie essas credenciais e salve-as como um arquivo JSON ~/key.json usando o seguinte comando:

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

Por fim, defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS, que a biblioteca usa para encontrar suas credenciais. Para saber mais sobre essa forma de autenticação, consulte o guia. A variável de ambiente deve ser definida para o caminho completo do arquivo JSON de credenciais que você criou. Para isso, use:

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

6. Instale a biblioteca de cliente

Instale as bibliotecas de cliente Python para a Document AI, o Cloud Storage e a Document AI Toolbox:

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

Você verá algo como:

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

Agora você já pode usar a API Document AI.

7. Faça o download do PDF de amostra

Há um documento de amostra com as primeiras 3 páginas do romance.

Faça o download do PDF usando o link abaixo. Em seguida, faça o upload dele na instância cloudshell.

Também é possível fazer o download dele pelo bucket público do Google Cloud Storage usando gsutil.

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

8. Faça uma solicitação de processamento on-line

Nesta etapa, você vai processar as primeiras 3 páginas do romance usando a API de processamento on-line (síncrona). Esse método é mais adequado para documentos menores armazenados localmente. Confira a lista completa de processadores para saber o máximo de páginas e de tamanho de arquivo para cada tipo de processador.

Use o editor do Cloud Shell ou um editor de texto na máquina local para criar um arquivo chamado online_processing.py e use o código abaixo.

Substitua YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID e FILE_PATH pelos valores apropriados para o ambiente.

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

Execute o código que vai extrair e imprimir o texto no console.

Você vai ver a resposta a seguir se estiver usando o documento de amostra:

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. Faça uma solicitação de processamento em lote

Agora suponha que você queira ler o texto inteiro do romance.

  • O processamento on-line tem limites de número de páginas e de tamanho do arquivo para envio e permite apenas um arquivo de documento por chamada de API.
  • O processamento em lote permite o processamento de arquivos maiores/múltiplos em um método assíncrono.

Nesta etapa, vamos processar todo o romance "Winnie the Pooh" com a API de processamento em lote da Document AI e enviar o texto para um bucket do Google Cloud Storage.

O processamento em lote usa operações de longa duração para gerenciar solicitações de maneira assíncrona, portanto, é preciso fazer a solicitação e recuperar a saída de uma maneira diferente do processamento on-line. No entanto, a saída vai ter o mesmo formato de objeto Document, seja usando processamento on-line ou em lote.

Confira nesta etapa como fornecer documentos específicos para a Document AI processar. Confira na etapa posterior como processar um diretório inteiro de documentos.

Faça upload do PDF no Cloud Storage

Atualmente o método batch_process_documents() aceita arquivos do Google Cloud Storage. Consulte documentai_v1.types.BatchProcessRequest para obter mais informações sobre a estrutura do objeto.

Para este exemplo, é possível ler o arquivo diretamente do bucket de amostra.

Você também pode copiar o arquivo para seu próprio bucket usando gsutil.

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

Ou pode fazer o download do arquivo de amostra do romance pelo link abaixo e fazer upload dele para seu próprio bucket.

Você também precisa de um bucket do GCS para armazenar a saída da API.

Consulte a documentação do Cloud Storage para aprender a criar buckets de armazenamento.

Como usar o método batch_process_documents()

Crie um arquivo chamado batch_processing.py e use o código abaixo.

Substitua YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI e YOUR_OUTPUT_URI pelos valores apropriados do ambiente.

Verifique se YOUR_INPUT_URI aponta diretamente para o arquivo PDF, por exemplo: 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,
    )

Execute o código para exibir o texto completo do romance extraído e impresso no console.

Isso pode levar algum tempo para ser concluído, porque o arquivo é muito maior que o exemplo anterior. (Oh, céus...)

No entanto, com a API de processamento em lote, você recebe um ID de operação que pode ser usado para obter a saída do GCS assim que a tarefa for concluída.

A saída será parecida com esta:

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. Faça uma solicitação de processamento em lote para um diretório

Talvez você queira processar um diretório inteiro de documentos, sem listar cada documento individualmente. O método batch_process_documents() aceita a entrada de uma lista de documentos específicos ou um caminho de diretório.

Nesta etapa, vamos aprender como processar um diretório completo de arquivos de documentos. A maior parte do código funciona da mesma forma que a etapa anterior, a única diferença é o URI do GCS enviado com o BatchProcessRequest.

Há um diretório no bucket de amostra com várias páginas do romance em arquivos separados.

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

Leia os arquivos diretamente ou copie-os para o bucket do Cloud Storage.

Execute novamente o código da etapa anterior, substituindo YOUR_INPUT_URI por um diretório no Cloud Storage.

Execute o código para exibir o texto extraído de todos os arquivos de documentos do diretório do Cloud Storage.

A saída será parecida com esta:

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. Lidar com respostas de processamento em lote com o Document AI Toolbox

Devido à integração com o Cloud Storage, o processamento em lote requer algumas etapas. A saída Document também pode ser "fragmentada" em vários arquivos .json, dependendo do tamanho do documento de entrada.

O SDK para Python do Document AI Toolbox foi criado para simplificar o pós-processamento e outras tarefas comuns com a Document AI. Esta biblioteca deve ser complementar à biblioteca de cliente da Document AI, não uma substituição. Acesse a documentação de referência para ver a especificação completa.

Nesta etapa, mostramos como fazer uma solicitação de processamento em lote e recuperar a saída usando o 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. Parabéns

Você usou corretamente a Document AI para extrair texto de um romance usando o processamento on-line, o processamento em lote e a Document AI Toolbox.

Incentivamos você a testar outros documentos e a explorar outros processadores disponíveis na plataforma.

Limpeza

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud, siga estas etapas:

  • No console do Cloud, acesse a página Gerenciar recursos.
  • Na lista de projetos, selecione o projeto e clique em "Excluir".
  • Na caixa de diálogo, digite o ID do projeto e clique em "Encerrar" para excluí-lo.

Saiba mais

Saiba mais sobre a Document AI com estes codelabs de acompanhamento.

Recursos

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.