跳至页脚内容
使用 IRONOCR

C# 中的 OCR CodeProject 教程:使用 IronOCR 从图像中提取文本

C# 中的光学字符识别 (OCR) 功能允许您从.NET应用程序中的扫描文档、图像文件和 TIFF 文件中提取机器可读文本。 IronOCR是一个 .NET 原生 OCR 库,您只需安装一个NuGet包,几行代码即可开始从图像中读取文本——无需外部服务,无需运行时依赖,也无需按次 API 调用付费。

立即开始IronOCR的免费试用,并跟随以下代码示例进行操作。

如何在.NET项目中安装IronOCR ?

将 OCR 添加到.NET 10 项目的最快方法是通过NuGet包管理器。 在项目目录中打开终端并运行 dotnet CLI 命令,或者使用 Visual Studio 中的包管理器控制台:

# .NET CLI
dotnet add package IronOcr

# Package Manager Console
Install-Package IronOcr
# .NET CLI
dotnet add package IronOcr

# Package Manager Console
Install-Package IronOcr
SHELL

安装完成后, NuGet包管理器会自动下载所有必需的程序集并连接引用。 IronOCR 的目标框架为.NET Framework 4.6.2+、. .NET Core 3.1+ 以及.NET 5 至.NET 10,因此它可以在控制台应用程序、 ASP.NET Core服务、WPF 应用程序和 Azure Functions 中运行。

您无需注册许可证密钥即可在本地进行测试——在应用许可证之前,输出结果上会显示试用水印。 添加 using 指令,并在准备投入生产环境时,在启动时传递一次密钥:

using IronOcr;

// Apply license key before any OCR calls (production only)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronOcr;

// Apply license key before any OCR calls (production only)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

有关定价和激活详情,请参阅IronOCR许可页面

如何从图像文件中提取文本?

核心 OCR 工作流程涉及三个对象:OcrInput(输入容器)和 OcrResult(输出)。 下面的示例读取一个 PNG 文件,并将识别出的文本打印到控制台。

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("sample-document.png");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("sample-document.png");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
$vbLabelText   $csharpLabel

光学字符识别输出

C# OCR CodeProject 教程:使用IronOCR从图像中提取文本:图像 1 - OCR 输出截图

IronTesseract 为 Tesseract 5 引擎提供了 .NET 友好的默认设置和自动模型管理。 OcrInput.LoadImage 接受 PNG、JPEG、BMP、GIF、TIFF 和 WebP 文件,因此您很少需要在将图像传递给引擎之前转换格式。

OcrResult.Text 属性返回一个由换行符连接的所有可识别字符组成的纯字符串。 要获得更丰富的访问信息(例如单词边界框、置信度分数、每段文本),请浏览 result.Wordsresult.Characters 集合。

值得了解的关键特性:

  • result.Pages[0].Text -- 单页文本
  • result.Words[n].Textresult.Words[n].Confidence -- 逐字准确率 (0.0 -- 1.0)
  • result.Pages[0].Paragraphs -- 用于结构化提取的段落分割

您还可以调用 ocr.ReadAsync(input) 来保持桌面或 Web 应用程序中的 UI 线程空闲。

如何处理扫描文档和 TIFF 文件?

在文档扫描工作流程中,多页 TIFF 文件很常见。 IronOCR使用 LoadImageFrames 处理它们,这样您就可以精确地选择要处理的帧(页面)——当您只需要大型存档的子集时非常有用。

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
int[] pageIndices = { 0, 1, 2 };
input.LoadImageFrames("scanned-documents.tiff", pageIndices);

// Correct skew and remove noise before reading
input.Deskew();
input.DeNoise();

OcrResult result = ocr.Read(input);

foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}:");
    Console.WriteLine(page.Text);
}
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
int[] pageIndices = { 0, 1, 2 };
input.LoadImageFrames("scanned-documents.tiff", pageIndices);

// Correct skew and remove noise before reading
input.Deskew();
input.DeNoise();

OcrResult result = ocr.Read(input);

foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}:");
    Console.WriteLine(page.Text);
}
$vbLabelText   $csharpLabel

从多页 TIFF 文件输出OCR

C# OCR CodeProject 教程:使用IronOCR从图像中提取文本:图像 2 - 多页 TIFF OCR 输出

Deskew 旋转图像以校正平板扫描仪引入的任何倾斜。 DeNoise 可去除干扰 Tesseract 引擎的斑点和 JPEG 伪影。这两个预处理滤波器结合使用,可显著提高低质量扫描图像的识别准确率。

