How to OCR documents on AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
class="container-fluid">
class="row">
class="col-md-2"> Amazon Lambda Architecture Logo related to How to OCR documents on AWS Lambda

這篇操作指南提供了使用 IronOCR 設置 AWS Lambda 函數的分步指南。 通過遵循本指南,您將學習如何配置 IronOCR 並高效讀取存儲在 S3 存儲桶中的文件。

class="hsg-featured-snippet">

如何在 AWS Lambda 上進行文件 OCR

  1. 下載 C# 庫以對文件進行 OCR
  2. 創建並選擇項目模板
  3. 修改 FunctionHandler 代碼
  4. 配置並部署項目
  5. 調用函數並在 S3 中檢查結果

安裝

本文將使用 S3 存儲桶,因此需要 AWSSDK.S3 包。

如果您使用 IronOCR ZIP,設置臨時文件夾是必須的。

// Set temporary folder path and log file path for IronOCR.
var awsTmpPath = @"/tmp/";
IronOcr.Installation.InstallationPath = awsTmpPath;
IronOcr.Installation.LogFilePath = awsTmpPath;
// Set temporary folder path and log file path for IronOCR.
var awsTmpPath = @"/tmp/";
IronOcr.Installation.InstallationPath = awsTmpPath;
IronOcr.Installation.LogFilePath = awsTmpPath;
' Set temporary folder path and log file path for IronOCR.
Dim awsTmpPath = "/tmp/"
IronOcr.Installation.InstallationPath = awsTmpPath
IronOcr.Installation.LogFilePath = awsTmpPath
$vbLabelText   $csharpLabel

立即開始在您的項目中使用 IronOCR 並免費試用。

第一步:
green arrow pointer

創建 AWS Lambda 項目

使用 Visual Studio,創建一個容器化的 AWS Lambda 是一個簡單的過程:

  • 安裝 AWS Toolkit for Visual Studio
  • 選擇 'AWS Lambda 項目 (.NET Core - C#)'。
  • 選擇 '.NET 8 (Container Image)' 藍圖,然後選擇 'Finish'。

選擇容器映像

添加包依賴項

在 .NET 8 中使用 IronOCR 庫在 AWS Lambda 上不需要安裝額外的依賴項。 使用以下內容修改項目的 Dockerfile:

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

# Update all installed packages
RUN dnf update -y

WORKDIR /var/task

# Copy build artifacts from the host machine into the Docker image
COPY "bin/Release/lambda-publish" .

修改 FunctionHandler 代碼

此範例從 S3 存儲桶中檢索圖像,處理後,將可搜索的 PDF 保存回相同的存儲桶。 在使用 IronOCR ZIP 時設置臨時文件夾是必需的,因為該庫需要寫入許可權以從 DLLs 複製運行時目錄。

