Detectar texto en archivos

El servicio de reconocimiento óptico de caracteres (OCR) de Vertex AI en Google Distributed Cloud (GDC) air-gapped detecta texto en archivos PDF y TIFF mediante los dos métodos de API siguientes:

En esta página se muestra cómo detectar texto en archivos mediante la API OCR en Distributed Cloud.

Antes de empezar

Antes de empezar a usar la API OCR, debes tener un proyecto con la API OCR habilitada y las credenciales adecuadas. También puedes instalar bibliotecas de cliente para ayudarte a hacer llamadas a la API. Para obtener más información, consulta Configurar un proyecto de reconocimiento de caracteres.

Detectar texto con solicitudes insertadas

El método BatchAnnotateFiles detecta texto de un lote de archivos PDF o TIFF. Envías directamente el archivo del que quieres detectar el texto como contenido en la solicitud de la API. El sistema devuelve el texto detectado en formato JSON en la respuesta de la API.

Debe especificar valores para los campos del cuerpo JSON de su solicitud de API. En la siguiente tabla se describen los campos del cuerpo de la solicitud que debe proporcionar al usar el método de la API BatchAnnotateFiles para sus solicitudes de detección de texto:

Campos del cuerpo de la solicitud Descripción del campo
content Los archivos con el texto que quieras detectar. Proporciona la representación en Base64 (cadena ASCII) del contenido de tu archivo binario.
mime_type El tipo de archivo de origen. Debes asignarle uno de los siguientes valores:
  • application/pdf para archivos PDF
  • image/tiff para archivos TIFF
type El tipo de detección de texto que necesitas del archivo.

Especifica una de las dos funciones de anotación:
  • TEXT_DETECTION detecta y extrae texto de cualquier archivo. La respuesta JSON incluye la cadena extraída, las palabras individuales y sus cuadros delimitadores.
  • DOCUMENT_TEXT_DETECTION también extrae texto de un archivo, pero el servicio optimiza la respuesta para texto y documentos densos. El archivo JSON incluye información sobre páginas, bloques, párrafos, palabras y saltos.
Para obtener más información sobre estas funciones de anotación, consulta el artículo Funciones de reconocimiento óptico de caracteres.
language_hints Opcional. Lista de idiomas que se van a usar para la detección de texto.

El sistema interpreta un valor vacío en este campo como detección automática del idioma.

No es necesario que defina el campo language_hints para los idiomas basados en el alfabeto latino.

Si conoces el idioma del texto del archivo, puedes mejorar los resultados si lo indicas.
pages Opcional. Número de páginas del archivo que se van a procesar para detectar texto.

Puedes especificar un máximo de cinco páginas. Si no especificas el número de páginas, el servicio procesará las cinco primeras páginas del archivo.

Para obtener información sobre la representación JSON completa, consulta AnnotateFileRequest.

Hacer una solicitud a la API insertada

Envía una solicitud a la API preentrenada de OCR mediante el método de la API REST. De lo contrario, interactúa con la API preentrenada de OCR desde una secuencia de comandos de Python para detectar texto de archivos PDF o TIFF.

En los siguientes ejemplos se muestra cómo detectar texto en un archivo mediante OCR:

REST

Sigue estos pasos para detectar texto en archivos mediante el método de la API REST:

  1. Guarda el siguiente archivo request.json para el cuerpo de la solicitud:

    cat <<- EOF > request.json
    {
      "requests": [
        {
          "input_config": {
            "content": BASE64_ENCODED_FILE,
            "mime_type": "application/pdf"
          },
          "features": [
            {
              "type": "FEATURE_TYPE"
            }
          ],
          "image_context": {
            "language_hints": [
              "LANGUAGE_HINT_1",
              "LANGUAGE_HINT_2",
              ...
            ]
          },
          "pages": []
        }
      ]
    }
    EOF
    

    Haz los cambios siguientes:

    • BASE64_ENCODED_FILE: la representación en Base64 (cadena ASCII) del contenido de tu archivo binario. Esta cadena empieza por caracteres similares a /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==.
    • FEATURE_TYPE: el tipo de detección de texto que necesitas del archivo. Los valores permitidos son TEXT_DETECTION y DOCUMENT_TEXT_DETECTION.
    • LANGUAGE_HINT: las etiquetas de idioma BCP 47 que se van a usar como sugerencias de idioma para la detección de texto, como en-t-i0-handwrit. Este campo es opcional y el sistema interpreta un valor vacío como detección automática del idioma.
  2. Obtener un token de autenticación

  3. Haz la solicitud:

    curl

    curl -X POST \
      -H "Authorization: Bearer TOKEN" \
      -H "x-goog-user-project: projects/PROJECT_ID" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      https://ENDPOINT/v1/files:annotate
    

    Haz los cambios siguientes:

    PowerShell

    $headers = @{
      "Authorization" = "Bearer TOKEN"
      "x-goog-user-project" = "projects/PROJECT_ID"
    }
    
    Invoke-WebRequest
      -Method POST
      -Headers $headers
      -ContentType: "application/json; charset=utf-8"
      -InFile request.json
      -Uri "ENDPOINT/v1/files:annotate" | Select-Object -Expand Content
    

    Haz los cambios siguientes:

