As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Detectando texto com um AWS Lambda função
AWS Lambda é um serviço de computação que você pode usar para executar código sem provisionar ou gerenciar servidores. Você pode chamar as operações da API Amazon Textract de dentro de uma função do AWS Lambda. As instruções a seguir mostram como criar uma função do Lambda em Python que chame DetectDocumentText.
A função Lambda retorna uma lista de objetos Block com informações sobre as palavras e linhas de texto detectadas. As instruções incluem um exemplo de código Python que mostra como chamar a função Lambda com um documento fornecido de um bucket do Amazon S3 ou do seu computador local. As imagens armazenadas no Amazon S3 devem estar no formato de documento PDF ou TIFF de página única ou no formato JPEG ou PNG. As imagens locais devem estar em formato PDF ou TIFF de página única. O código Python retorna parte da resposta JSON para cada tipo de bloco detectado no documento.
Para ver um exemplo que usa funções Lambda para processar documentos em grande escala, consulte Amazon Textract IDP CDK
Tópicos
Etapa 1: criar um AWS Lambda função (console)
Nesta etapa, você cria uma AWS Lambda função vazia e uma função de execução do IAM que permite que sua função chame a DetectDocumentText operação. Se você estiver fornecendo documentos do Amazon S3, esta etapa também mostra como conceder acesso ao bucket que armazena seus documentos.
Posteriormente, você adiciona o código-fonte e, opcionalmente, adiciona uma camada à função Lambda.
Para criar um AWS Lambda função (console)
Faça login no Console de gerenciamento da AWS e abra o AWS Lambda console em https://console.aws.amazon.com/lambda/
. -
Escolha a opção Criar função. Para obter mais informações, consulte Criar uma função do Lambda com o console.
-
Escolha as seguintes opções:
-
Escolha Criar do zero.
-
Insira um valor para Nome da função.
-
Em Runtime, escolha Python 3.9.
-
Em Architecture (Arquitetura), escolha x86_64.
-
-
Escolha Criar função para criar a função do AWS Lambda .
Na página da função, escolha a guia Configuração.
-
No painel Permissões, em Função de execução, escolha o nome do perfil para abrir o perfil no console do IAM.
-
Na guia Permissões, escolha Adicionar permissões e, em seguida, Criar política em linha.
Escolha a guia JSON e substitua a política pela seguinte política:
Selecione Revisar política.
Insira um nome para a política, por exemplo DetectDocumentText-access.
Selecione Criar política.
-
Se você estiver armazenando documentos para análise em um bucket do Amazon S3, deverá adicionar uma política de acesso do Amazon S3. Para fazer isso, repita as etapas 7 a 11 no console da AWS Lambda e faça as seguintes alterações.
-
Para a etapa 8, use a política a seguir.
bucket/folder pathSubstitua pelo bucket e pelo caminho da pasta do Amazon S3 até os documentos que você deseja analisar. Para a etapa 10, escolha um nome de política diferente, como S3Bucket-access.
-
Etapa 2: (opcional) crie uma camada (console)
Para executar esse exemplo, você não precisa executar essa etapa. A DetectDocumentText operação está incluída no ambiente padrão do Lambda Python como parte do AWS SDK for Python (Boto3). Se outras partes da sua função do Lambda exigirem atualizações de AWS serviço recentes que não estejam no ambiente padrão do Lambda Python, execute esta etapa para adicionar a versão mais recente do SDK do Boto3 como uma camada à sua função.
Primeiro, você cria um arquivo zip que contém o SDK do Boto3. Em seguida, você cria uma camada e adiciona o arquivo zip à camada. Para obter mais informações, consulte Usar camadas com sua função do Lambda.
Para criar e adicionar uma camada (console)
-
Abra um prompt de comando e insira os comandos a seguir para criar um pacote de implantação com a versão mais recente do SDK da AWS.
pip install boto3 --target python/. zip boto3-layer.zip -r python/ Anote o nome do arquivo zip (boto3-layer.zip), que você usa na etapa 8 deste procedimento.
Abra o AWS Lambda console em https://console.aws.amazon.com/lambda/
. -
No painel de navegação, escolha Camadas.
-
Escolha Criar camada.
-
Insira valores para Nome e Descrição.
-
Em Tipo de entrada de código, escolha Carregar um arquivo.zip e selecione Upload.
-
Na caixa de diálogo, escolha o arquivo zip (boto3-layer.zip) que você criou na etapa 1 deste procedimento.
-
Para tempos de execução compatíveis, escolha Python 3.9.
-
Escolha Criar para criar a camada.
-
Escolha o ícone do menu do painel de navegação.
-
Selecione Funções no painel de navegação.
-
Na lista de recursos, escolha a função que você criou anteriormente em Etapa 1: criar um AWS Lambda função (console).
-
Escolha a guia Código.
-
Na seção Camadas, escolha Adicionar uma camada.
-
Escolha camadas personalizadas.
-
Em Camadas personalizadas, escolha o nome da camada que você inseriu na etapa 6.
Em Versão, escolha a versão da camada, que deve ser 1.
-
Escolha Adicionar.
Etapa 3: adicione o código em Python (console)
Nesta etapa, você adiciona código Python à função do Lambda usando o editor de código do console do Lambda. O código detecta texto em um documento com DetectDocumentText e retorna uma lista de objetos Block com informações sobre o texto detectado. O documento pode estar localizado em um bucket do Amazon S3 ou em um computador local. As imagens armazenadas no Amazon S3 devem ser documentos em formato PDF ou TIFF de página única ou no formato JPEG ou PNG. As imagens locais devem estar em formato PDF ou TIFF de página única.
Para adicionar um código em Python (console)
Navegue até a guia Código .
-
No editor de código, substitua o código em lambda_function.py pelo código a seguir:
# 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 Escolha Implantar para implantar sua função do Lambda.
Etapa 4: teste sua função do Lambda
Agora que você criou sua função Lambda, você pode invocá-la para detectar texto em um documento. Nesta etapa, você usa o código Python em seu computador para passar um documento local ou um documento em um bucket do Amazon S3 para sua função Lambda. Os documentos transmitidos de um computador local devem ter menos de 6291456 bytes. Se seus documentos forem maiores, faça o upload deles em um bucket do Amazon S3 e chame o script com o caminho do Amazon S3 para a imagem. Para obter mais informações sobre como fazer upload de arquivos para um bucket do Amazon S3, consulte Fazer upload de objetos.
Certifique-se de executar o código na mesma AWS
região em que você criou a função Lambda. É possível visualizar a região da AWS
da sua função do Lambda na barra de navegação da página de detalhes da função no console do Lambda
Se a AWS Lambda função retornar um erro de tempo limite, estenda o período de tempo limite da função Lambda. Para obter mais informações, consulte Configurar o tempo limite da função (console).
Para obter mais informações sobre como invocar uma função Lambda a partir do seu código, consulte AWS Lambda Invocando funções.
Para testar a função do Lambda
Se você ainda não fez isso, faça o seguinte:
-
Certifique-se de que o usuário tenha permissão
lambda:InvokeFunction. Você pode usar a seguinte política:Você pode obter o ARN da sua função do Lambda na visão geral da função no console do Lambda
. Para conceder acesso, adicione as permissões aos seus usuários, grupos ou perfis:
-
Usuários e grupos em Centro de Identidade do AWS IAM:
Crie um conjunto de permissões. Siga as instruções em Criação de um conjunto de permissões no Guia do usuário do Centro de Identidade do AWS IAM .
-
Usuários gerenciados no IAM com provedor de identidades:
Crie um perfil para a federação de identidades. Siga as instruções em Criando um perfil para um provedor de identidades de terceiros (federação) no Guia do Usuário do IAM.
-
Usuários do IAM:
-
Crie um perfil que seu usuário possa assumir. Siga as instruções em Criação de um perfil para um usuário do IAM no Guia do usuário do IAM.
-
(Não recomendado) Vincule uma política diretamente a um usuário ou adicione um usuário a um grupo de usuários. Siga as instruções em Adição de permissões a um usuário (console) no Guia do usuário do IAM.
-
-
-
Instale e configure o AWS SDK para Python. Para obter mais informações, consulte Etapa 2: configurar o AWS CLI and AWS SDKs.
-
-
Salve o código a seguir em um arquivo chamado
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() -
Execute o código. Para o argumento da linha de comando, forneça o nome da função Lambda e o documento que você deseja analisar. Você pode fornecer um caminho para um documento local ou usar o caminho do Amazon S3 para um documento armazenado em um bucket do Amazon S3. Por exemplo:
python client.pyfunction_name s3://bucket/path/document.jpgSe o documento estiver em um bucket do Amazon S3, certifique-se de que seja o mesmo bucket que você especificou anteriormente na etapa 12 do Etapa 1: criar um AWS Lambda função (console).
Se for bem-sucedido, seu código retornará uma resposta JSON parcial para cada tipo de bloco detectado no documento.