彩票走势图

LEADTOOLS 入门教程: 使用 AWS Lambda 转换文档 - C# .NET Core

翻译|使用教程|编辑:胡涛|2022-11-15 14:14:11.653|阅读 134 次

概述:本文介绍在leadtools中,使用 AWS Lambda 转换文档,欢迎查阅~

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:


慧都年终大促

LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理,PDF,打印捕获,归档,注释和显示功能。利用业界领先的图像处理技术,能够智能识别文件,可以用来识别任何类型的扫描或传真形式的图像。

LEADTOOLS 最新下载

本教程展示了如何配置和运行 .NET Core 文档服务。

概括 本教程介绍如何设置 AWS Lambda 以与 LEADTOOLS SDK 一起使用以及如何使用 .NET Core 转换文档。
完成时间 60分钟
平台
IDE Visual Studio 2019、2022、AWS Lambda Visual Studio 扩展
开发许可证 下载 LEADTOOLS

在学习从 LEADDocument中添加和删除页面 - C# .NET Core 教程之前,通过查看添加引用和设置许可教程来熟悉创建项目的基本步骤。

完成 Visual Studio 的 AWS 设置;

要设置开发环境以在 Visual Studio 中使用 AWS,请完成来自 Amazon 的以下 2 个教程:

完成这些教程后,应安装适用于 Visual Studio 的 AWS 工具包,并基本了解如何为 .NET Core 创建新的 AWS Lambda 项目并发布到 AWS。

创建一个空函数