using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronOcr;
using System;
using System.IO;
using System.Threading.Tasks;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace IronOcrZipAwsLambda
{
    public class Function
    {
        // Initialize the S3 client with a specific region endpoint
        private static readonly IAmazonS3 _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1);

        /// <summary>
        /// Function handler to process OCR on the PDF stored in S3.
        /// </summary>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        public async Task FunctionHandler(ILambdaContext context)
        {
            // Set up necessary paths for IronOCR
            var awsTmpPath = @"/tmp/";
            IronOcr.Installation.InstallationPath = awsTmpPath;
            IronOcr.Installation.LogFilePath = awsTmpPath;

            // Set license key for IronOCR
            IronOcr.License.LicenseKey = "IRONOCR-MYLICENSE-KEY-1EF01";

            string bucketName = "deploymenttestbucket"; // Your bucket name
            string pdfName = "sample";
            string objectKey = $"IronPdfZip/{pdfName}.pdf";
            string objectKeyForSearchablePdf = $"IronPdfZip/{pdfName}-SearchablePdf.pdf";

            try
            {
                // Retrieve the PDF file from S3
                var pdfData = await GetPdfFromS3Async(bucketName, objectKey);

                // Initialize IronTesseract for OCR processing
                IronTesseract ironTesseract = new IronTesseract();
                OcrInput ocrInput = new OcrInput();
                ocrInput.LoadPdf(pdfData);
                OcrResult result = ironTesseract.Read(ocrInput);

                // Log the OCR result
                context.Logger.LogLine($"OCR result: {result.Text}");

                // Upload the searchable PDF to S3
                await UploadPdfToS3Async(bucketName, objectKeyForSearchablePdf, result.SaveAsSearchablePdfBytes());
                context.Logger.LogLine($"PDF uploaded successfully to {bucketName}/{objectKeyForSearchablePdf}");
            }
            catch (Exception e)
            {
                context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
            }
        }

        /// <summary>
        /// Retrieves a PDF from S3 and returns it as a byte array.
        /// </summary>
        private async Task<byte[]> GetPdfFromS3Async(string bucketName, string objectKey)
        {
            var request = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = objectKey
            };

            using (var response = await _s3Client.GetObjectAsync(request))
            using (var memoryStream = new MemoryStream())
            {
                await response.ResponseStream.CopyToAsync(memoryStream);
                return memoryStream.ToArray();
            }
        }

        /// <summary>
        /// Uploads the generated searchable PDF back to S3.
        /// </summary>
        private async Task UploadPdfToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
        {
            using (var memoryStream = new MemoryStream(pdfBytes))
            {
                var request = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = objectKey,
                    InputStream = memoryStream,
                    ContentType = "application/pdf"
                };

                await _s3Client.PutObjectAsync(request);
            }
        }
    }
}
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronOcr;
using System;
using System.IO;
using System.Threading.Tasks;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace IronOcrZipAwsLambda
{
    public class Function
    {
        // Initialize the S3 client with a specific region endpoint
        private static readonly IAmazonS3 _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1);

        /// <summary>
        /// Function handler to process OCR on the PDF stored in S3.
        /// </summary>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        public async Task FunctionHandler(ILambdaContext context)
        {
            // Set up necessary paths for IronOCR
            var awsTmpPath = @"/tmp/";
            IronOcr.Installation.InstallationPath = awsTmpPath;
            IronOcr.Installation.LogFilePath = awsTmpPath;

            // Set license key for IronOCR
            IronOcr.License.LicenseKey = "IRONOCR-MYLICENSE-KEY-1EF01";

            string bucketName = "deploymenttestbucket"; // Your bucket name
            string pdfName = "sample";
            string objectKey = $"IronPdfZip/{pdfName}.pdf";
            string objectKeyForSearchablePdf = $"IronPdfZip/{pdfName}-SearchablePdf.pdf";

            try
            {
                // Retrieve the PDF file from S3
                var pdfData = await GetPdfFromS3Async(bucketName, objectKey);

                // Initialize IronTesseract for OCR processing
                IronTesseract ironTesseract = new IronTesseract();
                OcrInput ocrInput = new OcrInput();
                ocrInput.LoadPdf(pdfData);
                OcrResult result = ironTesseract.Read(ocrInput);

                // Log the OCR result
                context.Logger.LogLine($"OCR result: {result.Text}");

                // Upload the searchable PDF to S3
                await UploadPdfToS3Async(bucketName, objectKeyForSearchablePdf, result.SaveAsSearchablePdfBytes());
                context.Logger.LogLine($"PDF uploaded successfully to {bucketName}/{objectKeyForSearchablePdf}");
            }
            catch (Exception e)
            {
                context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
            }
        }

        /// <summary>
        /// Retrieves a PDF from S3 and returns it as a byte array.
        /// </summary>
        private async Task<byte[]> GetPdfFromS3Async(string bucketName, string objectKey)
        {
            var request = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = objectKey
            };

            using (var response = await _s3Client.GetObjectAsync(request))
            using (var memoryStream = new MemoryStream())
            {
                await response.ResponseStream.CopyToAsync(memoryStream);
                return memoryStream.ToArray();
            }
        }

        /// <summary>
        /// Uploads the generated searchable PDF back to S3.
        /// </summary>
        private async Task UploadPdfToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
        {
            using (var memoryStream = new MemoryStream(pdfBytes))
            {
                var request = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = objectKey,
                    InputStream = memoryStream,
                    ContentType = "application/pdf"
                };

                await _s3Client.PutObjectAsync(request);
            }
        }
    }
}
Imports Amazon.Lambda.Core
Imports Amazon.S3
Imports Amazon.S3.Model
Imports IronOcr
Imports System
Imports System.IO
Imports System.Threading.Tasks

' Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
<Assembly: LambdaSerializer(GetType(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))>

Namespace IronOcrZipAwsLambda
	Public Class [Function]
		' Initialize the S3 client with a specific region endpoint
		Private Shared ReadOnly _s3Client As IAmazonS3 = New AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1)

		''' <summary>
		''' Function handler to process OCR on the PDF stored in S3.
		''' </summary>
		''' <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
		Public Async Function FunctionHandler(ByVal context As ILambdaContext) As Task
			' Set up necessary paths for IronOCR
			Dim awsTmpPath = "/tmp/"
			IronOcr.Installation.InstallationPath = awsTmpPath
			IronOcr.Installation.LogFilePath = awsTmpPath

			' Set license key for IronOCR
			IronOcr.License.LicenseKey = "IRONOCR-MYLICENSE-KEY-1EF01"

			Dim bucketName As String = "deploymenttestbucket" ' Your bucket name
			Dim pdfName As String = "sample"
			Dim objectKey As String = $"IronPdfZip/{pdfName}.pdf"
			Dim objectKeyForSearchablePdf As String = $"IronPdfZip/{pdfName}-SearchablePdf.pdf"

			Try
				' Retrieve the PDF file from S3
				Dim pdfData = Await GetPdfFromS3Async(bucketName, objectKey)

				' Initialize IronTesseract for OCR processing
				Dim ironTesseract As New IronTesseract()
				Dim ocrInput As New OcrInput()
				ocrInput.LoadPdf(pdfData)
				Dim result As OcrResult = ironTesseract.Read(ocrInput)

				' Log the OCR result
				context.Logger.LogLine($"OCR result: {result.Text}")

				' Upload the searchable PDF to S3
				Await UploadPdfToS3Async(bucketName, objectKeyForSearchablePdf, result.SaveAsSearchablePdfBytes())
				context.Logger.LogLine($"PDF uploaded successfully to {bucketName}/{objectKeyForSearchablePdf}")
			Catch e As Exception
				context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}")
			End Try
		End Function

		''' <summary>
		''' Retrieves a PDF from S3 and returns it as a byte array.
		''' </summary>
		Private Async Function GetPdfFromS3Async(ByVal bucketName As String, ByVal objectKey As String) As Task(Of Byte())
			Dim request = New GetObjectRequest With {
				.BucketName = bucketName,
				.Key = objectKey
			}

			Using response = Await _s3Client.GetObjectAsync(request)
			Using memoryStream As New MemoryStream()
				Await response.ResponseStream.CopyToAsync(memoryStream)
				Return memoryStream.ToArray()
			End Using
			End Using
		End Function

		''' <summary>
		''' Uploads the generated searchable PDF back to S3.
		''' </summary>
		Private Async Function UploadPdfToS3Async(ByVal bucketName As String, ByVal objectKey As String, ByVal pdfBytes() As Byte) As Task
			Using memoryStream As New MemoryStream(pdfBytes)
				Dim request = New PutObjectRequest With {
					.BucketName = bucketName,
					.Key = objectKey,
					.InputStream = memoryStream,
					.ContentType = "application/pdf"
				}

				Await _s3Client.PutObjectAsync(request)
			End Using
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