Python

Sigue estos pasos para usar el servicio de OCR desde una secuencia de comandos de Python para detectar texto en un archivo:

  1. Instala la versión más reciente de la biblioteca de cliente de OCR.

  2. Define las variables de entorno necesarias en una secuencia de comandos de Python.

  3. Autentica tu solicitud a la API.

  4. Añade el siguiente código a la secuencia de comandos de Python que has creado:

    from google.cloud import vision
    import google.auth
    from google.auth.transport import requests
    from google.api_core.client_options import ClientOptions
    
    audience = "https://ENDPOINT:443"
    api_endpoint="ENDPOINT:443"
    
    def vision_client(creds):
      opts = ClientOptions(api_endpoint=api_endpoint)
      return vision.ImageAnnotatorClient(credentials=creds, client_options=opts)
    
    def main():
      creds = None
      try:
        creds, project_id = google.auth.default()
        creds = creds.with_gdch_audience(audience)
        req = requests.Request()
        creds.refresh(req)
        print("Got token: ")
        print(creds.token)
      except Exception as e:
        print("Caught exception" + str(e))
        raise e
      return creds
    
    def vision_func(creds):
      vc = vision_client(creds)
      input_config = {"content": "BASE64_ENCODED_FILE"}
      features = [{"type_": vision.Feature.Type.FEATURE_TYPE}]
      # Each requests element corresponds to a single file. To annotate more
      # files, create a request element for each file and add it to
      # the array of requests
      req = {"input_config": input_config, "features": features}
    
      metadata = [("x-goog-user-project", "projects/PROJECT_ID")]
    
      resp = vc.annotate_file(req,metadata=metadata)
    
      print(resp)
    
    if __name__=="__main__":
      creds = main()
      vision_func(creds)
    

    Haz los cambios siguientes:

    • ENDPOINT: el endpoint de OCR que usas en tu organización. Para obtener más información, consulta el estado del servicio y los endpoints.
    • BASE64_ENCODED_FILE: representación en Base64 (cadena ASCII) del contenido del archivo. Esta cadena empieza por caracteres similares a /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==.
    • FEATURE_TYPE: el tipo de detección de texto que necesitas del archivo. Los valores permitidos son TEXT_DETECTION y DOCUMENT_TEXT_DETECTION.
    • PROJECT_ID: tu ID de proyecto.
  5. Guarda la secuencia de comandos de Python.

  6. Ejecuta la secuencia de comandos de Python para detectar texto en el archivo:

    python SCRIPT_NAME
    

    Sustituye SCRIPT_NAME por el nombre que le hayas dado a tu script de Python, como vision.py.

Detectar texto con solicitudes offline

El método AsyncBatchAnnotateFiles detecta texto de un lote de archivos PDF o TIFF mediante una solicitud offline (asíncrona). Los archivos pueden contener varias páginas y varias imágenes por página. Los archivos de origen deben estar en un segmento de almacenamiento de tu proyecto de Distributed Cloud. El sistema guarda el texto detectado resultante en formato JSON en un segmento de almacenamiento.

El servicio de OCR inicia el procesamiento sin conexión y devuelve el ID del proceso de larga duración que realiza la detección de texto en el archivo. Puede usar el ID devuelto para hacer un seguimiento del estado del procesamiento offline. Si hay demasiadas operaciones en curso, es posible que el procesamiento sin conexión no se inicie inmediatamente.

Debe especificar valores para los campos del cuerpo JSON de su solicitud de API. En la siguiente tabla se describen los campos del cuerpo de la solicitud que debe proporcionar al usar el método de la API AsyncBatchAnnotateFiles para sus solicitudes de detección de texto:

Campos del cuerpo de la solicitud Descripción del campo
gcs_source.uri La ruta URI a un archivo de origen válido (PDF o TIFF) en un segmento de almacenamiento de tu proyecto de Distributed Cloud.

Este archivo contiene el texto que quieres detectar.

El usuario o la cuenta de servicio que haga la solicitud debe tener al menos privilegios de lectura en el archivo.
mime_type El tipo de archivo de origen. Debes asignarle uno de los siguientes valores:
  • application/pdf para archivos PDF
  • image/tiff para archivos TIFF
type El tipo de detección de texto que necesitas del archivo.

Especifica una de las dos funciones de anotación:
  • TEXT_DETECTION detecta y extrae texto de cualquier archivo. La respuesta JSON incluye la cadena extraída, las palabras individuales y sus cuadros delimitadores.
  • DOCUMENT_TEXT_DETECTION también extrae texto de un archivo, pero el servicio optimiza la respuesta para texto y documentos densos. El archivo JSON incluye información sobre páginas, bloques, párrafos, palabras y saltos.
Para obtener más información sobre estas funciones de anotación, consulta el artículo Funciones de reconocimiento óptico de caracteres.
gcs_destination.uri Ruta de URI a un segmento de almacenamiento de tu proyecto de Distributed Cloud para guardar los archivos de salida.

Esta ubicación es donde quieres almacenar los resultados de la detección.

El usuario o la cuenta de servicio que realiza la solicitud debe tener permiso de escritura en el segmento.

Almacenar el archivo de origen en un segmento de almacenamiento

Antes de enviar una solicitud, debes asegurarte de que la cuenta de servicio de OCR tenga permisos de lectura en tu segmento de entrada y permisos de escritura en tu segmento de salida.

Los contenedores de entrada y salida pueden ser diferentes y estar en espacios de nombres de proyectos distintos. Te recomendamos que uses los mismos contenedores de entrada y salida para evitar errores, como almacenar los resultados en contenedores incorrectos.

Sigue estos pasos para almacenar el archivo del que quieras detectar texto en un segmento de almacenamiento:

  1. Configura la CLI de gdcloud para el almacenamiento de objetos.
  2. Crea un segmento de almacenamiento en el espacio de nombres de tu proyecto. Usa una clase de almacenamiento Standard.

    Para crear el segmento de almacenamiento, implementa un recurso Bucket en el espacio de nombres del proyecto:

    apiVersion: object.gdc.goog/v1
    kind: Bucket
    metadata:
      name: ocr-async-bucket
      namespace: PROJECT_NAMESPACE
    spec:
      description: bucket for async ocr
      storageClass: Standard
      bucketPolicy:
        lockingPolicy:
          defaultObjectRetentionDays: 90
    
  3. Concede los permisos read y write en el segmento a la cuenta de servicio g-vai-ocr-sie-sa que utiliza el servicio de OCR.

    Puedes seguir estos pasos para crear el rol y el enlace de rol mediante recursos personalizados:

    1. Crea el rol desplegando un recurso Role en el espacio de nombres del proyecto:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: Role
        metadata:
          name: ocr-async-reader-writer
          namespace: PROJECT_NAMESPACE
        rules:
          -
            apiGroups:
              - object.gdc.goog
            resources:
              - buckets
            verbs:
              - read-object
              - write-object
      
    2. Crea el enlace de rol desplegando un recurso RoleBinding en el espacio de nombres del proyecto:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
      
        metadata:
          name: ocr-async-reader-writer-rolebinding
          namespace: PROJECT_NAMESPACE
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: Role
          name: ocr-async-reader-writer
        subjects:
          -
            kind: ServiceAccount
            name: g-vai-ocr-sie-sa
            namespace: g-vai-ocr-sie
      
  4. Sube el archivo al depósito de almacenamiento que has creado. Para obtener más información, consulta Subir y descargar objetos de almacenamiento en proyectos.

Hacer una solicitud a la API sin conexión

Envía una solicitud a la API preentrenada de OCR mediante el método de la API REST. De lo contrario, interactúa con la API preentrenada de OCR desde una secuencia de comandos de Python para detectar texto de archivos PDF o TIFF.

En los siguientes ejemplos se muestra cómo detectar texto en un archivo mediante OCR:

REST

Sigue estos pasos para detectar texto en archivos mediante el método de la API REST:

  1. Guarda el siguiente archivo request.json para el cuerpo de la solicitud:

    cat <<- EOF > request.json
    {
      "parent": PROJECT_ID,
      "requests":[
        {
          "input_config": {
            "gcs_source": {
              "uri": "SOURCE_FILE"
            },
            "mime_type": "application/pdf"
          },
          "features": [
            {
              "type": "FEATURE_TYPE"
            }
          ],
          "output_config": {
            "gcs_destination": {
              "uri": "DESTINATION_BUCKET"
            }
          }
        }
      ]
    }
    EOF
    

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • SOURCE_FILE: la ruta URI a un archivo de origen válido (PDF o TIFF) en un segmento de almacenamiento de tu proyecto de Distributed Cloud.
    • FEATURE_TYPE: el tipo de detección de texto que necesitas del archivo. Los valores permitidos son TEXT_DETECTION y DOCUMENT_TEXT_DETECTION.
    • DESTINATION_BUCKET: la ruta de URI a un contenedor de almacenamiento de tu proyecto de Distributed Cloud para guardar los archivos de salida.
  2. Obtener un token de autenticación

  3. Haz la solicitud:

    curl

    curl -X POST \
      -H "Authorization: Bearer TOKEN" \
      -H "x-goog-user-project: projects/PROJECT_ID" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      https://ENDPOINT/v1/files:asyncBatchAnnotate
    

    Haz los cambios siguientes:

    PowerShell

    $headers = @{
      "Authorization" = "Bearer TOKEN"
      "x-goog-user-project" = "projects/PROJECT_ID"
    }
    
    Invoke-WebRequest
      -Method POST
      -Headers $headers
      -ContentType: "application/json; charset=utf-8"
      -InFile request.json
      -Uri "ENDPOINT/v1/files:asyncBatchAnnotate" | Select-Object -Expand Content
    

    Haz los cambios siguientes:

Python

Sigue estos pasos para usar el servicio de OCR desde una secuencia de comandos de Python para detectar texto en un archivo:

  1. Instala la versión más reciente de la biblioteca de cliente de OCR.

  2. Define las variables de entorno necesarias en una secuencia de comandos de Python.

  3. Autentica tu solicitud a la API.

  4. Añade el siguiente código a la secuencia de comandos de Python que has creado:

    from google.cloud import vision
    import google.auth
    from google.auth.transport import requests
    from google.api_core.client_options import ClientOptions
    
    audience = "https://ENDPOINT:443"
    api_endpoint="ENDPOINT:443"
    
    def vision_func_async(creds):
      vc = vision_client(creds)
      features = [{"type_": vision.Feature.Type.FEATURE_TYPE}]
      input_config = {"gcs_source":{"uri":SOURCE_FILE},"mime_type": "application/pdf"}
      output_config = {"gcs_destination": {"uri": DESTINATION_BUKET}}
      req = {"input_config": input_config, "output_config": output_config, "features":features}
      reqs = {"requests":[req],"parent":PROJECT_ID}
    
      metadata = [("x-goog-user-project", "projects/PROJECT_ID")]
    
      operation = vc.async_batch_annotate_files(request=reqs, metadata=metadata)
      lro = operation.operation
      resp = operation.result()
    
    def main():
      creds = None
      try:
        creds, project_id = google.auth.default()
        creds = creds.with_gdch_audience(audience)
        req = requests.Request()
        creds.refresh(req)
        print("Got token: ")
        print(creds.token)
      except Exception as e:
        print("Caught exception" + str(e))
        raise e
      return creds
    
    if __name__=="__main__":
      creds = main()
      vision_func_async(creds)
    

    Haz los cambios siguientes:

    • ENDPOINT: el endpoint de OCR que usas en tu organización. Para obtener más información, consulta el estado del servicio y los endpoints.
    • FEATURE_TYPE: el tipo de detección de texto que necesitas del archivo. Los valores permitidos son TEXT_DETECTION y DOCUMENT_TEXT_DETECTION.
    • SOURCE_FILE: la ruta URI a un archivo de origen válido (PDF o TIFF) en un segmento de almacenamiento de tu proyecto de Distributed Cloud.
    • DESTINATION_BUCKET: la ruta de URI a un contenedor de almacenamiento de tu proyecto de Distributed Cloud para guardar los archivos de salida.
    • PROJECT_ID: tu ID de proyecto.
  5. Guarda la secuencia de comandos de Python.

  6. Ejecuta la secuencia de comandos de Python para detectar texto en el archivo:

    python SCRIPT_NAME
    

    Sustituye SCRIPT_NAME por el nombre que le hayas dado a tu script de Python, como vision.py.

Puedes usar el nombre de la operación que ha devuelto el método AsyncBatchAnnotateFiles para comprobar el estado de la operación.

Obtener el estado de la operación

El método get devuelve el estado más reciente de una operación de larga duración, como la solicitud sin conexión para la detección de texto. Usa este método para comprobar el estado de la operación, como en el siguiente ejemplo:

curl -X GET "http://ENDPOINT/v1/OPERATION_NAME"

Sustituye OPERATION_NAME por el nombre de la operación que devolvió el método AsyncBatchAnnotateFiles cuando hiciste la solicitud sin conexión.

Mostrar operaciones

El método list devuelve una lista de las operaciones que coinciden con un filtro especificado en la solicitud. El método puede devolver operaciones de un proyecto específico. Para llamar al método list, especifica el ID de tu proyecto y el endpoint de OCR, como en el siguiente ejemplo:

curl -X GET "http://ENDPOINT/v1/projects/PROJECT_ID/operations?page_size=10"