在 Visual Studio 中,创建一个新的AWS Lambda 项目(.NET Core - C#)项目。为项目命名和位置,然后单击创建

选择一个空函数并单击确定

添加 LEADTOOLS 参考

所需的参考取决于项目的目的。对于这个项目,需要以下 NuGet 包:

  • Leadtools.Document.Sdk

在解决方案资源管理器中右键单击 C# 项目,然后选择管理 NuGet 包...。

浏览LEADTOOLS,然后选择Leadtools.Document.SdkNuGet 包并安装它。接受 LEAD 的最终用户许可协议。

有关特定格式所需的编解码器 DLL 的完整列表,请参阅。

添加 LEADRequest.cs 类

右键单击 C# 项目并选择Add,然后选择Class。为其命名LEADRequest.cs并单击添加

将以下内容添加到using块中:

【C#】

using Leadtools.Document.Writer;

【C#】

public class LEADRequest
{
public string InputUrl { get; set; }
public DocumentFormat DocumentFormat { get; set; }
public LEADRequest()
{
}
}
添加 LEADLambdaHandler 类

右键单击 C# 项目并选择Add,然后选择Class。为其命名LEADLambdaHandler.cs并单击添加。

在新类中,将以下内容添加到using块中:

【C#】

using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using Amazon.Lambda.Core;
using Leadtools;
using Leadtools.Document;
using Leadtools.Document.Converter;
using Leadtools.Document.Writer;
using Leadtools.Ocr;

复制下面的代码以将所需的功能添加到类中:

【C#】

public class LEADLambdaHandler
{
// Global Variables
IOcrEngine ocrEngine;
DocumentConverter documentConverter;
static HttpClient httpClient = new HttpClient();

// Constructor which handles all initialization to make sure the function is as fast as possible once it is warmed up
public LEADLambdaHandler()
{
InitEnvironment();

Platform.LibraryPath = "/opt/native-runtimes/";

InitLEADTOOLS();
}

// Method which initializes the Lambda environment for use by the LEADTOOLS SDK
void InitEnvironment()
{
// Set the LD_LIBRARY_PATH in function console to include:
// /var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib:/tmp

ExecuteBashCommand("ln -s /lib64/libdl.so.2 /tmp/libdl.so");
}

// Initialize the LEADTOOLS SDK Classes
void InitLEADTOOLS()
{
SetLicense();

RasterDefaults.TemporaryDirectory = "/tmp";

RasterDefaults.SetResourceDirectory(LEADResourceDirectory.Fonts, "/opt/ShadowFonts");

ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
ocrEngine.Startup(null, null, "/tmp", "/opt/OcrLEADRuntime");

documentConverter = new DocumentConverter();
documentConverter.SetOcrEngineInstance(ocrEngine, true);
}

// Helper method for executing shell scripts in the Lambda environment
string ExecuteBashCommand(string command)
{
command = command.Replace("\"", "\"\"");

var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = "-c \"" + command + "\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};

proc.Start();
proc.WaitForExit();

return proc.StandardOutput.ReadToEnd();
}

// Set license code TODO: Replace the licString and developerKey with a valid license and key
void SetLicense()
{
string licString = "[License]\n" + "License = <doc><ver>2.0</ver>`ADD LICENSE HERE`</doc>";
string developerKey = "ADD DEVELOPMENT KEY HERE";
byte[] licBytes = System.Text.Encoding.UTF8.GetBytes(licString);
RasterSupport.SetLicense(licBytes, developerKey);
}

// Main conversion function
public string ConvertDocument(LEADRequest request, StringWriter sw)
{
var isUrl = Uri.IsWellFormedUriString(request.InputUrl, UriKind.RelativeOrAbsolute);

if (isUrl)
{
var response = httpClient.GetAsync(request.InputUrl).Result;
if (response.IsSuccessStatusCode)
{
var stream = response.Content.ReadAsStreamAsync().Result;

using (var document = DocumentFactory.LoadFromStream(stream, new LoadDocumentOptions()))
{
string ext = DocumentWriter.GetFormatFileExtension(request.DocumentFormat);
string fileName = Path.Combine("/tmp", Path.ChangeExtension(Path.GetFileName(request.InputUrl), ext));
DocumentConverterJobData jobData = DocumentConverterJobs.CreateJobData(document, fileName, request.DocumentFormat);
DocumentConverterJob job = documentConverter.Jobs.CreateJob(jobData);
documentConverter.Jobs.RunJob(job);

if (job.Errors.Count > 0)
foreach (var error in job.Errors)
sw.WriteLine($"Error during conversion: {error.Error.Message} {error.Error.StackTrace}");
else
return fileName;
}
}
else
sw.WriteLine("Download of URL is not successful");
}
else
sw.WriteLine("Url is invalid.");

return null;
}
}
设置许可文件

许可证解锁项目所需的功能。它必须在调用任何工具包函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅。

有两种类型的运行时许可证:

  • 评估许可证,在下载评估工具包时获得。它允许评估工具包。
  • 部署许可证。如果需要部署许可证文件和开发人员密钥,请参阅获取许可证。

笔记

教程 中有更详细的介绍。

更新 FunctionHandler

当触发 AWS Lambda 函数时,将FunctionHandler调用该方法。Function函数首次启动时,将在此之前调用全局类中的所有内容。当容器处于warm状态时,它只会调用该FunctionHandler方法,直到执行上下文发生变化。

为了利用此功能,大部分初始化代码都在构造函数中完成,以便在容器处于LEADLambdaHandler状态时尽可能快地调用每个函数。

打开Function.cs作为项目一部分包含的文件,并将以下内容添加到using其余 using 语句下的块中。

【C#】

using System.IO;

将以下全局变量添加到Function类中:

【C#】

public LEADLambdaHandler LEADHandler = new LEADLambdaHandler();

将该方法替换为FunctionHandler以下方法以接受 aLEADRequest作为输入而不是字符串输入,然后调用该LEADHandler.ConvertDocument方法:

【C#】

public string FunctionHandler(LEADRequest request, ILambdaContext context)
{
StringWriter sw = new StringWriter();
try
{
string outputFile = LEADHandler.ConvertDocument(request, sw);

if (outputFile != null)
sw.WriteLine($"Successfully saved to {outputFile}.");
else
sw.WriteLine("Error occurred. Output file not saved.");
}
catch (Exception ex)
{
sw.WriteLine(ex.Message);
sw.WriteLine(ex.StackTrace);
if (ex.InnerException != null)
{
sw.WriteLine(ex.InnerException.Message);
sw.WriteLine(ex.InnerException.StackTrace);
}
}
return sw.ToString();
}

添加所有代码后,构建项目以确保一切都按预期工作。

收集所需的 Lambda 依赖项

笔记

如果需要,可以跳过此步骤。此项目中包含的 ZIP 已包含所需的 Lambda 依赖项。

LEADTOOLS SDK 需要在 Linux 机器上安装某些依赖项才能正常运行。有关完整列表,请参阅。

AWS Lambda 提供了一个包含相同 Linux 发行版的 Docker 镜像,以便在部署到 Lambda 之前测试功能。这也可用于安装所需的依赖项并创建部署包。这需要安装Docker Desktop

  • 打开 Windows PowerShell
  • 跑docker pull amazonlinux
  • 在主机上的某个位置创建本地卷,例如C:\temp\docker
  • 跑docker run -it -v C:\temp\docker:/var/task amazonlinux:latest
  • 使用以下 2 个命令在 VM 中安装 .NET Core 3.1:
    • rpm -Uvh //packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    • yum -y install dotnet-sdk-3.1
  • 安装 LEADTOOLS 第 3 方依赖项:
    • yum -y install uuid-devel uuidd gcc gcc-c++ glibc-devel kernel-devel kernel-headers libX11 libXt libX11-devel libXt-devel sqlite sqlite-devel freetype fontconfig
  • 发布 Lambda 项目
    • 导航到之前创建的项目的位置
    • 在该位置打开CMDcsproj
    • 跑dotnet publish
  • 导航到发布文件夹并将文件复制<PROJECT-DIR>\bin\Debug\netcoreapp3.1\publish\runtimes\linux-x64\nativeassets\netcoreapp到C:\temp\docker
  • 在该C:\temp\docker目录中,创建一个新的文本文件并复制并粘贴以下 shell 脚本并将其另存为CopyDeps.sh:
indir="/var/task/"
outdir="/var/task/lib/"
ldcache=$(ldconfig -p)

mkdir -p $outdir

for i in $(ls ${indir}/*.so); do
deps=$(ldd $i | grep "=>" | grep -v "liblt")

while IFS= read -r line; do
result=""
list=( $line )

dep=$(echo $ldcache | grep "${list[0]}")

if [ ! -z "$dep" ] ; then
cp -vL "${list[2]}" $outdir 2> /dev/null
fi

done <<< "$deps"
done
  • 运行 shell 脚本以创建具有所需依赖项的 lib 文件夹:sh /var/task/CopyDeps.sh
  • shell 脚本完成后,在主机上转到C:\temp\docker\lib这将包含所有依赖项
  • 删除以下内容,因为它们已安装在 Lambda 环境中:
    • liddl.so.2
    • libexpat.so.1
    • libz.so.1
创建 Lambda 层

LEADTOOLS SDK 需要在 Lambda 函数中安装环境依赖项。为了保持包的小和灵活,使用了 Lambda 层。有关层是什么的更多信息,请参阅。

LEADTOOLS SDK OCR 引擎需要依赖项包含在任何 OCR 部署中。有关所需内容的更多信息,请参见。

由于需要 AWS Lambda 环境,因此还需要 Shadow Fonts。有关 Shadow Fonts 的更多信息,请访问。

  • 创建一个名为的新文件夹lead-deps-layer
  • 将lib文件夹从复制C:\temp\docker\lib到lead-deps-layer
  • lead-deps-layer在命名中创建一个新文件夹native-runtimes
  • 发布 Lambda 项目
    • 导航到之前创建的项目的位置
    • 在该位置打开CMDcsproj
    • 跑dotnet publish
  • 转到发布文件夹的 linux 本机依赖项<PROJECT-DIR>\bin\Debug\netcoreapp3.1\publish\runtimes\linux-x64\nativeassets\netcoreapp\
  • 将所有.so文件复制到lead-deps-layer\native-runtimes文件夹
  • 将C:\temp\docker\lib文件夹复制到lead-deps-layer
  • 将ShadowFonts文件夹从复制<INSTALL_DIR>\LEADTOOLS22\Bin\Common\ShadowFonts到lead-deps-layer
  • 将OcrLEADRuntime文件夹从复制<INSTALL_DIR>\LEADTOOLS22\Bin\Common\OcrLEADRuntime到lead-deps-layer
    • 此文件夹包含 LEADTOOLS 支持的各种 OCR 语言的字典和拼写检查引擎。如果只需要某些语言,请删除不需要的语言以最小化文件夹大小。有关语言文件的更多信息,请参见
  • 文件夹中现在应该有 4 个子目录lead-deps-layer:lib、native-runtimes、ShadowFonts和OcrLEADRuntime
  • 压缩lead-deps-layer文件夹的内容。确保 ziplead-deps-layer.zip不包含同名的子文件夹,并且 zip 结构类似于以下屏幕截图:

lead-deps-layer zip 存档结构的屏幕截图

上传图层 Zip 文件

创建层 zip 后,需要将其上传到 AWS Lambda。

  • 导航到并登录
  • 在左侧面板上,选择图层
  • 在主窗口中,选择创建图层
  • 第一个上传的将是lead-deps-layer
    • 命名图层lead-deps-layer
    • 给它一个描述
    • 点击上传并选择lead-deps-layer.zip
    • 运行时下拉列表中,选择.NET Core 3.1 (C#/PowerShell)
    • 单击创建以创建图层
将 Lambda 函数发布到 AWS

该层完成后,现在可以将函数发布到 AWS。

  • 打开之前在 Visual Studio 中创建的 Lambda 项目。
  • 右键单击项目名称并选择发布到 AWS Lambda
    • 如果这是第一次发布 Lambda,则需要将帐户配置文件与 AWS 的访问密钥一起使用。有关这方面的更多信息,请参阅
  • 选择要使用的帐户资料地区
  • 确保语言运行时设置为.NET Core v3.1
  • 填写Function Name,点击Next
  • 将内存 (MB)更改为 2048
  • 从下拉列表中选择角色名称,然后单击上传

这将dotnet publish在项目上运行,然后压缩文件和依赖项并将其上传到 Lambda。

减小封装尺寸

在上一步中创建的包会很大,因为它包含许多添加到层的依赖项。为了减小体积,zip 包将需要修改并手动上传到 Lambda。

  • 进入<PROJECT-DIR>\bin\Release\netcoreapp3.1\publish目录
  • 删除LEADTOOLS包含已添加到的 OCRRuntimes 的文件夹lead-deps-layer
  • <function-name>.zip将发布目录的内容压缩到一个名为覆盖自动创建的 zip 文件中
  • 导航回并登录
  • 在左侧面板上,选择功能
  • 选择<function-name>打开功能
  • 在函数的配置中,在函数代码部分下,选择上传以上传缩小尺寸的 zip
  • 从中选择 zip <PROJECT-DIR>\bin\Release\netcoreapp3.1\publish\<function-name>.zip,点击确定,然后点击右上角的保存

这将更新功能包,使其尽可能小。

更改设置

上传包后,LD_LIBRARY_PATH需要更新函数的环境变量以正确加载依赖项。

  • 在控制台的功能页面中,向下滚动到环境变量部分
  • 单击管理环境变量以打开编辑环境变量屏幕
  • 点击添加环境变量
  • 对于,输入LD_LIBRARY_PATH和输入 
  • /var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib:/tmp
  • 单击保存以保存这些更改
编辑环境变量 LD_LIBRARY_PATH

设置环境变量后,需要将层添加到函数中。

  • 在控制台的功能页面,展开Designer
  • 选择图层
  • 在底部现在打开的图层部分中,选择添加图层
  • 选择从运行时兼容层列表中选择单选按钮
  • 名称下拉列表中,选择lead-deps-layer
  • 版本下拉列表中,选择最新的版本号
  • 单击添加将此图层添加到函数中

向函数添加图层

确保函数的内存设置为 2048 MB:

  • 在控制台的功能页面中,向下滚动到基本设置部分
  • 单击编辑
  • 内存 (MB)滑块拖动到2048 MB
  • 单击保存以保存更改

将内存功能设置为 2048 MB

测试功能

完成上一步后,该功能就可以进行测试了。

  • 在控制台的功能页面,选择右上角的 测试
    • 这将打开配置测试事件对话框
  • 选择hello-world 活动模板
  • 填写活动名称
{
"InputUrl": "//demo.leadtools.com/images/tiff/ocr1.tif",
"DocumentFormat": 1
}
  • 单击创建以创建测试事件

创建测试事件

如果一切设置正确,执行结果应该返回succeeded并类似于:

执行结果返回成功

以上便是 使用 AWS Lambda 转换文档 ,如果您还有其他疑问,欢迎咨询我们或者加入我们官方技术交流群。


欢迎下载|体验更多LEADTOOL产品

您还可以加入产品技术交流Q群:731259648


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP