Uso de IronOcr para leer documentos en AWS Lambda

Este artículo explicativo le guía por los pasos para configurar una función de AWS Lambda con IronOCR. Con esta guía, aprenderás a configurar IronOCR y leer documentos desde un S3 Bucket.

1. Crear un AWS Lambda con una plantilla de contenedor

Para que IronOcr funcione correctamente, ciertas dependencias deben estar instaladas en la máquina de uno, para asegurar que estas dependencias están instaladas, la función Lambda debe ser contenedorizada.

Con Visual Studio, crear un AWS Lambda en contenedor es un proceso sencillo: basta con instalar la aplicación AWS Tookit para Visual StudioSelecciona una plantilla AWS Lambda C#, luego selecciona un blueprint Container Image, luego selecciona "Finish".

2. Añadir dependencias de paquetes

Modifica el dockerfile del proyecto con lo siguiente:


# Establecer en dotnet:5 o dotnet:6 para .NET 5/6

FROM public.ecr.aws/lambda/dotnet:7

WORKDIR /var/task

EJECUTAR yum update -y

EJECUTAR yum install -y amazon-linux-extras

RUN amazon-linux-extras install epel -y

RUN yum install -y libgdiplus

COPIAR "bin/Release/lambda-publish" .

3. Instale los paquetes IronOcr y IronOcr.Linux NuGet

Para instalar los paquetes IronOcr e IronOcr.Linux en Visual Studio:

  1. Vaya a Proyecto > Gestionar paquetes NuGet....
  2. Seleccione Browse y busque IronOcr e IronOcr.Linux.
  3. Selecciona los paquetes e instálalos.

4. Modificar el código de FunctionHandler

Este ejemplo recuperará una imagen de un bucket S3 y la leerá. Utiliza la clase Image de SixLabors para cargar la imagen en IronOcr. Para que el ejemplo funcione, se debe configurar un bucket de S3 y el archivo SixLabors.ImageSharp El paquete NuGet debe estar instalado.

:path=/static-assets/ocr/content-code-examples/how-to/iron-ocr-aws-lambda-sample.cs
using Amazon;
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using SixLabors.ImageSharp;
using IronOcr;

//  para permitir que la entrada JSON de la función Lambda se convierta en una clase .NET.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace IronOcrAWSLambda;

public class Function
{
	private readonly IAmazonS3 _s3Client;
	private readonly string accessKey;
	private readonly string secretKey;

	public Function()
	{
		accessKey = "ACCESS-KEY";
		secretKey = "SECRET-KEY";
		_s3Client = new AmazonS3Client(accessKey, secretKey);
	}
	public async Task<string> FunctionHandler(string input, ILambdaContext context)
	{
		IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
		string bucketName = "S3-BUCKET-NAME";

		var getObjectRequest = new GetObjectRequest
		{
			BucketName = bucketName,
			Key = input,
		};

		using (GetObjectResponse response = await _s3Client.GetObjectAsync(getObjectRequest))
		{
			//  Leer el contenido del objeto
			using (Stream responseStream = response.ResponseStream)
			{
				Console.WriteLine("Reading image from S3");
				Image image = Image.Load(responseStream);

				Console.WriteLine("Reading image with IronOCR");
				IronTesseract ironTesseract = new IronTesseract();
				OcrInput ocrInput = new OcrInput(image);
				OcrResult result = ironTesseract.Read(ocrInput);

				return result.Text;
			}
		}
	}
}
Imports Amazon
Imports Amazon.Lambda.Core
Imports Amazon.S3
Imports Amazon.S3.Model
Imports SixLabors.ImageSharp
Imports IronOcr

'  para permitir que la entrada JSON de la función Lambda se convierta en una clase .NET.
<Assembly: LambdaSerializer(GetType(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))>

Namespace IronOcrAWSLambda

	Public Class [Function]
		Private ReadOnly _s3Client As IAmazonS3
		Private ReadOnly accessKey As String
		Private ReadOnly secretKey As String

		Public Sub New()
			accessKey = "ACCESS-KEY"
			secretKey = "SECRET-KEY"
			_s3Client = New AmazonS3Client(accessKey, secretKey)
		End Sub
		Public Async Function FunctionHandler(ByVal input As String, ByVal context As ILambdaContext) As Task(Of String)
			IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY"
			Dim bucketName As String = "S3-BUCKET-NAME"

			Dim getObjectRequest As New GetObjectRequest With {
				.BucketName = bucketName,
				.Key = input
			}

			Using response As GetObjectResponse = Await _s3Client.GetObjectAsync(getObjectRequest)
				'  Leer el contenido del objeto
				Using responseStream As Stream = response.ResponseStream
					Console.WriteLine("Reading image from S3")
					Dim image As Image = System.Drawing.Image.Load(responseStream)

					Console.WriteLine("Reading image with IronOCR")
					Dim ironTesseract As New IronTesseract()
					Dim ocrInput As New OcrInput(image)
					Dim result As OcrResult = ironTesseract.Read(ocrInput)

					Return result.Text
				End Using
			End Using
		End Function
	End Class
End Namespace
VB   C#

5. Aumentar la memoria y el tiempo de espera

La cantidad de memoria a asignar en la Lambda variará en función del tamaño de los documentos que se lean y de cuántos se lean a la vez. Como referencia, establece el tamaño de la memoria en 512 MB y el tiempo de espera en 300 segundos en aws-lambda-tools-defaults.json:


"function-memory-size" : 512,

"función-tiempo de espera" : 300

6. Publique

Para publicar en Visual Studio, basta con hacer clic con el botón derecho del ratón en la solución y seleccionar Publish to AWS Lambda... (Publicar en AWS Lambda...), y a continuación establecer las configuraciones. Puede obtener más información sobre la publicación de una lambda en la página Sitio web de AWS.

7. Pruébalo.

Puede activar la función Lambda a través del botón Consola Lambda o a través de Visual Studio.