翻译|使用教程|编辑:胡涛|2022-11-15 14:14:11.653|阅读 223 次
概述:本文介绍在leadtools中,使用 AWS Lambda 转换文档,欢迎查阅~
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
相关链接:
LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理,PDF,打印捕获,归档,注释和显示功能。利用业界领先的图像处理技术,能够智能识别文件,可以用来识别任何类型的扫描或传真形式的图像。
本教程展示了如何配置和运行 .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#)项目。为项目命名和位置,然后单击创建。
选择一个空函数并单击确定。
所需的参考取决于项目的目的。对于这个项目,需要以下 NuGet 包:
在解决方案资源管理器中右键单击 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()
{
}
}
右键单击 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;
}
}
许可证解锁项目所需的功能。它必须在调用任何工具包函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅。
有两种类型的运行时许可证:
笔记
教程 中有更详细的介绍。
当触发 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();
}
添加所有代码后,构建项目以确保一切都按预期工作。
笔记
如果需要,可以跳过此步骤。此项目中包含的 ZIP 已包含所需的 Lambda 依赖项。
LEADTOOLS SDK 需要在 Linux 机器上安装某些依赖项才能正常运行。有关完整列表,请参阅。
AWS Lambda 提供了一个包含相同 Linux 发行版的 Docker 镜像,以便在部署到 Lambda 之前测试功能。这也可用于安装所需的依赖项并创建部署包。这需要安装Docker Desktop。
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
LEADTOOLS SDK 需要在 Lambda 函数中安装环境依赖项。为了保持包的小和灵活,使用了 Lambda 层。有关层是什么的更多信息,请参阅。
LEADTOOLS SDK OCR 引擎需要依赖项包含在任何 OCR 部署中。有关所需内容的更多信息,请参见。
由于需要 AWS Lambda 环境,因此还需要 Shadow Fonts。有关 Shadow Fonts 的更多信息,请访问。
压缩lead-deps-layer文件夹的内容。确保 ziplead-deps-layer.zip不包含同名的子文件夹,并且 zip 结构类似于以下屏幕截图:
创建层 zip 后,需要将其上传到 AWS Lambda。
该层完成后,现在可以将函数发布到 AWS。
这将dotnet publish在项目上运行,然后压缩文件和依赖项并将其上传到 Lambda。
在上一步中创建的包会很大,因为它包含许多添加到层的依赖项。为了减小体积,zip 包将需要修改并手动上传到 Lambda。
这将更新功能包,使其尽可能小。
上传包后,LD_LIBRARY_PATH需要更新函数的环境变量以正确加载依赖项。

设置环境变量后,需要将层添加到函数中。
单击添加将此图层添加到函数中
确保函数的内存设置为 2048 MB:
单击保存以保存更改
完成上一步后,该功能就可以进行测试了。
{
"InputUrl": "//demo.leadtools.com/images/tiff/ocr1.tif",
"DocumentFormat": 1
}
如果一切设置正确,执行结果应该返回succeeded并类似于:
以上便是 使用 AWS Lambda 转换文档 ,如果您还有其他疑问,欢迎咨询我们或者加入我们官方技术交流群。
欢迎下载|体验更多LEADTOOL产品
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@ke049m.cn