原創(chuàng)|使用教程|編輯:龔雪|2015-07-06 09:54:20.000|閱讀 755 次
概述:本文將為您展示如何設(shè)置一個主表單模板,然后從填充的發(fā)票中提取數(shù)據(jù)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
毫無疑問,圖像技術(shù)如表單識別和OCR已經(jīng)徹底改變了我們做生意的方式,節(jié)省了無數(shù)的人力,同時(shí)降低了任務(wù)的錯誤率。然而,使用這些技術(shù)的前提是:數(shù)據(jù)必須在每個文檔的相同位置出現(xiàn)。在自動化系統(tǒng)中大范圍處理非結(jié)構(gòu)化的表單和掃描文檔如發(fā)票、賬單和標(biāo)簽非常困難。
然而,LEADTOOLS Version 19和先進(jìn)的發(fā)票識別和處理SDK技術(shù)發(fā)布后,一切都不再是問題!它能夠處理包含列表數(shù)據(jù)的復(fù)雜非結(jié)構(gòu)化半結(jié)構(gòu)化的文檔,甚至每列每行的高度不一樣,或表格橫跨了多個頁面都可以。本白皮書我們將為您展示如何設(shè)置一個主表單模板,然后從填充的發(fā)票中提取數(shù)據(jù)。
第一個要求是創(chuàng)建一個模板,定義了多個值的位置以及數(shù)據(jù)類型。它需要是一個空白或修訂版本。一些字段可能包含靜態(tài)位置如客戶編號、發(fā)票號、地址等,但是由于表格區(qū)域,主模板和填充發(fā)票的大小不同,發(fā)票或其他非結(jié)構(gòu)化表單類型中的表格會嚴(yán)重破壞識別的精度。
LEADTOOLS使用表格字段類型克服了這個障礙。要實(shí)現(xiàn)一個表格字段,只需簡單定義要識別的列標(biāo)題和表格數(shù)據(jù),不用管明細(xì)行、每個單元格的高度或頁面的數(shù)量。傳統(tǒng)的固定位置字段可以在表格下共存(如發(fā)票總數(shù)),基于它與整個表格的比例可以發(fā)現(xiàn)它。
設(shè)置主表單模板后,你就可以開始識別(如分類)和處理填好的文檔了。LEADTOOLS先進(jìn)的表單識別算法會首先確定填充文檔的匹配表單類別。在存儲庫中,沒有限制主表單模板的數(shù)量,因此可以為企業(yè)中的所有文檔和發(fā)票創(chuàng)建一個單獨(dú)的自動解決方案。無論分辨率為多少,AutoFormsEngine會完成對齊、調(diào)整、分類和處理表單的所有工作。最重要的是,設(shè)置AutoFormsEngine快速簡單,只需要找到主表單模板,然后將它傳遞給填好的發(fā)票圖像。
// 基于文件夾路徑設(shè)置主表單模板庫 DiskMasterFormsRepository workingRepository = new DiskMasterFormsRepository(rasterCodecs, repositoryPath); // 使用Ocr識別管理器。其他的選項(xiàng)包括默認(rèn)和條碼 AutoFormsRecognitionManager managers = AutoFormsRecognitionManager.Ocr; // 創(chuàng)建表單引擎 AutoFormsEngine autoEngine = new AutoFormsEngine(workingRepository, ocrEngines[0], barcodeEngine, managers, 30, 80, _menuItemRecognizeFirstPageOnly.Checked); autoEngine.UseThreadPool = true; // 創(chuàng)建我們想要確認(rèn)/識別/分類的填充表單 FilledForm form = new FilledForm(); form.FileName = Path.GetFileName(imagePath); form.Name = Path.GetFileNameWithoutExtension(imagePath); form.Image = rasterCodecs.Load(imagePath, 0, CodecsLoadByteOrder.Bgr, 1, 1); // 在填充表單上運(yùn)行識別和處理 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; // Populate our form with the recognition and processing results and alignment information form.Result = result.RecognitionResult.Result; form.Alignment = result.RecognitionResult.Alignments; //現(xiàn)在我們已經(jīng)成功識別和處理了表單 }
在成功分類表單后,我們可以解析結(jié)果,從模板定義的字段中提取數(shù)據(jù)。
// 創(chuàng)建一個DataGridView 控件顯示表單數(shù)據(jù) 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); // 添加數(shù)據(jù),然后先循環(huán)行,然后循環(huán)行中的每個字段(單元格) 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; } } }
每個字段包含大量的信息,包括識別的數(shù)據(jù)、置信度信息、字體特征、邊界矩形等。就像你從圖表3中看到的一樣,整個表格作為一個字段識別,然后進(jìn)一步分解為每一個單元格。LEADTOOLS靈活準(zhǔn)確的處理方法能夠檢測和解釋單元格高度的不同,正確的定義每個單元格的邊界,使用OCR文字識別提取數(shù)據(jù)和詳細(xì)的字符信息。
想要了解更多?查看LEADTOOLS識別和處理SDK的詳細(xì)介紹。
識別和處理非結(jié)構(gòu)化表單如發(fā)票賬單中的數(shù)據(jù)是LEADTOOLS可以處理的諸多問題中的一個。先進(jìn)的發(fā)票識別和處理SDK讓創(chuàng)建自動會計(jì)、賬單和表單解決方案變?yōu)榭赡堋4送猓琇EADTOOLS提供了豐富的文檔清理功能集合,包括抗扭斜、移除線、去除雜點(diǎn)、去除孔等,過濾掉噪聲后識別。LEADTOOLS提供了光柵、文檔、醫(yī)學(xué)和多媒體圖像的綜合工具包。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn