随着技术的发展,自动化处理数据已经成为商业运作中不可或缺的一部分。然而,自动化系统在处理诸如发票、账单和表格等非结构化文档时,常常面临挑战。这些文档的格式多样,数据位置不固定,使得大规模自动化处理变得异常困难。但随着LEADTOOLS版本19的发布,其先进的发票识别与处理SDK技术,使得即使是包含表格数据的复杂、非结构化和半结构化文档也能被处理,即使每行和每个单元格的高度不同,或者表格跨越多个页面。本文将展示如何设置主表单模板,然后从填充的发票中提取数据。
首先需要创建一个模板,定义各种字段的位置以及预期的数据类型。这应该是一个空白或已涂改的表单版本,以便进行识别。一些字段可能具有静态位置,如客户编号、发票编号、地址等,但发票和其他非结构化表单类型上的表格可能会对识别准确性造成影响,因为主模板和填充的发票在大小上由于表格区域的不同而有所差异。
LEADTOOLS通过表格字段类型克服了这一主要障碍。要实现表格字段,只需定义列标题,无论行数、每个单元格的高度或页数如何,表格数据都将被识别。传统的固定位置字段也可以与表格共存(例如发票总额),并会根据其在表格结束位置的比例被发现。
在设置好主表单模板后,就可以开始识别(即分类)和处理填写的文档。LEADTOOLS的高级表单识别算法首先确定填写的文档与哪种表单匹配。在存储库中没有主表单模板的数量限制,因此可以为企业内的所有表单和发票创建一个单一的自动化解决方案。AutoFormsEngine负责对齐、定位、分类和处理表单的所有工作,无论其分辨率如何。最重要的是,设置AutoFormsEngine既快速又简单,只需要告诉它在哪里找到主表单模板,并将填充的发票图像传递给它。
在成功分类表单后,可以解析结果并从模板定义的字段中提取数据。每个字段都包含大量信息,包括识别出的数据、置信度信息、字体特征、边界矩形等。如图3所示,整个表格被检测为一个字段,并进一步细分为每个单元格。LEADTOOLS灵活且高度准确的处理程序能够检测并考虑单元格高度的变化,正确识别每个单元格的边界矩形,并使用光学字符识别技术提取数据和详细的字符信息。
想要了解更多?点击这里查看LEADTOOLS发票识别和处理SDK的视频演示。
识别和处理非结构化表单(如发票和账单)的数据只是可以使用LEADTOOLS解决的众多实际问题之一。其最先进的发票识别和处理SDK使得创建自动化的会计、计费和发票解决方案成为可能。此外,LEADTOOLS提供了丰富的文档清理功能,包括去倾斜、删除线条、去斑点、移除打孔等,在识别之前过滤掉噪音。LEADTOOLS以其全面的光栅、文档、医疗和多媒体图像工具包家族提供了难以置信的价值。
可以下载包含上述功能的完全功能性演示。要运行此示例,需要以下内容:
浏览LEADTOOLS示例文件夹(例如C:\LEADTOOLS 19\Examples\),可以找到此技术以及LEADTOOLS中许多其他技术的示例项目。
// 设置基于文件夹路径的主表单存储库
DiskMasterFormsRepository workingRepository =
new DiskMasterFormsRepository(rasterCodecs, repositoryPath);
// 使用OCR识别管理器。其他选项包括默认和条形码
AutoFormsRecognitionManager managers = AutoFormsRecognitionManager.Ocr;
// 创建表单引擎
AutoFormsEngine autoEngine =
new AutoFormsEngine(workingRepository, ocrEngines[0], barcodeEngine, managers, 30, 80, _menuItemRecognizeFirstPageOnly.Checked);
autoEngine.UseThreadPool = true;
// 创建想要识别/分类的填充表单
FilledForm form =
new FilledForm();
form.FileName = Path.GetFileName(imagePath);
form.Name = Path.GetFileNameWithoutExtension(imagePath);
form.Image = rasterCodecs.Load(imagePath, 0, CodecsLoadByteOrder.Bgr, 1, 1);
// 在填充表单上运行识别和处理
AutoFormsRunResult result = autoEngine.Run(form.Image, MyPageRequestCallback, form, null);
if (result != null && !canceled) {
// 获取主表单(识别/分类)
MasterForm master = new MasterForm();
master.Properties = result.RecognitionResult.Properties;
form.Master = master;
// 使用识别和处理结果以及对齐信息填充表单
form.Result = result.RecognitionResult.Result;
form.Alignment = result.RecognitionResult.Alignments;
// 已成功识别和处理表单
}
// 创建一个DataGridView控件以显示表格数据
DataGridView _tableResults;
_tableResults = new DataGridView();
TableFormField tableField = form.ProcessingPages[pageIndex][fieldIndex] as TableFormField;
if (tableField.Result.Status == FormFieldStatus.Success) {
// 添加列
foreach (TableColumn column in tableField.Columns)
_tableResults.Columns.Add(column.OcrField.Name, column.OcrField.Name);
// 添加数据,首先按行循环,然后为行内的每个字段(单元格)循环
TableFormFieldResult results = tableField.Result as TableFormFieldResult;
for (int i = 0; i < results.Rows.Count; i++) {
TableFormRow row = results.Rows[i];
_tableResults.Rows.Add();
for (int j = 0; j < row.Fields.Count; j++) {
// 从字段中获取文本!
OcrFormField ocrField = row.Fields[j];
TextFormFieldResult txtResults = ocrField.Result as TextFormFieldResult;
_tableResults.Rows[i].Cells[j].Value = txtResults.Text;
}
}
}