在 try 塊之前,指定從 IronPdfZip 目錄讀取文件 'sample.pdf'。 然後使用 GetPdfFromS3Async 方法檢索 PDF 字節,並將其傳遞給 LoadPdf 方法。

增加內存和超時

Lambda 函數中分配的內存量將根據處理的文檔大小和同時處理的文檔數量而有所不同。 作為基線,將內存設置為 512 MB,將超時設置為 300 秒,位於 aws-lambda-tools-defaults.json

{
    "function-memory-size": 512,
    "function-timeout": 300
}

當內存不足時,程序將拋出錯誤:'Runtime exited with error: signal: killed.' 增加內存大小可以解決此問題。 有關更多詳情,請參考故障排除文章:AWS Lambda - Runtime Exited Signal: Killed

發布

要在 Visual Studio 中發布,右鍵單擊項目,選擇 'Publish to AWS Lambda...',然後配置必要的設置。 您可以在 AWS 網站 上閱讀有關發布 Lambda 的更多信息。

試試看!

您可以通過 Lambda 控制台或通過 Visual Studio 啟動 Lambda 函數。

常見問題解答

如何使用 C# 在 AWS 中對文件進行 OCR 識別?

您可以將 IronOCR 與 AWS Lambda 集成,從而對儲存在 Amazon S3 儲存桶中的文件執行 OCR 識別。這需要用 C# 建立一個 Lambda 函數,該函數從 S3 中檢索文檔,使用 IronOCR 處理文檔,然後將結果上傳回 S3。

使用 C# 在 AWS Lambda 上設定 OCR 需要哪些步驟?

若要使用 C# 在 AWS Lambda 上設定 OCR,您需要下載 IronOCR 庫,在 Visual Studio 中建立 AWS Lambda 項目,配置函數處理程序以使用 IronOCR 進行處理,然後部署函數。此設定可讓您將影像轉換為可搜尋的 PDF。

在 AWS Lambda 中執行 OCR 的建議配置是什麼?

為了在 AWS Lambda 中使用 IronOCR 運行 OCR 時獲得最佳效能,建議設定至少 512 MB 的記憶體分配和 300 秒的逾時時間。這些設定有助於管理大型文件或多個文件的處理。

如何在 AWS Lambda 中處理「運行時錯誤退出:訊號:已終止」?

此錯誤通常表示您的 Lambda 函數已耗盡其分配的記憶體。增加 Lambda 函數配置中的記憶體分配可以解決此問題,尤其是在使用 IronOCR 處理大型文件時。

我可以在部署前在本地測試我的 AWS Lambda OCR 函數嗎?

是的,您可以使用適用於 Visual Studio 的 AWS 工具包在本機上測試您的 AWS Lambda OCR 函數。該工具包提供了一個用於模擬 Lambda 執行的本地環境,使您能夠在部署之前調試和優化您的函數。

在 AWS Lambda 專案中,Dockerfile 的用途是什麼?

AWS Lambda 專案中的 Dockerfile 用於建立容器映像,該映像定義了 Lambda 函數的執行環境和相依性。這確保您的函數擁有在 AWS 中經常運行所需的所有元件。

在 AWS Lambda 上使用 .NET 8 中的 IronOCR 是否需要任何額外的依賴項?

在 AWS Lambda 上使用 .NET 8 時,除了 IronOCR 庫和必要的 AWS SDK 套件之外,無需其他相依性。這簡化了執行 OCR 任務的整合過程。

將 C# OCR 與 AWS Lambda 整合有哪些先決條件?

在將 C# OCR 與 AWS Lambda 整合之前,您需要安裝適用於 S3 的 AWS 開發工具包、IronOCR 程式庫和適用於 Visual Studio 的 AWS 工具包。您還需要一個已配置好的 S3 儲存桶,用於儲存和檢索文件。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 5,044,537 | 版本: 2025.11 剛剛發布