MODI OCR C# 与 IronOCR:在 C# 中选择合适的 OCR 光学字符识别库
Microsoft Office 文档影像 (MODI) 曾经是 MS Office 2003 和 2007 中捆绑的首选 OCR 组件,使开发人员能够通过基于 COM 的对象模型直接从扫描图像中提取文本。 多年来,MODI.Document 类为无数文档数字化项目提供了支持,在 Visual Studio 解决方案中将 TIFF 和 BMP 图像文件转换为机器可读文本。
然而,MODI 的问题在于:微软已将其从 Office 2010 及更高版本中移除,导致开发者不得不依赖过时的 Office 版本或独立安装程序来维持其 OCR 功能。对于任何面向跨平台部署、云环境或最新 Windows 版本的现代.NET项目而言,MODI 都带来了严重的阻碍。
本文从代码实现、功能、平台支持和许可等方面,探讨了 OCR模式 C# 与IronOCR(一个专门构建的.NET光学字符识别库)的比较情况。 无论是维护旧代码还是启动新项目,这里的详细信息都将有助于做出正确的选择。
免费试用IronOCR 30 天,并可参考以下代码示例。
对比结果一目了然?
| 翻译类别 | OCR模式 | IronOCR |
|---|---|---|
| 核心架构 | COM 互操作;需要 Microsoft Office 文档影像 DLL 引用 | 纯.NET库; Tesseract 5 引擎针对 C# 进行了优化 |
| 平台支持 | 仅限Windows系统; 需要电脑上安装 Office 2003/2007。 | Windows、Linux、macOS、Azure、Docker、iOS、Android |
| 图像格式 | TIFF、MDI、BMP | TIFF、PNG、JPEG、BMP、GIF、PDF、多页图像 |
| 语言支持 | 通过 miLANG 参数约 22 种语言 | 通过NuGet语言包支持 125 多种语言 |
| OCR准确率 | 大量使用干净、标准字体的文档 | 自动图像校正滤镜的准确率超过 99.8% |
| 输出选项 | 来自布局对象的纯文本 | 纯文本、可搜索的 PDF、结构化数据(页码、行数、单词数、条形码) |
| 安装 | Office 安装程序 + 解决方案资源管理器中的 COM 参考 | NuGet包: Install-PackageIronOCR |
| 主动开发 | Office 2007 之后已停用 | 积极维护,定期更新 |
| 许可 | 需要符合条件的 Microsoft Office 许可证 | 永久授权价格从 749 美元起; 免费试用 30 天 |
| 支持 | 仅限社区论坛 | 通过电子邮件、在线聊天和电话提供直接的工程支持 |
How Does Microsoft Office Document Imaging Perform OCR in C#?
MODI 通过基于 COM 的对象模型执行光学字符识别 (OCR)。 该过程首先创建一个 MODI.Document 对象,加载图像文件路径,然后调用 OCR 方法来分析图像并识别字符。 OCR 处理完成后,可以通过每个页面的图像和布局对象访问文本和布局信息。
要在 Visual Studio 项目中使用 MODI,必须添加对 Microsoft Office 文档图像类型库的引用。 在解决方案资源管理器中,右键单击"引用"文件夹,选择"COM"选项卡,然后选择相应的 MODI 版本(Office 2003 为 11.0,Office 2007 为 12.0)。
// MODI OCR: Extracting text from a scanned TIFF document
private string ExtractTextFromImage(string path)
{
string extractedText = "";
MODI.Document doc = new MODI.Document();
try
{
// Create the document object from the image file path
doc.Create(path);
// Run optical character recognition with English language
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
// Access the first page image and retrieve recognized text
MODI.Image modiImage = (MODI.Image)doc.Images[0];
extractedText = modiImage.Layout.Text;
}
catch (Exception ex)
{
// Handle OCR exceptions for unsupported or corrupted image files
string message = ex.Message;
Console.WriteLine(message);
}
finally
{
doc.Close(false);
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
}
return extractedText;
}
// MODI OCR: Extracting text from a scanned TIFF document
private string ExtractTextFromImage(string path)
{
string extractedText = "";
MODI.Document doc = new MODI.Document();
try
{
// Create the document object from the image file path
doc.Create(path);
// Run optical character recognition with English language
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
// Access the first page image and retrieve recognized text
MODI.Image modiImage = (MODI.Image)doc.Images[0];
extractedText = modiImage.Layout.Text;
}
catch (Exception ex)
{
// Handle OCR exceptions for unsupported or corrupted image files
string message = ex.Message;
Console.WriteLine(message);
}
finally
{
doc.Close(false);
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
}
return extractedText;
}
' MODI OCR: Extracting text from a scanned TIFF document
Private Function ExtractTextFromImage(ByVal path As String) As String
Dim extractedText As String = ""
Dim doc As New MODI.Document()
Try
' Create the document object from the image file path
doc.Create(path)
' Run optical character recognition with English language
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, True, True)
' Access the first page image and retrieve recognized text
Dim modiImage As MODI.Image = CType(doc.Images(0), MODI.Image)
extractedText = modiImage.Layout.Text
Catch ex As Exception
' Handle OCR exceptions for unsupported or corrupted image files
Dim message As String = ex.Message
Console.WriteLine(message)
Finally
doc.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc)
End Try
Return extractedText
End Function
此功能演示了标准的 MODI 工作流程:Create 方法加载文件,OCR 方法使用指定的语言执行识别,Layout.Text 提供提取的字符串。 return extractedText 语句将输出传递给调用者。
虽然 MODI 能够为清晰、高分辨率的文档图像提供相当不错的精度,但它也存在明显的局限性。 它仅支持 TIFF、MDI 和 BMP 格式。 它要求运行该应用程序的每台计算机(包括生产服务器)都必须安装 Microsoft Office。 MODI 本身不具备扫描低质量图像、校正图像倾斜或降低数字噪声的功能。此外,由于 MODI 依赖于 COM 互操作,因此无法在.NET Core、 .NET 5+ 或任何跨平台场景中使用,这使其不适用于 Docker 容器或 Azure 应用服务等现代部署目标。
现代.NET库如何处理 OCR 功能?
IronOCR使用纯.NET API取代了 COM 互操作方法,该 API 可通过单个NuGet包进行安装。 IronTesseract 类封装了一个经过高度优化的 Tesseract 5 引擎,OcrInput 类处理图像加载、预处理和多格式支持,所有这些都不需要 Microsoft Office 或目标计算机上的任何外部依赖项。
using IronOcr;
// Create the IronTesseract OCR engine object
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
input.LoadImage("scanned-document.tiff");
// Apply filters to correct low-quality scans automatically
input.Deskew(); // Straighten skewed page images
input.DeNoise(); // Remove digital noise from scanning artifacts
// Read text from the processed document
var result = ocr.Read(input);
// Output plain text
Console.WriteLine(result.Text);
// Save as a searchable PDF for document management system integration
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
// Create the IronTesseract OCR engine object
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
input.LoadImage("scanned-document.tiff");
// Apply filters to correct low-quality scans automatically
input.Deskew(); // Straighten skewed page images
input.DeNoise(); // Remove digital noise from scanning artifacts
// Read text from the processed document
var result = ocr.Read(input);
// Output plain text
Console.WriteLine(result.Text);
// Save as a searchable PDF for document management system integration
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr
' Create the IronTesseract OCR engine object
Dim ocr As New IronTesseract()
Using input As New OcrInput()
' Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
input.LoadImage("scanned-document.tiff")
' Apply filters to correct low-quality scans automatically
input.Deskew() ' Straighten skewed page images
input.DeNoise() ' Remove digital noise from scanning artifacts
' Read text from the processed document
Dim result = ocr.Read(input)
' Output plain text
Console.WriteLine(result.Text)
' Save as a searchable PDF for document management system integration
result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
IronOCR输出
MODI OCR C# 与 IronOCR:如何在 C# 中选择合适的 OCR 库:图 1 -IronOCR示例输出
上面的代码展示了IronOCR如何仅用几行代码就完成 TIFF 扫描文件的 OCR 流程。 OcrInput 对象几乎可以接受任何图像文件或 PDF 文档,而 Deskew() 和 DeNoise() 可以纠正常见的扫描瑕疵,这些瑕疵会导致 MODI 产生较差的结果。 Read 方法返回一个 OcrResult 对象,其中不仅包含纯文本,还包含按页、段落、行和单词组织的结构化数据,每个部分都包含置信度分数和坐标信息。
对于处理发票、表格或多页 TIFF 文件的项目, IronOCR还包含计算机视觉功能,可自动定位文本区域,在同一次扫描中读取条形码和二维码,并支持125 多种语言,这些语言可以作为NuGet包安装。
从图像中提取文本有哪些主要区别?
当你不再使用"完美"的示例文件而开始处理真实世界的文档时,这两种选择之间的真正差距就会显现出来。 我们说的是那些扫描质量很差的文件,上面有咖啡渍、页面倾斜,或者用智能手机拍摄的低分辨率照片。
MODI是为不同的时代而设计的,专门用于清晰、高对比度的办公文档。 如果你用高端扫描仪扫描出清晰的TIFF文件,MODI就能很好地完成任务。但如果你的图像哪怕只有轻微的旋转,或者存在一些数字"噪点",MODI的精度就会急剧下降。 由于它没有任何内置过滤器来解决这些问题,因此在开始 OCR 过程之前,您只能使用 GDI+ 或 System.Drawing 等第二个库自行预处理图像。 管理内存也有些麻烦; 如果您不手动调用 Marshal.ReleaseComObject,则很可能在生产环境中遇到内存泄漏问题。
IronOCR即用,就能帮你轻松搞定这些繁重的工作。 无需编写自定义代码来清理图像,只需调用 input.Deskew() 或 input.DeNoise() 即可。 这些滤镜可以对图像进行预处理,使引擎即使处理"丑陋"的文档也能达到99.8% 的准确率。
专业提示:如果您要从 MODI 迁移,不要只是替换代码,还要利用布局数据。 与 MODI 不同,MODI 主要提供一大块文本,而IronOCR则将文本分解成段落和行,并给出置信度评分。 如果你正在构建一个自动化发票处理系统,并且需要标记可能需要人工审核的文档,那么这个功能简直是救星。
值得一提的是, IronOCR可以将多页 TIFF 和 PDF 文件作为一个对象进行处理。 您不必像使用旧的 MODI.Images 集合那样手动遍历图像。 它速度更快、更清洁,而且说实话,也更不容易损坏。
开发人员如何从传统方法迁移?
在现有项目中替换 MODI 非常简单。 核心迁移包括将 COM 引用替换为NuGet包并更新 OCR 方法调用。 以下是 MODI 模式与其现代对应模式的对应关系:
using IronOcr;
// Replace: MODI.Document doc = new MODI.Document();
var ocr = new IronTesseract();
// Replace: doc.Create(filePath); with OcrInput
using var input = new OcrInput();
input.LoadImage("document.tiff"); // Accepts the same TIFF files MODI used
// Replace: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
ocr.Language = OcrLanguage.English;
// Replace: modiImage.Layout.Text
var result = ocr.Read(input);
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Replace: MODI.Document doc = new MODI.Document();
var ocr = new IronTesseract();
// Replace: doc.Create(filePath); with OcrInput
using var input = new OcrInput();
input.LoadImage("document.tiff"); // Accepts the same TIFF files MODI used
// Replace: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
ocr.Language = OcrLanguage.English;
// Replace: modiImage.Layout.Text
var result = ocr.Read(input);
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("document.tiff") ' Accepts the same TIFF files MODI used
ocr.Language = OcrLanguage.English
Dim result = ocr.Read(input)
Dim text As String = result.Text
Console.WriteLine(text)
End Using
映射几乎是一对一的:MODI.Document.Create 变为 OcrInput.LoadImage,带有语言参数的 OCR 方法变为 ocr.LanguagePlusocr.Read,Layout.Text 变为 result.Text。 没有 COM 引用,没有 Office 依赖,无需手动使用 Marshal.ReleaseComObject 管理内存。
除了直接替换之外,迁移还解锁了 MODI 中根本不存在的功能:跨平台部署到 Linux 和 macOS、云和容器部署、可搜索的 PDF 输出,以及具有自定义字体训练功能的完整 Tesseract 5 引擎。
哪种解决方案最符合现代 OCR 需求?
在微软Office是每台Windows电脑的标配软件的时代,MODI发挥了它的作用。 对于维护已依赖 Office 2003 或 2007 的旧系统的团队来说,它可能仍然可以运行,但这代表着对已停产软件的脆弱依赖,而且没有前进的方向。
对于任何新项目或面临现代化改造的遗留系统, IronOCR都能提供完整、积极维护的解决方案。 它完全消除了对 Office 的依赖,可在所有主流平台上运行,能够处理旧方法难以处理的低质量图像,并提供远超纯文本的结构化 OCR 输出。 它拥有丰富的文档、直接的工程支持,以及749美元起的永久许可,专为大规模生产级文档处理而构建。
准备好在生产环境中部署OCR了吗? 了解IronOCR 的许可选项,找到最适合您团队的方案。
常见问题解答
什么是 Microsoft Office 文档影像 (MODI)?
Microsoft Office Document Imaging (MODI) 是 MS Office 2003 和 2007 中包含的 OCR 组件。它允许开发人员使用基于 COM 的对象模型从图像中提取文本。
为什么我应该考虑使用 IronOCR 而不是 MODI?
IronOCR 提供了一个现代化的、完全支持的 OCR 库,与传统的 MODI 组件相比,它具有增强的功能、更高的准确性以及与 .NET 应用程序更好的集成。
IronOCR 可以处理 TIFF 和 BMP 图像文件吗?
是的,IronOCR 可以处理和提取各种图像格式(包括 TIFF 和 BMP)中的文本,为不同的文档数字化需求提供灵活性。
从 MODI 迁移到 IronOCR 有哪些好处?
迁移到 IronOCR 可获得更高级的 OCR 功能、定期更新和积极支持,确保您的 OCR 项目面向未来。
IronOCR 与 Visual Studio 兼容吗?
是的,IronOCR 与 Visual Studio 完全兼容,可以无缝集成到您的 .NET 项目中。
IronOCR 的准确度与 MODI 相比如何?
与较早的 MODI 技术相比,IronOCR 旨在提供更高的文本识别准确率,尤其是在处理现代图像格式和复杂文档方面。
IronOCR 为开发者提供哪些支持?
IronOCR 提供全面的文档、代码示例和专业支持,以帮助开发人员将 OCR 功能集成到他们的应用程序中。
IronOCR有可用的代码示例吗?
是的,IronOCR 提供了各种代码示例,帮助开发人员快速地在他们的 .NET 应用程序中实现 OCR。
IronOCR 可以用于实时文本提取吗?
IronOCR 能够实时提取文本,因此适用于需要立即处理扫描图像或文档的应用。
IronOCR 支持多语言文本识别吗?
是的,IronOCR 支持多语言文本识别,能够高精度地处理各种语言的文档。


