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.
Gestión de llamadas limitadas y conexiones interrumpidas
Una operación de Amazon Textract Texact puede fallar si supera el número máximo de transacciones por segundo (TPS), lo que hace que el servicio limite la aplicación o cuando se cae la conexión. Por ejemplo, si realiza demasiadas llamadas a operaciones de Amazon Textract Texact en un corto período de tiempo, limita las llamadas y envía unProvisionedThroughputExceededException
error en la respuesta de la operación. Para obtener información sobre cuotas de Amazon Textract TPS, consulteCuotas de Amazon Textract.
Puede administrar la limitación y las conexiones caídas si vuelve a intentar automáticamente la operación. Puede especificar el número de reintentos incluyendo elConfig
cuando se crea el cliente de Amazon Textract. Recomendamos un recuento de reintentos de 5. LaAWSEl SDK reintenta una operación la cantidad especificada de veces antes de que se produzca el error y de que se lanza una excepción. Para obtener más información, consulte Reintentos de error y retardo exponencial en AWS.
Los reintentos automáticos funcionan tanto para operaciones síncronas como asíncronas. Antes de especificar reintentos automáticos, asegúrese de que tiene la versión más reciente del SDK de AWS. Para obtener más información, consulte Paso 2: Configurar laAWS CLIyAWSSDK de.
En el siguiente ejemplo se muestra cómo reintentar las operaciones de Amazon Textract automáticamente cuando se procesan varios documentos.
Para reintentar automáticamente las operaciones
-
Cargue varias imágenes de documento en el bucket de S3 para que se lure el ejemplo sincrónico. Cargue un documento de varias páginas en su bucket de S3 y ejecuteStartDocumentTextDetection
para ejecutar el ejemplo asíncrono.
Para obtener instrucciones, consulteCarga de objetos en Amazon S3en laAmazon Simple Storage Service User Guide.
-
En los siguientes ejemplos se muestra cómo utilizar elConfig
para volver a intentar automáticamente una operación. El ejemplo sincrónico llama alDetectDocumentText
, mientras que el ejemplo asíncrono llama alGetDocumentTextDetection
.
- Sync Example
-
Utilice los siguientes ejemplos para llamar alDetectDocumentText
en los documentos de su bucket de Amazon S3. Enmain
, cambie el valor debucket
en su bucket de S3. Cambiar el valor dedocuments
a los nombres de las imágenes de documento que ha subido en el paso 2.
import boto3
from botocore.client import Config
# Documents
def process_multiple_documents(bucket, documents):
config = Config(retries = dict(max_attempts = 5))
# Amazon Textract client
textract = boto3.client('textract', config=config)
for documentName in documents:
print("\nProcessing: {}\n==========================================".format(documentName))
# Call Amazon Textract
response = textract.detect_document_text(
Document={
'S3Object': {
'Bucket': bucket,
'Name': documentName
}
})
# Print detected text
for item in response["Blocks"]:
if item["BlockType"] == "LINE":
print ('\033[94m' + item["Text"] + '\033[0m')
def main():
bucket = ""
documents = ["document-image-1.png",
"document-image-2.png", "document-image-3.png",
"document-image-4.png", "document-image-5.png" ]
process_multiple_documents(bucket, documents)
if __name__ == "__main__":
main()
- Async Example
-
Utilice los siguientes ejemplos para llamar a la operación GetDocumentTextDetection
. Supone que ya ha llamadoStartDocumentTextDetection
en los documentos de su bucket de Amazon S3 y obtuvo unJobId
. Enmain
, cambie el valor debucket
en su bucket de S3 y el valor deroleArn
al Arn asignado a su rol Textract. También necesitará cambiar el valor dedocument
al nombre del documento de varias páginas del bucket de Amazon S3. Por último, sustituya el valor deregion_name
con el nombre de su región y proporcione elGetResults
función con el nombre de sujobId
.
import boto3
from botocore.client import Config
class DocumentProcessor:
jobId = ''
region_name = ''
roleArn = ''
bucket = ''
document = ''
sqsQueueUrl = ''
snsTopicArn = ''
processType = ''
def __init__(self, role, bucket, document, region):
self.roleArn = role
self.bucket = bucket
self.document = document
self.region_name = region
self.config = Config(retries = dict(max_attempts = 5))
self.textract = boto3.client('textract', region_name=self.region_name, config=self.config)
self.sqs = boto3.client('sqs')
self.sns = boto3.client('sns')
# Display information about a block
def DisplayBlockInfo(self, block):
print("Block Id: " + block['Id'])
print("Type: " + block['BlockType'])
if 'EntityTypes' in block:
print('EntityTypes: {}'.format(block['EntityTypes']))
if 'Text' in block:
print("Text: " + block['Text'])
if block['BlockType'] != 'PAGE':
print("Confidence: " + "{:.2f}".format(block['Confidence']) + "%")
print('Page: {}'.format(block['Page']))
if block['BlockType'] == 'CELL':
print('Cell Information')
print('\tColumn: {} '.format(block['ColumnIndex']))
print('\tRow: {}'.format(block['RowIndex']))
print('\tColumn span: {} '.format(block['ColumnSpan']))
print('\tRow span: {}'.format(block['RowSpan']))
if 'Relationships' in block:
print('\tRelationships: {}'.format(block['Relationships']))
print('Geometry')
print('\tBounding Box: {}'.format(block['Geometry']['BoundingBox']))
print('\tPolygon: {}'.format(block['Geometry']['Polygon']))
if block['BlockType'] == 'SELECTION_ELEMENT':
print(' Selection element detected: ', end='')
if block['SelectionStatus'] == 'SELECTED':
print('Selected')
else:
print('Not selected')
def GetResults(self, jobId):
maxResults = 1000
paginationToken = None
finished = False
while finished == False:
response = None
if paginationToken == None:
response = self.textract.get_document_text_detection(JobId=jobId,
MaxResults=maxResults)
else:
response = self.textract.get_document_text_detection(JobId=jobId,
MaxResults=maxResults,
NextToken=paginationToken)
blocks = response['Blocks']
print('Detected Document Text')
print('Pages: {}'.format(response['DocumentMetadata']['Pages']))
# Display block information
for block in blocks:
self.DisplayBlockInfo(block)
print()
print()
if 'NextToken' in response:
paginationToken = response['NextToken']
else:
finished = True
def main():
roleArn = 'role-arn'
bucket = 'bucket-name'
document = 'document-name'
region_name = 'region-name'
analyzer = DocumentProcessor(roleArn, bucket, document, region_name)
analyzer.GetResults("job-id")
if __name__ == "__main__":
main()