概述
LEADTOOLS OCR 类库提供了将光学字符识别技术(OCR)集成到应用程序中的方法。 OCR 用于将栅格图像以及文档处理为文本。
一旦将 LEADTOOLS .NET OCR 工具包安装到系统中,用户就可以开始使用 LEADTOOLS OCR 进行编程。
注意,在使用 OCR 属性,方法和事件之前,必须先解锁 OCR 功能。 有关解锁 LEAD 功能的更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/unlocking-special-lead-features.html
您可以在您的应用程序中通过添加对 Leadtools.Ocr.dll 和 Leadtools.Forms.DocumentWriter.dll 程序集的引用来开始在您的应用程序中使用 LEADTOOLS for .NET OCR。这些程序集包含用于 OCR 编程的各种接口,类,结构和委托。
由于该工具包支持多个引擎(OmniPage 与 Lead),与引擎接口的实际代码存储在一个单独的程序集中,一旦 IOcrEngine 接口的实例被创建,它就会动态加载。 因此,请确保您打算使用的引擎程序集位于 Leadtools.Ocr.dll 程序集同一文件夹中。 如果需要,您可以将引擎程序集作为对项目的引用来自动检测依赖关系。
LEADTOOLS OCR 可以提供下列的功能:
- 识别和导出文本,从各种文本,文字处理,数据库或电子表格文件格式中进行选择。
- 在单线程或多线程环境中执行 OCR 进程,并针对基于服务器的操作进行优化。在各种 OCR 引擎之间切换。 由于使用了公共的 .NET 类库,交换引擎(例如从 OmniPage 到 Lead 引擎)实际上不需要更改应用程序代码。
- 指定在识别过程中使用哪种语言。 LEADTOOLS 工具包支持多种语言,包括英语,中文,丹麦语,荷兰语,芬兰语,法语,德语,意大利语,挪威语,葡萄牙语,俄语,西班牙语和瑞典语。 还有一个阿拉伯 OCR 引擎。有关更多信息和完整列表,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/ocr-languages-and-spell-checking.html
- 手动或自动将复杂页面分段到文本区域,图像区域,表格区域,行,页眉和页脚。
- 在识别之前设置准确度阈值以控制识别的准确性。
- 可以识别从 5 到 72 字号的几乎任何字体。
- 使用内置和用户字典提高识别准确性。
- 自动检测传真,点阵和其他降级文档并进行相应补偿。
- 同时处理文本和图片。 识别软件区有分半色调图形和文本的能力,以提供复合文档处理系统功能。
- 以 40 种格式中的任何一种格式保存文档,包括 Adobe PDF 和 PDF / A,MS Word,MS Excel 以及各种 ASCII 和 UNICODE 文本格式。
使用 OCR 引擎
LEADTOOLS 使用 OCR 句柄与 OCR 引擎和包含页面列表的 OCR 文档进行交互。 OCR 句柄是 LEADTOOLS OCR 与安装在系统上的 OCR 引擎之间的通信会话。 此 OCR 句柄是一个内部结构,其中包含用于识别,获取和设置信息以及文本验证的所有必要信息。
以下大纲为识别一个或多个页面的常规步骤。
1. 选择您想要使用的引擎类型并创建 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrengine.html" target="_blank">IOcrEngine 接口的实例。 有关更多信息,请参阅
2. 使用https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrengine-startup.html" target="_blank"> IOcrEngine.Startup 启动引擎. 更多的说明,请参考
3. 可选。如果需要保存,则建立一个或多个页面的 OCR 文档。有关更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/working-with-ocr-pages.html。
4. 可选。手动或自动在页面上建立区域。(这是可选的,一个页面可以在识别操作时自动识别区域。)有关更多信息,请参阅https://www.leadtools.com/help/leadtools/v20/dh/to/working-with-ocr-zones.html。
5. 可选。设置 OCR 引擎使用的活动语言。(默认语言是英语,如需要中文识别,必须要设置为中文或者中文+英文)。有关更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/working-with-ocr-languages.html。
6. 可选。设置拼写检查的属性。有关更多信息,请参阅https://www.leadtools.com/help/leadtools/v20/dh/to/ocr-spell-language-dictionaries.html。
7. 可选。设置其他特殊识别模块选项。只有当页面包含区域时才需要该区域,可以自动创建或手动创建区域。有关更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/recognizing-ocr-pages.html" target="_blank">Recognizing OCR Pages 和
8. 识别,有关更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/recognizing-ocr-pages.html。
9. 可选。如果需要,保存识别结果。结果可以保存到文件或内存中。 有关更多信息,请参阅https://www.leadtools.com/help/leadtools/v20/dh/to/recognizing-ocr-pages.html。
10. 完成后关闭 OCR 引擎。 有关更多信息,请参阅 https://www.leadtools.com/help/leadtools/v20/dh/to/starting-and-shutting-down-the-ocr-engine.html。
步骤 4,5,6 和 7 可以按照任意顺序完成,只要在启动 OCR 引擎之后和识别页面之前执行这些步骤即可。
有关引擎组件的更多信息,请参阅https://www.leadtools.com/help/leadtools/v20/dh/fo/ocrenginetype.html" target="_blank"> OcrEngineType 和
从上面的常规步骤可以看出,LEADTOOLS OCR 引擎可以以下面的多种方式使用:
- 识别为结果,直接识别一个图像文件(或者一个 LEADTOOLShttps://www.leadtools.com/help/leadtools/v20/dh/l/rasterimage.html" target="_blank"> RasterImage 对象) 并获得具有格式和位置信息的文本. 在这个模式中, 由于结果不会被保存,因此不需要创建一个https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrdocument.html" target="_blank"> IOcrDocument 对象。 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrengine-createpage.html" target="_blank">IOcrEngine.CreatePage 方法可以用来快速从https://www.leadtools.com/help/leadtools/v20/dh/l/rasterimage.html" target="_blank"> RasterImage 中直接创建一个 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrpage.html" target="_blank">IOcrPage, 调用必要的方法 (如 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrpage-recognize.html" target="_blank">IOcrPage.Recognize) 然后用 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrpage-gettext.html" target="_blank">IOcrPage.GetText 或者 https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrpage-getrecognizedcharacters.html来直接获取文本. 下面是一个示例代码。
- 识别为文档,对一个或多个页面执行低级别光学字符识别,然后以最终文档格式(如 PDF 或 DOCX)创建文档。 在这种模式下,用户通常会创建一个 对象(在内存中或基于文件),然后向其添加 对象。 页面可以预先识别,也可以在之后的某个时候识别。当所有页面被添加和识别时,调用 将识别数据转换为最终文档。 有关示例,请参阅 。
- 全自动识别并保存为文档,对输入图像文件执行高级光学字符识别,并直接输出为最终文档格式,如 PDF 或 DOCX。 在这种模式下,您可以使用 一次性全自动转换文档。 可以使用各种事件和记录机制来修改和跟踪识别操作。 有关示例,请参阅 。
以下示例显示如何在代码中执行上述步骤:
C#
// 首先需要在这个类的起始处添加"using Leadtools.Codecs;", "using Leadtools.Ocr;" 和"using Leadtools.Document.Writer;" at the beginning of this class // *** 步骤1: 指定引擎类型并创建IOcrEngine接口的实例. // 这个例子将使用LEADTOOLS OCR模块 - LEAD引擎并在相同的过程中使用它 IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false); // *** 步骤2: 启动引擎. // 使用默认参数 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); // *** 步骤3: 创建一个或多个页面的OCR文档. IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument(); // 将多页TIFF图像的所有页面添加到文档中 ocrDocument.Pages.AddPages(@"C:\Users\Public\Documents\LEADTOOLS Images\Ocr.tif", 1, -1, null); // *** 步骤4: (可选)手动或自动在页面上创建区域 // 自动选择区域 ocrDocument.Pages.AutoZone(null); // *** 步骤5: (可选)设置OCR引擎使用的活动语言 // 启用中文和英文两种语言 ocrEngine.LanguageManager.EnableLanguages(new string[] { "zh-Hans", "en" }); // *** 步骤6: (可选)设置拼写检查引擎 ,中文无法启动拼写检查 // 启用拼写检查系统 ocrEngine.SpellCheckManager.SpellCheckEngine = OcrSpellCheckEngine.Native; // *** 步骤7: (可选)设置其他特殊识别模块选项 // 将第一页中第一个区域的分区类型设置为Graphics,这样它就不会被识别 OcrZone ocrZone = ocrDocument.Pages[0].Zones[0]; ocrZone.ZoneType = NativeOcrZoneFillMethod.Graphics; ocrDocument.Pages[0].Zones[0] = ocrZone; // *** 步骤8: 识别 ocrDocument.Pages.Recognize(null); // *** 步骤9: 保存识别结果 // 保存结果为PDF文件 ocrDocument.Save(@"C:\Users\Public\Documents\LEADTOOLS Images\Document.pdf", DocumentFormat.Pdf, null); ocrDocument.Dispose(); // *** 步骤10: 结束后关闭OCR引擎 ocrEngine.Shutdown(); ocrEngine.Dispose();
从上面的常规步骤中,LEADTOOLS OCR 引擎也可以以下面的多种方式使用:
1. 使用 IOcrPage 来直接获取识别结果
识别为结果,直接识别一个图像文件(或者一个LEADTOOLS RasterImage 对象) 并获得具有格式和位置信息的文本. 在这个模式中, 由于结果不会被保存,因此不需要创建一个IOcrDocument 对象。 IOcrEngine.CreatePage 方法可以用来快速从RasterImage中直接创建一个IOcrPage, 调用必要的方法 (如 IOcrPage.Recognize) 然后用 IOcrPage.GetText 或者 IOcrPage.GetRecognizedCharacters 来直接获取文本.
注意: 该模式仅受LEADTOOLS OCR模块 - LEAD引擎支持。 使用任何其他OCR引擎调用 IOcrEngine.CreatePage将导致引发异常。因此如果用OmniPage引擎,不能用下面的代码
以下示例使用不创建文档的 OCR 页面
C#
// 创建引擎实例 using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false)) { // 启动引擎 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); // 将第一页作为RasterImage加载 RasterImage rasterImage = ocrEngine.RasterCodecsInstance.Load(@"C:\Users\Public\Documents\LEADTOOLS Images\Ocr.tif", 1); // 从该图像创建一个OCR页面,传递RasterImage对象的所有权 using (IOcrPage ocrPage = ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose)) { // 识别这个页面 ocrPage.Recognize(null); // 显示所有区域的文字 for (int zoneIndex = 0; zoneIndex < ocrPage.Zones.Count; zoneIndex++) { string text = ocrPage.GetText(zoneIndex); Console.WriteLine(text); } } // 调用Dispose时,引擎将自动关闭 }
2. 使用 IOcrDocument 来保存识别结果为文档
需要使用 IOcrDocument 实例将 OCR 结果保存到最终文档(如 PDF 或 DOCX)。 一个或多个 OCR 页面可以被添加到文档中,然后可以调用各种 Save 方法来创建最终文档。
IOcrDocument 可以以两种方式使用:
基于内存的文档
在这种模式下,OCR页面在保存之前需要保存在内存中。 当文档具有大量页面并且基于文件的文档或LEADTOOLS临时文件格式(需要DocumentFormat.Ltd)时,建议不要这样做。
在基于内存的IOcrDocument中,IOcrPageCollection 包含页面。 任何时候都可以识别其中一个或全部页面,并且可以随意添加或删除页面
以下示例使用基于内存的文档来创建多页PDF文件。 请注意,在保存操作过程中,所有页面如何保存在内存中:
C#
// 创建引擎实例 using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false)) { // 启动引擎 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); // 在内存中创建OCR文档 using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument(null, OcrCreateDocumentOptions.InMemory)) { string imageFile = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr.tif"; // 将所有页面添加到文档 ocrDocument.Pages.AddPages(imageFile, 1, -1, null); // 识别所有文档 ocrDocument.Pages.Recognize(null); // 将识别结果保存为PDF格式 ocrDocument.Save(@"C:\Users\Public\Documents\LEADTOOLS Images\Document.pdf", DocumentFormat.Pdf, null); } }
基于文件的文档
在此模式下, OCR页面保存前不需要在内存中。 当文档有大量页面时,此模式是最好的。
在基于文件的https://www.leadtools.com/help/leadtools/v20/dh/fo/iocrdocument.html" target="_blank"> IOcrDocument 中,
以下示例使用基于文件的文档来创建多页PDF文件。 请注意页面在识别后被disposed,并且在保存时不再需要。
C#
// 创建引擎实例 using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false)) { // 启动引擎 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); // 创建一个基于文件的OCR文档 using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument(null, OcrCreateDocumentOptions.AutoDeleteFile)) { string imageFile = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr.tif"; // 获取文档中的页数 int pageCount = ocrEngine.RasterCodecsInstance.GetTotalPages(imageFile); // 创建一个页面 for (int page = 1; page <= pageCount; page++) { // 加载一个RasterImage RasterImage rasterImage = ocrEngine.RasterCodecsInstance.Load(imageFile, page); // 从该图像创建一个OCR页面,传递RasterImage对象的所有权 using (IOcrPage ocrPage = ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose)) { // 识别该页面 ocrPage.Recognize(null); // 将它添加到文档中 ocrDocument.Pages.Add(ocrPage); // 这里页面将被disposed并释放其内存 } } // 将识别结果保存为PDF格式 ocrDocument.Save(@"C:\Users\Public\Documents\LEADTOOLS Images\Document.pdf", DocumentFormat.Pdf, null); } }
基于文件的文档也可以保存并重新加载,以便继续添加页面或稍后将其转换为最终文档格式。 以下示例显示如何执行此操作:
C#
private static void Test4() { // 创建引擎实例 IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false); // 启动引擎 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); string imageFile1 = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr1.tif"; string imageFile2 = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr2.tif"; //创建一个基于文件的OCR文档 //传递文件名(该名称将被重新使用)并告诉文档不要删除它 string documentFile = @"C:\Users\Public\Documents\LEADTOOLS Images\document.bin"; using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument(documentFile, OcrCreateDocumentOptions.None)) { // 验证文档没有任何页面 System.Diagnostics.Debug.Assert(ocrDocument.Pages.Count == 0); // 添加一个页面 RasterImage rasterImage = ocrEngine.RasterCodecsInstance.Load(imageFile1, 1); using (IOcrPage ocrPage = ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose)) { ocrPage.Recognize(null); ocrDocument.Pages.Add(ocrPage); } // 这里处理文件,但文件不会被删除 } // 重新加载文件 using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument(documentFile, OcrCreateDocumentOptions.LoadExisting)) { // 验证文档是否有一个页面 System.Diagnostics.Debug.Assert(ocrDocument.Pages.Count == 1); // 添加另一个页面 RasterImage rasterImage = ocrEngine.RasterCodecsInstance.Load(imageFile2, 1); using (IOcrPage ocrPage = ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose)) { ocrPage.Recognize(null); ocrDocument.Pages.Add(ocrPage); } // 验证文档有2页 System.Diagnostics.Debug.Assert(ocrDocument.Pages.Count == 2); // 保存文档 ocrDocument.Save(@"C:\Users\Public\Documents\LEADTOOLS Images\Document.pdf", DocumentFormat.Pdf, null); // 结果将是一个包含两页的PDF文件 } // 最后,删除文档文件 System.IO.File.Delete(documentFile); ocrEngine.Dispose(); }
3. 使用 IOcrAutoRecognizeManager 全自动识别文档
所有先前的识别模式都需要低级代码来加载页面,识别并将其添加到文档中。 LEADTOOLS OCR引擎还支持使用全自动的IOcrAutoRecognizeManager 接口执行上述相同任务。 在这个高级别的OCR中,输入图像只使用一行代码方法就可以使用最佳选项直接转换为输出格式。
C#
// 创建引擎实例 using(IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false)) { // 启动引擎 ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); // 将多页TIFF图像转换为PDF文档 ocrEngine.AutoRecognizeManager.Run( @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr.tif", @"C:\Users\Public\Documents\LEADTOOLS Images\Document.pdf", DocumentFormat.Pdf, null, null); }