Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Detectar texto con un AWS Lambda función
AWS Lambda es un servicio de cómputo que puede usar para ejecutar código sin aprovisionar ni administrar servidores. Puede llamar a las operaciones de la API de Amazon Textract desde una función de AWS Lambda. En las instrucciones siguientes se explica cómo crear una función de Lambda en Python que llame a DetectDocumentText.
La función Lambda devuelve una lista de objetos Block con información sobre las palabras y líneas de texto detectadas. Las instrucciones incluyen un ejemplo de código Python que muestra cómo llamar a la función Lambda con un documento suministrado desde un bucket de Amazon S3 o desde su ordenador local. Las imágenes almacenadas en Amazon S3 deben estar en formato de documento PDF o TIFF de una sola página, o en formato JPEG o PNG. Las imágenes locales deben estar en formato PDF o TIFF de una sola página. El código Python devuelve parte de la respuesta JSON para cada tipo de bloque detectado en el documento.
Para ver un ejemplo en el que se utilizan funciones de Lambda para procesar documentos a gran escala, consulte Amazon Textract IDP CDK
Temas
Paso 1: Crear un AWS Lambda función (consola)
En este paso, se crea una AWS Lambda función vacía y una función de ejecución de IAM que permite a la función llamar a la DetectDocumentText operación. Si suministra documentos desde Amazon S3, este paso también le muestra cómo conceder acceso al depósito que almacena sus documentos.
Más adelante, añada el código fuente y, de forma opcional, añada una capa a la función Lambda.
Para crear un AWS Lambda función (consola)
Inicie sesión en Consola de administración de AWS y abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/
. -
Seleccione Creación de función. Para obtener más información, consulte Crear una función de Lambda con la consola.
-
Elija las siguientes opciones:
-
Elija Crear desde cero.
-
Introduzca un valor en Nombre de función.
-
En Runtime (Tiempo de ejecución), elija Python 3.9.
-
En Arquitectura, elija x86_64.
-
-
Elija Crear función para crear la función de AWS Lambda .
En la página de la función, seleccione la pestaña Configuración.
-
En el panel Permisos, en Rol de ejecución, elija el nombre del rol para abrir el rol en la consola de IAM.
-
En la pestaña Permisos, elija Añadir permisos y después Crear política insertada.
Elija la pestaña JSON y reemplace la política por la siguiente política:
Elija Revisar política.
Introduzca un nombre para la política, por ejemplo DetectDocumentText-access.
Elija Crear política.
-
Si va a almacenar documentos para analizarlos en un bucket de Amazon S3, debe añadir una política de acceso a Amazon S3. Para ello, repita los pasos 7 a 11 en la consola de AWS Lambda y realice los siguientes cambios.
-
En el paso 8, utilice la siguiente política.
bucket/folder pathSustitúyala por la ruta del depósito y la carpeta de Amazon S3 a los documentos que desee analizar. Para el paso 10, elija un nombre de política diferente, como S3Bucket-access.
-
Paso 2: (opcional) Crear una capa (consola)
Para ejecutar este ejemplo, no es necesario realizar este paso. La DetectDocumentText operación se incluye en el entorno Lambda Python predeterminado como parte del AWS SDK para Python (Boto3). Si otras partes de la función Lambda requieren actualizaciones de AWS servicio recientes que no están en el entorno Lambda Python predeterminado, lleve a cabo este paso para añadir la versión más reciente del SDK de Boto3 como capa a su función.
En primer lugar, debe crear un archivo zip que contenga el SDK de Boto3. A continuación, tendrá que crear una capa y añadir el archivo de zip a la capa. Para obtener más información, consulte Uso de capas de Lambda.
Cómo crear y añadir una capa (consola)
-
Abra una línea de comandos e introduzca los siguientes comandos para crear un paquete de implementación con la versión más reciente del SDK de AWS.
pip install boto3 --target python/. zip boto3-layer.zip -r python/ Anote el nombre del archivo zip (boto3-layer.zip), que utilizará en el paso 8 de este procedimiento.
Abra la AWS Lambda consola en https://console.aws.amazon.com/lambda/
. -
En el panel de navegación, elija Capas.
-
Elija Crear capa.
-
Introduzca valores para Nombre y Descripción.
-
Para Tipo de entrada de código, elija Cargar un archivo .zip y seleccione Cargar.
-
En el cuadro de diálogo, elija el archivo .zip (boto3-layer.zip) que creó en el paso 1 de este procedimiento.
-
En Tiempos de ejecución compatibles, elija Python 3.9.
-
Elija Crear para crear la capa.
-
Elija el icono del menú del panel de navegación.
-
Seleccione Funciones en el panel de navegación.
-
En la lista de recursos, elija la función que haya creado anteriormente en Paso 1: Crear un AWS Lambda función (consola).
-
Elija la pestaña Código.
-
En la sección Capas, elija Agregar una capa.
-
Elija Capas personalizadas.
-
En Capas personalizadas, elija el nombre de la capa que escogió en el paso 6.
En Versión, elija la versión de la capa, que debe ser 1.
-
Elija Agregar.
Paso 3: Añadir código de Python (consola)
En este paso, añade código Python a la función de Lambda mediante el editor de código de la consola de Lambda. El código detecta el texto de un documento DetectDocumentText y devuelve una lista de objetos Block con información sobre el texto detectado. El documento puede estar ubicado en un bucket de Amazon S3 o en un ordenador local. Las imágenes almacenadas en Amazon S3 deben ser documentos de una sola página en formato PDF o TIFF o en formato JPEG o PNG. Las imágenes locales deben estar en formato PDF o TIFF de una sola página.
Cómo añadir código Python (consola)
Navegue hasta la pestaña Código.
-
En el editor de código, sustituya el código del archivo lambda_function.py por el código siguiente:
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose An AWS lambda function that analyzes documents with Amazon Textract. """ import json import base64 import logging import boto3 from botocore.exceptions import ClientError # Set up logging. logger = logging.getLogger(__name__) # Get the boto3 client. textract_client = boto3.client('textract') def lambda_handler(event, context): """ Lambda handler function param: event: The event object for the Lambda function. param: context: The context object for the lambda function. return: The list of Block objects recognized in the document passed in the event object. """ try: # Determine document source. if 'image' in event: # Decode the image image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = {'Bytes': img_b64decoded} elif 'S3Object' in event: image = {'S3Object': {'Bucket': event['S3Object']['Bucket'], 'Name': event['S3Object']['Name']} } else: raise ValueError( 'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.') # Analyze the document. response = textract_client.detect_document_text(Document=image) # Get the Blocks blocks = response['Blocks'] lambda_response = { "statusCode": 200, "body": json.dumps(blocks) } except ClientError as err: error_message = "Couldn't analyze image. " + \ err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": err.response['Error']['Code'], "ErrorMessage": error_message } } logger.error("Error function %s: %s", context.invoked_function_arn, error_message) except ValueError as val_error: lambda_response = { 'statusCode': 400, 'body': { "Error": "ValueError", "ErrorMessage": format(val_error) } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response Elija Implementar para implementar la función de Lambda.
Paso 4: Probar la función de Lambda
Ahora que ha creado la función Lambda, puede invocarla para detectar texto en un documento. En este paso, utiliza el código Python de su ordenador para pasar un documento local o un documento de un bucket de Amazon S3 a su función Lambda. Los documentos transferidos desde un ordenador local deben tener un tamaño inferior a 6291456 bytes. Si sus documentos son más grandes, cárguelos en un bucket de Amazon S3 y llame al script con la ruta de Amazon S3 a la imagen. Para obtener más información sobre cómo cargar archivos en un bucket de Amazon S3, consulte Cargar objetos.
Asegúrese de ejecutar el código en la misma AWS
región en la que creó la función Lambda. Puede ver la región de AWS
de la función de Lambda en la barra de navegación de la página de detalles de la función en la consola Lambda
Si la AWS Lambda función devuelve un error de tiempo de espera, amplíe el período de tiempo de espera de la función Lambda. Para obtener más información, consulte Configuración del tiempo de espera de la función (consola).
Para obtener más información sobre cómo invocar una función Lambda desde el código, consulte AWS Lambda Invocar funciones.
Cómo probar la función de Lambda
Si aún no lo ha hecho, haga lo siguiente:
-
Asegúrese de que el usuario tiene el permiso
lambda:InvokeFunction. Puede utilizar la siguiente política:Puede obtener el ARN de la función de Lambda en la descripción general de la función en la consola de Lambda
. Para dar acceso, agregue permisos a los usuarios, grupos o roles:
-
Usuarios y grupos en: AWS IAM Identity Center
Cree un conjunto de permisos. Siga las instrucciones de Creación de un conjunto de permisos en la Guía del usuario de AWS IAM Identity Center .
-
Usuarios gestionados en IAM a través de un proveedor de identidades:
Cree un rol para la federación de identidades. Siga las instrucciones descritas en Creación de un rol para un proveedor de identidad de terceros (federación) en la Guía del usuario de IAM.
-
Usuarios de IAM:
-
Cree un rol que el usuario pueda aceptar. Siga las instrucciones descritas en Creación de un rol para un usuario de IAM en la Guía del usuario de IAM.
-
(No recomendado) Adjunte una política directamente a un usuario o agregue un usuario a un grupo de usuarios. Siga las instrucciones descritas en Adición de permisos a un usuario (consola) de la Guía del usuario de IAM.
-
-
-
Instale y configure el AWS SDK para Python. Para obtener más información, consulte Paso 2: configurar el AWS CLI and AWS SDK.
-
-
Guarde el siguiente código en un archivo denominado
client.py:# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Test code for running the Amazon Textract Lambda function example code. """ import argparse import logging import base64 import json import io import boto3 from botocore.exceptions import ClientError from PIL import Image, ImageDraw logger = logging.getLogger(__name__) def analyze_image(function_name, image): """Analyzes a document with an AWS Lambda function. :param image: The document that you want to analyze. :return The list of Block objects in JSON format. """ lambda_client = boto3.client('lambda') lambda_payload = {} if image.startswith('s3://'): logger.info("Analyzing document from S3 bucket: %s", image) bucket, key = image.replace("s3://", "").split("/", 1) s3_object = { 'Bucket': bucket, 'Name': key } lambda_payload = {"S3Object": s3_object} else: with open(image, 'rb') as image_file: logger.info("Analyzing local document: %s ", image) image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} # Call the lambda function with the document. response = lambda_client.invoke(FunctionName=function_name, Payload=json.dumps(lambda_payload)) return json.loads(response['Payload'].read().decode()) def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "function", help="The name of the AWS Lambda function that you want " \ "to use to analyze the document.") parser.add_argument( "image", help="The document that you want to analyze.") def main(): """ Entrypoint for script. """ try: logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") # Get command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() # Get analysis results. result = analyze_image(args.function, args.image) status = result['statusCode'] blocks = result['body'] blocks = json.loads(blocks) if status == 200: for block in blocks: print('Type: ' + block['BlockType']) if block['BlockType'] != 'PAGE': print('Detected: ' + block['Text']) print('Confidence: ' + "{:.2f}".format(block['Confidence']) + "%") print('Id: {}'.format(block['Id'])) if 'Relationships' in block: print('Relationships: {}'.format(block['Relationships'])) print('Bounding Box: {}'.format(block['Geometry']['BoundingBox'])) print('Polygon: {}'.format(block['Geometry']['Polygon'])) print() print("Blocks detected: " + str(len(blocks))) else: print(f"Error: {result['statusCode']}") print(f"Message: {result['body']}") except ClientError as error: logging.error(error) print(error) if __name__ == "__main__": main() -
Ejecute el código. Para el argumento de la línea de comandos, proporcione el nombre de la función Lambda y el documento que desee analizar. Puede proporcionar una ruta a un documento local o puede usar la ruta de Amazon S3 a un documento almacenado en un bucket de Amazon S3. Por ejemplo:
python client.pyfunction_name s3://bucket/path/document.jpgSi el documento está en un bucket de Amazon S3, asegúrese de que es el mismo bucket que indicó anteriormente en el paso 12 de Paso 1: Crear un AWS Lambda función (consola).
Si se ejecuta correctamente, el código devuelve una respuesta JSON parcial para cada tipo de bloque detectado en el documento.