本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS Lambda 函數偵測文字
AWS Lambda 是一種運算服務,您可以用來執行程式碼,而無需佈建或管理伺服器。您可以從 AWS Lambda 函數內呼叫 Amazon Textract API 操作。下列指示說明如何在 Python 中建立呼叫 DetectDocumentText 的 Lambda 函數。
Lambda 函數會傳回 Block 物件的清單,其中包含偵測到的單字和文字行的相關資訊。這些指示包含 Python 程式碼範例,說明如何使用 Amazon S3 儲存貯體或本機電腦提供的文件來呼叫 Lambda 函數。存放在 Amazon S3 中的影像必須是單頁 PDF 或 TIFF 文件格式,或是 JPEG 或 PNG 格式。本機映像必須是單頁 PDF 或 TIFF 格式。Python 程式碼會針對文件中偵測到的每個區塊類型傳回部分 JSON 回應。
如需使用 Lambda 函數大規模處理文件的範例,請參閱 Amazon Textract IDP CDK 建構
步驟 1:建立 AWS Lambda 函數 (主控台)
在此步驟中,您會建立空 AWS Lambda 函數和 IAM 執行角色,讓您的函數呼叫 DetectDocumentText操作。如果您從 Amazon S3 提供文件,此步驟也會說明如何授予儲存文件之儲存貯體的存取權。
稍後您會新增原始程式碼,並選擇性地將圖層新增至 Lambda 函數。
建立 AWS Lambda 函數 (主控台)
登入 AWS 管理主控台 ,並在 https://https://console.aws.amazon.com/lambda/
開啟 AWS Lambda 主控台。 -
選擇建立函數 。如需詳細資訊,請參閱使用主控台建立 Lambda 函數。
-
選擇下列選項:
-
選擇從頭開始撰寫。
-
輸入 函數的名稱 的值。
-
針對 Runtime (執行階段),選擇 Python 3.9。
-
對於 Architecture (架構),選擇 x86_64。
-
-
選擇建立函數來建立 AWS Lambda 函數。
在函數頁面上,選擇組態標籤。
-
在許可窗格上,執行角色下,選擇要在 IAM 主控台中開啟角色的角色名稱。
-
在許可標籤中,選擇新增許可 ,然後建立內嵌政策。
選擇 JSON 標籤,並預設文字取代為下列內容:
選擇檢閱政策。
輸入政策的名稱,例如 DetectDocumentText-access。
選擇建立政策。
-
如果您要將文件存放於 Amazon S3 儲存貯體中進行分析,則必須新增 Amazon S3 存取政策。若要這麼做,請在 AWS Lambda 主控台中重複步驟 7 到 11,然後進行下列變更。
-
對於步驟 8,請使用下列原則。將儲存
貯體/資料夾路徑取代為您要分析之文件的 Amazon S3 儲存貯體和資料夾路徑。 對於步驟 10,請選擇不同的原則名稱,例如 S3Bucket-access。
-
步驟 2:(可選) 建立圖層 (主控台)
若要執行此範例,您不需要執行此步驟。DetectDocumentText 操作包含在預設的 Lambda Python 環境中,作為適用於 Python (Boto3) 的 AWS SDK 的一部分。如果 Lambda 函數的其他部分需要不在預設 Lambda Python 環境中的最新 AWS 服務更新,請執行此步驟,將最新的 Boto3 SDK 版本作為 layer 新增至函數。
首先,您建立包含 Boto3 開發套件的 zip 檔案封存。然後,建立一個圖層並將 zip 檔案存檔新增到圖層中。如需詳細資訊,請參閱搭配使用圖層和 Lambda 函數。
建立並新增圖層(主控台)
-
開啟命令提示字元並輸入下列命令,以使用最新版本的 AWS 開發套件建立部署套件。
pip install boto3 --target python/. zip boto3-layer.zip -r python/ 請注意您在此程序的步驟 8 中使用的壓縮檔案 (boto3-layer.zip) 的名稱。
在 https://https://console.aws.amazon.com/lambda/
開啟 AWS Lambda 主控台。 -
在導覽視窗中,選擇 圖層。
-
選擇 建立圖層。
-
輸入 名稱 和 描述 的值。
-
針對程式碼項目類型,選擇上傳 .zip 檔案並選取上傳。
-
在對話方塊中,選擇您在此程序的步驟 1 中建立的壓縮檔案封存 (boto3-layer.zip)。
-
針對相容的執行時間,選擇 Python 3.9。
-
選擇 建立,以建立圖層。
-
選擇導覽視窗選單圖示。
-
在導覽視窗中,選擇函數。
-
在資源清單中,選擇您先前在 步驟 1:建立 AWS Lambda 函數 (主控台) 中建立的函數。
-
選取程式碼標籤。
-
在 圖層 部份,選擇 新增圖層。
-
選擇 自訂圖層。
-
在自訂圖層中,選擇您在步驟 6 中輸入的圖層名稱。
在 版本中,選擇圖層版本,該版本應為 1。
-
選擇 新增。
步驟 3:新增 Python 程式碼 (主控台)
在此步驟中,您將使用 Lambda 主控台程式碼編輯器將 Python 程式碼新增至 Lambda 函數。此程式碼會使用 偵測文件中的文字,DetectDocumentText並傳回包含偵測到文字相關資訊的封鎖物件清單。文件可以位於 Amazon S3 儲存貯體或本機電腦。存放在 Amazon S3 中的影像必須是單頁 PDF 或 TIFF 格式的文件,或是 JPEG 或 PNG 格式。本機映像必須是單頁 PDF 或 TIFF 格式。
新增 Python 程式碼 (主控台)
瀏覽至程式碼標籤。
-
在程式碼編輯器中,以下列程式碼取代 lambda_function.py 中的程式碼:
# 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 若要部署您的 Lambda 函數,請選擇部署。
步驟 4:嘗試使用您的 Lambda 函數
現在您已建立 Lambda 函數,您可以叫用它來偵測文件中的文字。在此步驟中,您可以在電腦上使用 Python 程式碼,將本機文件或 Amazon S3 儲存貯體中的文件傳遞至 Lambda 函數。從本機電腦傳遞的文件必須小於 6291456 位元組。如果您的文件較大,請將其上傳至 Amazon S3 儲存貯體,並使用映像的 Amazon S3 路徑呼叫指令碼。有關將圖像檔案上傳到 Amazon S3 儲存貯體的資訊,請參閱 上傳物體。
請務必在AWS建立 Lambda 函數的相同區域中執行程式碼。您可以在 Lambda 主控台
如果 AWS Lambda 函數傳回逾時錯誤,請延長 Lambda 函數的逾時期間。如需詳細資訊,請參閱設定函數逾時 (主控台)。
如需從程式碼叫用 Lambda 函數的詳細資訊,請參閱叫用 AWS Lambda 函數。
部署 Lambda 函數
如果您尚未執行以下操作,請現在執行:
-
請確定使用者具有
lambda:InvokeFunction權限。您可以使用下列專案:您可以從 Lambda 主控台
的函數概觀取得 Lambda 函數的 ARN。 若要提供存取權,請新增權限至您的使用者、群組或角色:
-
中的使用者和群組 AWS IAM Identity Center:
建立權限合集。請按照《AWS IAM Identity Center 使用者指南》中的建立權限合集說明進行操作。
-
透過身分提供者在 IAM 中管理的使用者:
建立聯合身分的角色。遵循《IAM 使用者指南》的為第三方身分提供者 (聯合) 建立角色中的指示。
-
IAM 使用者:
-
建立您的使用者可擔任的角色。請按照《IAM 使用者指南》的為 IAM 使用者建立角色中的指示。
-
(不建議) 將政策直接附加至使用者,或將使用者新增至使用者群組。請遵循《IAM 使用者指南》的新增許可到使用者 (主控台) 中的指示。
-
-
-
安裝和設定適用於 Python 的 AWS SDK。如需詳細資訊,請參閱步驟 2:設定 AWS CLI 和 AWS SDKs。
-
-
將下列程式碼複製到名為
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() -
執行程式碼。對於命令列引數,請提供 Lambda 函數名稱和您要分析的文件。您可以提供本機文件的路徑,也可以使用 Amazon S3 路徑來存放於 Amazon S3 儲存貯體中的文件。例如:
python client.pyfunction_name s3://bucket/path/document.jpg如果文件位於 Amazon S3 儲存貯體中,請確定该文件是與之前在 步驟 1:建立 AWS Lambda 函數 (主控台) 的步驟 12 中指定的相同儲存貯體。
如果成功,您的程式碼會針對文件中偵測到的每個區塊類型傳回部分 JSON 回應。