针对难以辨认的源材料,可使用其他 OcrInput 过滤器:

  • input.Sharpen() -- 提高模糊图像的边缘对比度
  • input.Binarize() -- 转换为黑白,以获得传真质量的文档
  • input.Scale(200) -- 放大小图像以获得更好的字符分离效果
  • input.Rotate(90) -- 修正旋转的文档方向

有关预处理选项及其应用时机的完整列表,请参阅IronOCR图像滤镜指南

如何配置 OCR 的语言支持?

IronOCR默认读取英文文本。 要处理其他语言的文档,请安装匹配的语言NuGet包,并在 IronTesseract 实例上设置 Language 属性。

dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.Japanese
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.Japanese
SHELL

然后配置引擎,对于双语文档,添加第二种语言:

using IronOcr;
using IronOcr.Languages;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;

// For bilingual documents (e.g. Canadian forms, EU directives)
ocr.AddSecondaryLanguage(OcrLanguage.French);

using var input = new OcrInput();
input.LoadImage("german-invoice.png");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronOcr.Languages;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;

// For bilingual documents (e.g. Canadian forms, EU directives)
ocr.AddSecondaryLanguage(OcrLanguage.French);

using var input = new OcrInput();
input.LoadImage("german-invoice.png");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
$vbLabelText   $csharpLabel

IronOCR支持超过 125 种语言,每种语言都以单独的轻量级NuGet包的形式分发。 这样可以保持生产二进制文件的大小——只包含应用程序实际需要的语言数据。 当您调用 AddSecondaryLanguage 时,引擎会在识别过程中融合主要语言模型和辅助语言模型。

如何处理 OCR 错误并提高识别结果?

生产应用需要针对OCR流程进行错误处理。图像质量问题、文件缺失或格式不支持都可能导致异常。 将调用包裹在 try/catch 块中,可以得到一个清晰的恢复路径。

using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;

try
{
    using var input = new OcrInput();
    input.LoadImage("document.png");
    input.DeNoise();
    input.Deskew();

    OcrResult result = ocr.Read(input);

    if (result.Text.Length > 0)
    {
        Console.WriteLine("Recognised text:");
        Console.WriteLine(result.Text);
    }
    else
    {
        Console.WriteLine("No text was detected in the image.");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"OCR error: {ex.Message}");
}
using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;

try
{
    using var input = new OcrInput();
    input.LoadImage("document.png");
    input.DeNoise();
    input.Deskew();

    OcrResult result = ocr.Read(input);

    if (result.Text.Length > 0)
    {
        Console.WriteLine("Recognised text:");
        Console.WriteLine(result.Text);
    }
    else
    {
        Console.WriteLine("No text was detected in the image.");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"OCR error: {ex.Message}");
}
$vbLabelText   $csharpLabel

以下几个设置有助于提高准确率:

  • ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto -- 让 Tesseract 自动选择单列、多列和单字布局
  • ocr.Configuration.ReadBarCodes = false -- 如果您正在处理纯文本文档并希望提高吞吐量,请禁用条形码检测。
  • ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5 -- 确保您使用最快的可用引擎

对于字段位置可预测的结构化表单,请使用基于区域的 OCR仅读取重要区域:

using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

using var input = new OcrInput();
var region = new CropRectangle(x: 50, y: 200, width: 600, height: 100);
input.LoadImage("form.png", region);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

using var input = new OcrInput();
var region = new CropRectangle(x: 50, y: 200, width: 600, height: 100);
input.LoadImage("form.png", region);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
$vbLabelText   $csharpLabel

将识别范围限制在裁剪矩形区域内,可以减少大图像处理时间高达 90%。 该技术非常适合用于提取发票号码、读取表单字段和扫描身份证件。 更多详情请参阅区域 OCR 使用指南

如何从识别的文本创建可搜索的 PDF?

将扫描图像存档转换为可搜索的 PDF 文件是 OCR 最有价值的应用案例之一。 生成的文件保留了原始的视觉外观,同时嵌入了一个不可见的文本层,PDF 查看器、搜索引擎和屏幕阅读器可以对其进行索引。

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.Title = "Quarterly Report Q1 2026";
input.LoadImage("page1.png");
input.LoadImage("page2.png");
input.LoadImage("page3.png");

OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");

Console.WriteLine("Searchable PDF created.");
Console.WriteLine($"Pages processed: {result.Pages.Count}");
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.Title = "Quarterly Report Q1 2026";
input.LoadImage("page1.png");
input.LoadImage("page2.png");
input.LoadImage("page3.png");

OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");

Console.WriteLine("Searchable PDF created.");
Console.WriteLine($"Pages processed: {result.Pages.Count}");
$vbLabelText   $csharpLabel

输出可搜索的 PDF 文档

C# OCR CodeProject 教程:使用IronOCR从图像中提取文本:图像 3 - 从输入图像创建的可搜索 PDF

SaveAsSearchablePdf 会生成一个 PDF/A 兼容的文件,其中每个识别出的单词都放置在原始图像的精确像素坐标处。 Adobe Acrobat、macOS 上的预览程序和 Foxit Reader 都支持在生成这些文件后立即进行全文搜索。

对于基于 Web 的文档查看器或下游 NLP 管道,请改用 result.SaveAsHocrFile("output.hocr")hOCR 格式是一种开放的 XML 标准,它将每个单词的边界框与文本一起编码,从而实现客户端搜索高亮显示和单词级辅助功能注释。

OcrResult 还提供其他输出格式:

  • result.SaveAsHocrFile("output.hocr") -- 带有位置数据的 hOCR XML
  • result.ToXDocument() -- 用于程序化处理的 LINQ 可查询 XDocument
  • result.Pages[0].Text -- 流式管道的每页纯文本

对于已经与IronPDF配合使用的应用程序,您可以将 OcrResult 直接导入 PDF 生成工作流程,在单个.NET进程中将 OCR 提取与 PDF 编辑结合起来。

如何解读条形码和文字?

IronOCR可以读取嵌入在与印刷文本同一图像中的条形码和二维码,无需运行单独的条形码库。 通过一个配置属性启用该功能:

using IronOcr;

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using var input = new OcrInput();
input.LoadImage("shipping-label.png");

OcrResult result = ocr.Read(input);

Console.WriteLine("Text:");
Console.WriteLine(result.Text);

Console.WriteLine("Barcodes:");
foreach (var barcode in result.Barcodes)
{
    Console.WriteLine($"  {barcode.Format}: {barcode.Value}");
}
using IronOcr;

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using var input = new OcrInput();
input.LoadImage("shipping-label.png");

OcrResult result = ocr.Read(input);

Console.WriteLine("Text:");
Console.WriteLine(result.Text);

Console.WriteLine("Barcodes:");
foreach (var barcode in result.Barcodes)
{
    Console.WriteLine($"  {barcode.Format}: {barcode.Value}");
}
$vbLabelText   $csharpLabel

支持的条形码格式包括 Code 128、Code 39、EAN-13、EAN-8、UPC-A、UPC-E、PDF417、Data Matrix 和 QR 码。 详细信息请参阅IronOCR条形码读取指南

这项功能在物流、医疗保健和零售应用中尤其有用,因为运输标签、病人腕带和产品标签都包含人可读文本和机器可读条形码。

如何将IronOCR与其他.NET OCR 选项进行比较?

开发人员在评估.NET的 OCR 库时通常会考虑IronOCR、Tesseract .NET以及 Google Cloud Vision 或 Azure计算机视觉 等云服务。 下表总结了主要区别:

基于关键开发人员标准的.NET OCR 选项比较
标准 IronOCR Tesseract.NET Azure计算机视觉
部署 本地部署或云端部署,无需外部呼叫 本地部署 仅限云端,需要互联网连接
安装 单个NuGet包 多个软件包 + 原生二进制文件 SDK + Azure 订阅
语言包 通过NuGet包提供 125 多个包 手动 tessdata 下载 由 Azure 管理
可搜索的 PDF 输出 内置一个方法调用 不包含 不包含
图像预处理 12+ 内置过滤器 需要手动预处理 自动(服务器端)
定价模式 一次性永久许可 开源(Apache 2.0) 按通话次数计费

Tesseract是由 Google 维护的开源项目,它为IronOCR和 Tesseract .NET提供底层技术支持。 IronOCR增加了 .NET 惯用的打包方式、自动模型管理以及原始 Tesseract 绑定所缺乏的生产输出功能(可搜索的 PDF、hOCR 导出)。 Azure 计算机视觉提供最先进的云精度,但引入了网络延迟和每次调用成本,不适合高容量或离线工作流程。

对于数据隐私法规禁止将文档发送到外部服务的情况(例如医疗记录、法律文件、财务报表),像IronOCR这样的本地库是合适的选择。

下一步计划是什么?

现在,您已具备向任何.NET 10 应用程序添加 OCR 的基本构建模块:通过NuGet安装、基本图像到文本提取、多页 TIFF 处理、语言配置、错误处理、基于区域的读取、条形码检测和可搜索的 PDF 生成。

如需深入了解,请浏览以下IronOCR资源:

IronOCR文档主页——完整的 API 参考和功能指南。 图像滤镜教程——所有预处理滤镜的详细指南 条形码读取指南——二维码和线性条形码及文本 -区域 OCR 使用指南——基于作物的表单和 ID 识别 -语言参考-- 超过 125 种受支持语言的完整列表

有关许可问题或在生产环境中部署IronOCR ,请访问IronOCR许可页面免费试用许可证可在评估期间移除输出水印, Iron Software 的支持团队可解答任何级别的技术问题。

立即开始使用 IronOCR。
green arrow pointer

常见问题解答

什么是OCR?它如何使C#开发人员受益?

OCR(光学字符识别)技术可以将扫描文档、PDF 或图像等文件转换为可编辑和可搜索的数据。对于 C# 开发人员而言,OCR 简化了文档处理流程,使应用程序能够从图像和扫描文档中提取文本,从而增强数据的可访问性和易用性。

如何在 C# 项目中实现 OCR?

在 C# 项目中实现 OCR 功能,需要安装IronOCR NuGet包,创建 IronTesseract 实例,将图像加载到 OcrInput 中,然后调用 Read 方法。返回的 OcrResult 包含提取的文本和逐字定位数据。

IronOCR 支持哪些图像格式?

IronOCR支持 PNG、JPEG、BMP、GIF、TIFF 和 WebP 图像格式。这使您可以直接处理大多数常见图像类型,而无需在处理前转换文件。

IronOCR 可以处理多页 TIFF 文件吗?

是的, IronOCR可以处理多页 TIFF 文件。使用 LoadImageFrames 函数并传入页面索引数组来处理特定帧,然后遍历 result.Pages 来访问每页的文本。

是否可以使用 IronOCR 从图像的特定区域提取文本?

是的,可以向 LoadImage 函数传递 CropRectangle 参数,将 OCR 识别范围限制在指定区域内。这可以显著缩短处理时间,对于从表单、发票和身份证件中提取特定字段非常有用。

IronOCR是否支持不同语言的文本提取?

IronOCR支持超过 125 种语言,每种语言都以单独的NuGet包形式提供。在 IronTesseract 中设置 Language 属性,然后调用 AddSecondaryLanguage 函数来添加双语文档。

与原始的 Tesseract .NET相比, IronOCR有哪些优势?

IronOCR在 Tesseract 引擎的基础上增加了 .NET 惯用的打包方式、自动语言模型管理、内置图像预处理过滤器、可搜索的 PDF 输出和 hOCR 导出功能,所有这些都可以通过一个NuGet包访问,无需手动管理本地二进制文件。

IronOCR是如何提高文本识别准确率的?

IronOCR提供预处理滤镜——去斜、去噪、锐化、二值化、缩放和旋转——在 Tesseract 引擎处理图像之前纠正常见的扫描缺陷,从而提高低质量源材料的识别准确率。

IronOCR 能读取条形码和二维码吗?

是的,将 ocr.Configuration.ReadBarCodes 设置为 true 可以检测同一图像中的条形码、二维码以及文本。结果会以格式类型和解码值的形式存储在 OcrResult.Barcodes 中。

IronOCR在C#应用程序中的常见用例有哪些?

IronOCR应用于文档管理系统、发票和收据数据提取、从扫描档案生成可搜索 PDF、表单字段读取、运输标签处理、医疗记录数字化和辅助功能工具。

Kannaopat Udonpant
软件工程师
在成为软件工程师之前,Kannapat 在日本北海道大学完成了环境资源博士学位。在攻读学位期间,Kannapat 还成为了车辆机器人实验室的成员,隶属于生物生产工程系。2022 年,他利用自己的 C# 技能加入 Iron Software 的工程团队,专注于 IronPDF。Kannapat 珍视他的工作,因为他可以直接从编写大多数 IronPDF 代码的开发者那里学习。除了同行学习外,Kannapat 还喜欢在 Iron Software 工作的社交方面。不撰写代码或文档时,Kannapat 通常可以在他的 PS5 上玩游戏或重温《最后生还者》。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我