跳至页脚内容
与其他组件比较

Tesseract C# 与IronOCR:在.NET中应该使用哪个 OCR 库?

如果您的.NET Framework 4.5 代码库仍然运行 OCR 层,并且您最近发现 Patagames 的 Tesseract .NET.SDK 无法针对.NET 6、.NET 8或任何 Linux Docker 镜像进行编译,那么您就遇到了本文要探讨的权衡取舍。 Tesseract .NET.SDK 面向.NET Framework 2.0 至 4.5,仅提供 Windows 原生二进制文件,并在免费的 Tesseract 引擎之上收取商业许可费——这种组合将团队锁定在一个日益缩小的传统基础设施孤岛上,而此时大多数组织正在将工作负载容器化并升级运行时。

了解 Tesseract .NET.SDK

Tesseract .NET.SDK 是 Patagames 出售的开源 Tesseract OCR 引擎的商业.NET封装器。 该产品捆绑了适用于Windows x86和x64的预编译Tesseract二进制文件,将C/C++ Tesseract API封装在托管的.NET表面中,并通过NuGet在Tesseract.Net.SDK包ID下交付该软件包。

该产品是为.NET Framework 4.5 为部署基准,Windows Server 为唯一目标平台的时代而设计的。 对于大多数团队来说,那个时代已经结束了,但SDK却没有跟上步伐。 官方支持版本为.NET Framework 2.0、3.0、3.5、4.0 和 4.5。不支持.NET Core、 .NET Standard、 .NET 5、 .NET 6、 .NET 7、.NET 8和.NET 9。 不支持Linux系统。 不支持macOS。 Docker 容器(几乎全部运行 Linux 基础镜像)不受支持。

Tesseract .NET.SDK 的主要架构特性:

-运行时目标:仅限.NET Framework 2.0–4.5; 不支持.NET Core或现代.NET运行时 -平台:仅限 Windows x86 和 x64; 对Windows特定本地库的P/Invoke调用将在任何非Windows主机上抛出DllNotFoundException

  • Tessdata 管理:语言未捆绑; 开发人员从Tesseract GitHub仓库下载bin/tessdata/文件夹中,并在Visual Studio中配置每个文件的构建操作。
  • 线程安全:OcrApi实例不是线程安全的; 并行工作负载需要每个线程一个引擎实例,每个实例将 40–100 MB 的语言数据加载到内存中。 -预处理:无内置功能; 处理倾斜、噪声过大或分辨率过低的图像需要使用外部库,例如 OpenCV 或 ImageMagick。
  • PDF 输入:不支持原生输入; 开发人员会安装第二个库(例如 PdfiumViewer),以便在 OCR 之前将 PDF 页面渲染成临时图像文件。 -开发商: Patagames 由个人开发商运营; 没有服务级别协议 (SLA),没有Enterprise级支持,如果开发人员无法工作,也没有冗余备份。

传统.NET Framework目标定位实践

.NET Framework 4.5 的硬性边界不仅仅是一个复选框——它影响着下游的每一个架构决策。 依赖于<TargetFramework>net8.0</TargetFramework>进行目标设定。 它无法由使用mcr.microsoft.com/dotnet/sdk:8.0的GitHub Actions runner构建。 它无法部署到运行 Linux 容器的Kubernetes pod中。 一旦组织的其他部门越过那条界限,OCR 服务就成了孤儿。

SDK自身的初始化代码直接暴露了这一点。 tesseract-net-sdk-basic-ocr.cs中的基本使用模式包括一个显式的Windows平台保护装置:

// Install: Install-Package Tesseract.Net.SDK
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
using Patagames.Ocr;

public string ExtractTextSimple(string imagePath)
{
    // Platform check — Tesseract.Net.SDK is Windows-only
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        throw new PlatformNotSupportedException(
            "Tesseract.Net.SDK only supports Windows.");
    }

    // Verify tessdata exists
    if (!Directory.Exists(@".\tessdata"))
    {
        throw new DirectoryNotFoundException(
            "tessdata folder not found. Download traineddata files from GitHub.");
    }

    using (var api = OcrApi.Create())
    {
        api.Init(Languages.English);       // loads eng.traineddata (~40 MB)
        return api.GetTextFromImage(imagePath);
    }
}
// Install: Install-Package Tesseract.Net.SDK
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
using Patagames.Ocr;

public string ExtractTextSimple(string imagePath)
{
    // Platform check — Tesseract.Net.SDK is Windows-only
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        throw new PlatformNotSupportedException(
            "Tesseract.Net.SDK only supports Windows.");
    }

    // Verify tessdata exists
    if (!Directory.Exists(@".\tessdata"))
    {
        throw new DirectoryNotFoundException(
            "tessdata folder not found. Download traineddata files from GitHub.");
    }

    using (var api = OcrApi.Create())
    {
        api.Init(Languages.English);       // loads eng.traineddata (~40 MB)
        return api.GetTextFromImage(imagePath);
    }
}
Imports Patagames.Ocr
Imports System.Runtime.InteropServices
Imports System.IO

Public Function ExtractTextSimple(ByVal imagePath As String) As String
    ' Platform check — Tesseract.Net.SDK is Windows-only
    If Not RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then
        Throw New PlatformNotSupportedException("Tesseract.Net.SDK only supports Windows.")
    End If

    ' Verify tessdata exists
    If Not Directory.Exists(".\tessdata") Then
        Throw New DirectoryNotFoundException("tessdata folder not found. Download traineddata files from GitHub.")
    End If

    Using api = OcrApi.Create()
        api.Init(Languages.English) ' loads eng.traineddata (~40 MB)
        Return api.GetTextFromImage(imagePath)
    End Using
End Function
$vbLabelText   $csharpLabel

在进行单行 OCR 工作之前会出现两个防御性检查:确认 Windows,确认 tessdata。 在任何非 Windows 主机上,该方法在到达引擎之前就会抛出异常。在任何部署期间未复制 tessdata 文件夹的机器上,也会再次抛出异常。 这两个检查都不是样板代码——它们都代表了开发人员在生产环境中遇到的故障模式。

了解IronOCR

IronOCR是一个面向.NET的商业 OCR 库,它基于优化的 Tesseract 5 引擎构建,具有自动图像预处理、原生 PDF 输入以及跨平台支持,支持 Windows、Linux、macOS、Docker、Azure 和 AWS 等平台。 它以单个NuGet包的形式发布,无需外部本机库配置、无需 tessdata 文件夹管理,也无需特定于平台的部署脚本。

主要特点:

-运行时支持: .NET Framework 4.6.2 及更高版本、 .NET Core 2.0 及更高版本、 .NET 5、6、7、8 和 9; 单个软件包二进制文件可在所有受支持的运行时环境中运行。 -平台支持: Windows x86/x64、Linux x64、macOS; 部署方式与 Docker 容器、Azure 应用服务、AWS Lambda 和 Kubernetes Pod 完全相同。

  • 预处理:内置滤镜——Deskew(), DeNoise(), Contrast(), Binarize(), EnhanceResolution(), Sharpen(), OcrInput对象在引擎执行之前应用
  • PDF输入:本地;input.LoadPdf()接受扫描和数字PDF,无需二次库; 受密码保护的 PDF 文件会将密码作为参数传递。
  • 可搜索PDF输出:result.SaveAsSearchablePdf()将任何扫描文档转换为文本可搜索的PDF,一次调用即可完成
  • 线程安全:IronTesseract实例是线程安全的; 单个实例即可服务所有线程,无需增加内存分配。 -语言支持:支持 125 种以上的语言,以独立的NuGet语言包形式安装,首次使用时自动下载,无需手动放置文件。
  • 许可:永续一次性购买,从$999的Lite层级开始; no per-document or per-transaction billing

功能对比

特征 Tesseract.Net.SDK IronOCR
.NET Framework支持 仅限 2.0–4.5 4.6.2+
现代.NET (5/6/7/8/9)
Windows部署
Linux部署
Docker容器
PDF 输入(原生)
自动预处理
线程安全引擎

详细功能对比

特征 Tesseract.Net.SDK IronOCR
运行时兼容性
.NET Framework 2.0–4.5
.NET Framework 4.6.2+
.NET Core 2.x/3.x
.NET 5
.NET 6
.NET 7
.NET 8
.NET 9
平台支持
Windows x86/x64
Linux x64
MacOS
Docker(Linux镜像)
Azure 应用服务(Linux)
AWS Lambda
Kubernetes pod
输入源
图像文件(BMP、PNG、JPEG、TIFF)
PDF 输入(原生)
受密码保护的PDF
字节数组/流
预处理
德斯丘 否(外部库) 内置
降噪 否(外部库) 内置
对比度增强 否(外部库) 内置
二值化 否(外部库) 内置
分辨率增强 否(外部库) 内置
输出
纯文本
可搜索的PDF
hOCR导出
结构化数据(单词、行、带坐标的段落)
置信度得分 是 (GetMeanConfidence()) 是 (result.Confidence)
语言支持
语言数量 120+(手动下载) 125+(NuGet包)
自动语言下载
螺纹
线程安全的引擎实例
内置并行处理
每个线程的内存开销 每台发动机约 40–100 MB 共享单实例
许可
许可模式 商业一次性 永久一次性
入门价格 约20-50美元 $999
按单计费
Enterprise支持/服务级别协议

.NET版本支持和运行时兼容性

这两个库之间最重要的区别不在于 API 设计或准确性,而在于运行时兼容性。

Tesseract .NET.SDK 方法

Tesseract .NET.SDK 的目标框架为.NET Framework 2.0 至 4.5。所有依赖于它的项目本身都必须面向这些框架版本之一。 迁移对比文件在设置部分确认了这一限制:

// Install: Install-Package Tesseract.Net.SDK
// License: Commercial (Patagames)
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
//
// Requirements:
//   - tessdata folder must exist in bin/Debug/or bin/Release/
//   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
//   - Windows operating system (no Linux/macOS support)

using Patagames.Ocr;

// Multi-language setup — all traineddata files must be manually downloaded
using (var api = OcrApi.Create())
{
    // Combine languages with bitwise OR
    api.Init(Languages.English | Languages.German | Languages.French);

    string text = api.GetTextFromImage(imagePath);
    return text;
}
// Install: Install-Package Tesseract.Net.SDK
// License: Commercial (Patagames)
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
//
// Requirements:
//   - tessdata folder must exist in bin/Debug/or bin/Release/
//   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
//   - Windows operating system (no Linux/macOS support)

using Patagames.Ocr;

// Multi-language setup — all traineddata files must be manually downloaded
using (var api = OcrApi.Create())
{
    // Combine languages with bitwise OR
    api.Init(Languages.English | Languages.German | Languages.French);

    string text = api.GetTextFromImage(imagePath);
    return text;
}
Imports Patagames.Ocr

' Install: Install-Package Tesseract.Net.SDK
' License: Commercial (Patagames)
' Platform: Windows ONLY (.NET Framework 2.0-4.5)
'
' Requirements:
'   - tessdata folder must exist in bin/Debug/or bin/Release/
'   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
'   - Windows operating system (no Linux/macOS support)

' Multi-language setup — all traineddata files must be manually downloaded
Using api = OcrApi.Create()
    ' Combine languages with bitwise OR
    api.Init(Languages.English Or Languages.German Or Languages.French)

    Dim text As String = api.GetTextFromImage(imagePath)
    Return text
End Using
$vbLabelText   $csharpLabel

using (var api = OcrApi.Create())模式是惯用的.NET Framework 2.0。它使用C# 1.0的using语句而不是C# 8.0的using var声明。 命名空间是Patagames.Ocr。 该语言组合使用枚举值的按位或运算。 在SDK样式项目文件中,这段代码无法针对Tesseract.Net.SDK本身不产生兼容的程序集。

团队之所以仍然使用.NET Framework 4.5,并非出于个人偏好。 它们之所以存在,是因为依赖项(有时包括 OCR 库)无法升级。 选择 Tesseract .NET.SDK 会加深这种依赖链。

IronOCR方法

IronOCR支持.NET Framework 4.6.2 以及.NET 9 及之前的所有现代.NET运行时环境。同一个程序包二进制文件可以在所有这些环境中运行。 将项目从.NET Framework 4.8 升级到.NET 8 不需要替换 OCR 库。

// Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
// Same NuGet package, same API, same results
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

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

var result = ocr.Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
// Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
// Same NuGet package, same API, same results
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

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

var result = ocr.Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
' Same NuGet package, same API, same results

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.German)
ocr.AddSecondaryLanguage(OcrLanguage.French)

Dim result = ocr.Read("document.jpg")
Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")
$vbLabelText   $csharpLabel

语言枚举类型不支持按位或运算。 没有tessdata文件夹。 无需平台检查。 IronTesseract 设置指南在一个文档中涵盖了所有受支持运行时的配置选项。

对于正在进行迁移的团队来说,实际意义在于: ASP.NET Core 8 项目和传统的.NET Framework 4.8 项目可以共享同一个IronOCR服务层。 没有条件编译,没有单独的库版本,也没有抽象层来掩盖不兼容的 API。

平台覆盖范围和容器部署

Tesseract .NET.SDK 方法

Tesseract .NET.SDK 提供 Windows x86 和 x64 本地二进制文件。 初始化 Tesseract 引擎的 P/Invoke 调用会解析为这些 Windows DLL。 在Linux主机上——包括基于DllNotFoundException

来自tesseract-net-sdk-pdf-processing.cs的并行处理示例说明了这对Windows自身批处理工作的意义,甚至在考虑Linux之前:

// Windows-only: Parallel.ForEach with separate engine per thread
// Each engine loads ~40-100 MB per language
Parallel.ForEach(
    imagePaths,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    imagePath =>
    {
        // WARNING: Must create separate OcrApi for each thread!
        // Memory usage: 4 threads × 100MB = 400MB minimum
        using (var api = OcrApi.Create())
        {
            api.Init(Languages.English);
            string text = api.GetTextFromImage(imagePath);
            results[imagePath] = text;
        }
    });
// Windows-only: Parallel.ForEach with separate engine per thread
// Each engine loads ~40-100 MB per language
Parallel.ForEach(
    imagePaths,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    imagePath =>
    {
        // WARNING: Must create separate OcrApi for each thread!
        // Memory usage: 4 threads × 100MB = 400MB minimum
        using (var api = OcrApi.Create())
        {
            api.Init(Languages.English);
            string text = api.GetTextFromImage(imagePath);
            results[imagePath] = text;
        }
    });
$vbLabelText   $csharpLabel

四个并行线程,四个引擎实例,同时加载 400 MB 的语言数据——而这仅仅是英语的情况。 加上德语和法语,这条底线就翻倍了。 SDK 没有提供任何池化机制来缓解这个问题。 该架构与现代容器资源限制不兼容,现代容器资源限制通常会对每个 pod 的内存容量进行限制。

此外,Linux 消费计划中也没有 Azure Functions、AWS Lambda(运行在 Amazon Linux 上)和 Google Cloud Run 的途径。 所有主流的无服务器平台默认都使用 Linux 系统。 根据设计,Tesseract .NET.SDK 不包含在所有这些列表中。

IronOCR方法

IronOCR部署到Docker中,无需额外配置,只需在基于Debian的镜像上添加一行apt-get即可。 Docker部署指南涵盖了Linux和Windows容器。 同样的情况也适用于Linux 部署AzureAWS

线程安全内置于IronTesseract。 一个实例服务于所有并行工作进程:

// Cross-platform: Windows, Linux, macOS, Docker
// Single instance — thread-safe
using IronOcr;

var ocr = new IronTesseract();

// Single engine instance shared across all threads
// 否 memory multiplication
Parallel.ForEach(imagePaths, imagePath =>
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);
    SaveResult(imagePath, result.Text);
});
// Cross-platform: Windows, Linux, macOS, Docker
// Single instance — thread-safe
using IronOcr;

var ocr = new IronTesseract();

// Single engine instance shared across all threads
// 否 memory multiplication
Parallel.ForEach(imagePaths, imagePath =>
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);
    SaveResult(imagePath, result.Text);
});
Imports IronOcr

' Cross-platform: Windows, Linux, macOS, Docker
' Single instance — thread-safe
Dim ocr As New IronTesseract()

' Single engine instance shared across all threads
' 否 memory multiplication
Parallel.ForEach(imagePaths, Sub(imagePath)
    Using input As New OcrInput()
        input.LoadImage(imagePath)
        Dim result = ocr.Read(input)
        SaveResult(imagePath, result.Text)
    End Using
End Sub)
$vbLabelText   $csharpLabel

四个线程,一个引擎实例,内存中一份语言数据副本。 对于具有吞吐量基准的 多线程示例, IronOCR文档详细介绍了配置选项。

PDF处理

Tesseract .NET.SDK 方法

Tesseract .NET.SDK 不支持 PDF。 tesseract-net-sdk-pdf-processing.cs文件在其头部坦率地介绍了这种限制:

// 关键限制:
// Tesseract .NET.SDK 本身不支持 PDF 输入。
// 您必须先使用单独的库将 PDF 页面转换为图像。
// 本示例使用 PdfiumViewer,但其他替代方案包括:
// - iTextSharp
// - Ghostscript .NET
// - Docnet.Core

结果是一个多库管道。安装PdfiumViewer。 将每个PDF页面渲染为Bitmap,分辨率为200–300 DPI。 将该位图写入临时文件。在临时文件上运行api.GetTextFromImage()。删除临时文件。对每个页面重复此步骤。 对文档中间部分出错的情况实现错误处理。 显式管理内存——GC.Collect()一次,以防止大文档的内存不足错误。

这是实际的生产代码,不是简化的示例。 它只能在 Windows 系统上运行,只能在.NET Framework上运行,并且需要第二个商业或开源依赖项,而该依赖项本身也需要部署管理。

IronOCR方法

IronOCR可以直接读取 PDF 文件。 没有辅助库,没有临时文件,没有页面渲染循环:

// Native PDF OCR — no PdfiumViewer, no temp files
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");   // native PDF support
var result = ocr.Read(input);

// Access page-by-page results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}

// Or produce a searchable PDF output
result.SaveAsSearchablePdf("searchable-report.pdf");
// Native PDF OCR — no PdfiumViewer, no temp files
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");   // native PDF support
var result = ocr.Read(input);

// Access page-by-page results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}

// Or produce a searchable PDF output
result.SaveAsSearchablePdf("searchable-report.pdf");
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadPdf("scanned-report.pdf") ' native PDF support
    Dim result = ocr.Read(input)

    ' Access page-by-page results
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
    Next

    ' Or produce a searchable PDF output
    result.SaveAsSearchablePdf("searchable-report.pdf")
End Using
$vbLabelText   $csharpLabel

密码保护的PDF需要一个额外的参数:input.LoadPdf("encrypted.pdf", Password: "secret")。 特定页面范围使用input.LoadPdfPages("document.pdf", 1, 10)PDF 输入指南可搜索的 PDF 操作指南涵盖所有变体。

PDF OCR 示例显示了完整的模式,包括置信度检查和结构化输出。 可搜索 PDF 示例演示了文档存档用例,其中扫描的 PDF 会被建立索引并可搜索。

图像预处理和实际文档质量

Tesseract .NET.SDK 方法

Tesseract引擎对图像质量非常敏感。 如果不进行预处理,倾斜、低分辨率或有噪声的文档将产生质量显著下降的输出结果。 Tesseract .NET.SDK 不提供任何功能。

迁移对比文件直接量化了差距:

// Tesseract.Net.SDK: 否 preprocessing available
// Direct OCR on problematic image = garbage output
using (var api = OcrApi.Create())
{
    api.Init(Languages.English);

    // Direct OCR on problematic image — poor results
    string text = api.GetTextFromImage(imagePath);
    return text;

    // To preprocess, you need:
    // 1. Install Emgu CV or OpenCvSharp
    // 2. Implement Hough transform for skew detection
    // 3. Implement affine rotation for deskew
    // 4. Implement FastNlMeansDenoising for noise reduction
    // 5. Handle all the native OpenCV dependencies
    // This is often 200+ lines of code
}
// Tesseract.Net.SDK: 否 preprocessing available
// Direct OCR on problematic image = garbage output
using (var api = OcrApi.Create())
{
    api.Init(Languages.English);

    // Direct OCR on problematic image — poor results
    string text = api.GetTextFromImage(imagePath);
    return text;

    // To preprocess, you need:
    // 1. Install Emgu CV or OpenCvSharp
    // 2. Implement Hough transform for skew detection
    // 3. Implement affine rotation for deskew
    // 4. Implement FastNlMeansDenoising for noise reduction
    // 5. Handle all the native OpenCV dependencies
    // This is often 200+ lines of code
}
' Tesseract.Net.SDK: 否 preprocessing available
' Direct OCR on problematic image = garbage output
Using api = OcrApi.Create()
    api.Init(Languages.English)

    ' Direct OCR on problematic image — poor results
    Dim text As String = api.GetTextFromImage(imagePath)
    Return text

    ' To preprocess, you need:
    ' 1. Install Emgu CV or OpenCvSharp
    ' 2. Implement Hough transform for skew detection
    ' 3. Implement affine rotation for deskew
    ' 4. Implement FastNlMeansDenoising for noise reduction
    ' 5. Handle all the native OpenCV dependencies
    ' This is often 200+ lines of code
End Using
$vbLabelText   $csharpLabel

这番评论并非夸张之词。 使用 OpenCV 在.NET中实现生产级斜角校正功能,需要 100-200 行代码,包括初始化、角度检测、矩阵计算和仿射变换。 然后必须对该代码进行测试、维护和部署——它有自己的原生依赖链,而该依赖链又只能在 Windows 上运行。

IronOCR方法

IronOCR将预处理作为OcrInput上的一流API方法捆绑。 在 Tesseract .NET.SDK 中需要 OpenCV 集成才能完成的操作,在这里只需调用单个方法即可:

// 内置 preprocessing — no external library required
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("skewed-invoice-scan.jpg");

input.Deskew();               // automatic angle detection and correction
input.DeNoise();              // scanner artifact removal
input.Contrast();             // contrast enhancement
input.Binarize();             // optimal threshold conversion
input.EnhanceResolution(300); // scale low-DPI images to 300 DPI

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// 内置 preprocessing — no external library required
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("skewed-invoice-scan.jpg");

input.Deskew();               // automatic angle detection and correction
input.DeNoise();              // scanner artifact removal
input.Contrast();             // contrast enhancement
input.Binarize();             // optimal threshold conversion
input.EnhanceResolution(300); // scale low-DPI images to 300 DPI

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' 内置 preprocessing — no external library required
Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadImage("skewed-invoice-scan.jpg")

    input.Deskew()               ' automatic angle detection and correction
    input.DeNoise()              ' scanner artifact removal
    input.Contrast()             ' contrast enhancement
    input.Binarize()             ' optimal threshold conversion
    input.EnhanceResolution(300) ' scale low-DPI images to 300 DPI

    Dim result = ocr.Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

图像质量校正指南图像颜色校正指南记录了所有可用的滤镜,并提供了校正前后的精度对比。 低质量扫描示例显示了典型实际文档条件下的准确率提升数据。

具体来说,针对扫描文档工作流程,扫描文档处理指南在一篇文章中涵盖了方向检测、多页处理和批量吞吐量优化。

API 映射参考

Tesseract.Net.SDK IronOCR当量 备注
Install-Package Tesseract.Net.SDK dotnet add package IronOcr IronOCR支持所有现代运行时环境。
using Patagames.Ocr; using IronOcr;
OcrApi.Create() new IronTesseract() IronTesseract 对螺纹安全; 每个应用程序一个实例
api.Init(Languages.English) ocr.Language = OcrLanguage.English IronOCR使用属性赋值,而不是方法调用。
api.Init(Languages.English \| Languages.德语) ocr.AddSecondaryLanguage(OcrLanguage.German) 无需按位或运算
api.GetTextFromImage(path) ocr.Read("path.jpg").Text 直接使用链式调用或使用 OcrInput
OcrImage.FromFile(path) new OcrInput("path.jpg") OcrInput 接受文件、流、字节数组、URL 和位图。
OcrImage.FromBitmap(bmp) input.LoadImage(bitmap)
api.SetImage(img); api.GetText() |ocr.Read(input).Text` OcrInput 等同于 SetImage。
api.GetMeanConfidence() result.Confidence 返回结果对象
api.SetRectangle(x, y, w, h) input.LoadImage() 基于区域的OCR指南
api.SetVariable("tessedit_char_whitelist", x) ocr.Configuration.WhiteListCharacters = x
api.SetVariable("tessedit_char_blacklist", x) ocr.Configuration.BlackListCharacters = x
(no PDF support) input.LoadPdf("file.pdf") 无需辅助库
(no preprocessing) input.Desc(); input.DeNoise(); 等等。 所有预处理功能均已内置
(no structured output) result.Words, result.Lines, result.Pages 词级坐标和置信度
(no searchable PDF) result.SaveAsSearchablePdf("out.pdf") 一次调用即可搜索的 PDF 输出

当团队考虑从 Tesseract .NET.SDK 迁移到IronOCR时

.NET升级导致此问题

最常见的触发因素并非对 OCR 质量不满意,而是计划中的.NET Framework升级在 OCR 层遇到了瓶颈。 升级文档管理应用程序从.NET Framework 4.7到.NET 8的团队发现Tesseract.Net.SDK没有产生兼容的目标框架程序集。 升级要么停滞不前,要么 OCR 服务被隔离到一个单独的仅限 Windows 的进程中,该进程通过 HTTP 进行通信——这引入了一个网络跃点、一个单独的部署工件和一个必须无限期维护的兼容性垫片。 对于大多数正在积极升级的团队来说,这两种结果都是无法接受的。 用IronOCR替换 Tesseract .NET .SDK 可以消除障碍,并允许升级顺利进行,因为IronOCR可以同时在旧的.NET Framework4.6.2+和新的.NET 8 目标上运行,这意味着该服务可以逐步迁移。

处理流程的容器化

文档处理工作负载是容器化的首选目标之一:它们是无状态的、CPU密集型的,并且可以从水平扩展中受益。 一个团队已经将其管道的其余部分容器化,但当基础镜像为 Linux 时,Tesseract .NET.SDK 在 Docker 镜像构建步骤失败。 可供选择的方案要么是 Windows 容器(但这会带来许可费用、更大的镜像大小,并且与大多数默认使用 Linux 节点池的托管 Kubernetes 服务不兼容),要么是实际支持 Linux 的库。 IronOCR可以部署到任何使用标准 Dockerfile 的 Linux 容器中。Docker部署指南提供了 Debian 和 Alpine 基础镜像的详细 Dockerfile 配置。

大规模并行批处理

一个使用 Tesseract .NET.SDK 的发票处理管道,每天处理 50,000 份文档,有四个并行工作进程,仅四个加载了英文数据的引擎实例就至少需要 400 MB 的空间。 再加上第二门语言,数量就会翻倍。 如果使用 OpenCV 进行预处理,内存消耗会进一步增加。 在资源受限的服务器或每个 pod 内存限制为 2 GB 的容器化部署中,这种计算方式会成为部署障碍。IronOCR的线程安全单实例模型消除了每个线程的内存倍增。 一个引擎实例可以处理四个、八个或十六个并行工作进程,只需加载一次单个语言模型。 多线程示例演示了配置过程。

无需二级依赖项的 PDF 原生工作流程

对于主要接收 PDF 格式文档(例如保险索赔、合同、发票、税务表格)的组织而言,Tesseract .NET.SDK 存在一个复杂的问题:他们必须维护一个 PDF 渲染库以及一个 OCR 库。 当 PdfiumViewer 或 iText 发布安全补丁时,这两个库都需要协调更新和回归测试。 当 PDF 库在渲染特定 PDF 版本时出现错误时,OCR 管道会生成乱码文本,且没有明显的根本原因。IronOCR的原生 PDF 支持将原本需要两个库才能运行的系统简化为一个库。 只需安装一个软件包即可替换两者。 PDF OCR 用例页面涵盖了完整的工作流程。

Enterprise部署要求

Patagames Tesseract .NET.SDK 许可证包含来自单个开发人员的电子邮件和论坛支持。 没有服务级别协议 (SLA),没有保证响应时间,也没有升级途径。 对于受监管行业(医疗保健、金融、政府)的应用,采购团队越来越要求软件供应商提供有记录的服务水平协议 (SLA)、安全披露流程和组织连续性保证。 Patagames 由个人开发者运营,无法满足这些要求。 IronOCR由Iron Software开发,Iron Software 是一家商业实体,拥有专门的支持、安全流程和符合Enterprise采购要求的许可条款。 许可页面文档列出了可用的支持级别。

常见迁移注意事项

命名空间和实例模式

从 Tesseract .NET.SDK 到IronOCR 的代码更改很小。 用using Patagames.Ocr;。 用OcrApi.Create()。 用api.Init(Languages.English)。 调用代码的功能逻辑不会改变。 简单的数据提取服务可以在一小时内完成迁移。

// Before: Tesseract.Net.SDK
using Patagames.Ocr;

using (var api = OcrApi.Create())
{
    api.Init(Languages.English);
    return api.GetTextFromImage(imagePath);
}

// After: IronOCR
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
// Before: Tesseract.Net.SDK
using Patagames.Ocr;

using (var api = OcrApi.Create())
{
    api.Init(Languages.English);
    return api.GetTextFromImage(imagePath);
}

// After: IronOCR
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
Imports Patagames.Ocr

Using api = OcrApi.Create()
    api.Init(Languages.English)
    Return api.GetTextFromImage(imagePath)
End Using

Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage(imagePath)
    Return ocr.Read(input).Text
End Using
$vbLabelText   $csharpLabel

从图像中读取文本教程基本 OCR 示例提供了完整的可运行示例,并进行了输入验证和置信度检查。

Tessdata 文件夹删除

迁移后,可以从项目中删除整个tessdata/文件夹。 IronOCR将语言数据与其NuGet包捆绑在一起。 从.traineddata引用,从部署脚本中删除tessdata目录,并删除任何复制训练数据文件的CI/CD管道步骤。 IronOcr.Languages.* NuGet包在正常的软件包还原步骤中安装语言数据——无需单独下载,无需手动文件夹配置,无需在Visual Studio中设置构建操作。 多语言指南涵盖了语言包的安装。

PDF流程简化

任何为渲染 PDF 页码而安装 PdfiumViewer、iText 或 Ghostscript.NET 的代码都可以完全移除。 用input.LoadPdf(pdfPath)替换整个多步骤渲染到临时文件然后OCR的管道。 专门针对受密码保护的 PDF、特定页面范围和超过 100 页的大型文档进行测试——这些极端情况最有可能在验证过程中暴露出行为差异。

线程模型和实例生命周期

Tesseract.Net.SDK代码通常为每个请求或每个线程创建一个OcrApi实例,以避免线程安全问题。 IronOCR是线程安全的,因此IronTesseract实例应创建一次(在应用程序启动时或作为DI容器中的单例),并在所有请求中重用。 为每个请求创建一个新的IronTesseract()将浪费初始化开销。 将其注册为ASP.NET Core 服务容器中的单例,并在需要的地方注入。

其他IronOCR功能

除了上述直接比较的功能之外, IronOCR还提供了 Tesseract .NET.SDK 所不具备的功能:

  • OCR 过程中的条形码读取功能可读取嵌入在同一文档中的二维码和线性条形码,无需单独的条形码扫描步骤;有关配置,请参阅条形码 OCR 示例
  • 异步OCR为非阻塞集成提供ReadAsync(),适用于ASP.NET Core请求管道 表格提取功能可识别文档中的表格结构,从而能够从财务报表、发票和报告中提取结构化数据。 护照和身份证读取功能采用专门的识别技术,可识别机器可读的旅行证件和身份证件。 -进度跟踪功能会在多页文档处理过程中触发每页进度事件,从而在长时间运行的批处理作业中提供准确的进度指示器。

.NET兼容性和未来准备情况

IronOCR支持.NET Framework 4.6.2到当前的.NET 9版本,并将继续支持未来发布的.NET版本。此库针对netstandard2.0提供广泛的框架兼容性,并在同一NuGet包中为Windows、Linux和macOS提供平台特定的本机二进制文件。 从.NET Framework升级到.NET 8或.NET 9的团队不需要更改OCR库——相同的IronOcr包引用可以在两者上运行。 Tesseract .NET.SDK 的目标框架为.NET Framework 2.0 至 4.5,目前尚未公布对现代.NET 的支持路线图; 它在结构上与当前的微软.NET发布节奏不​​兼容,微软 .NET 每年 11 月都会发布一个新的主要版本。 任何计划升级到.NET Framework 4.5 之后的团队——无论是在六个月后还是三年后——都需要在过渡点替换 Tesseract .NET.SDK,而不管其他任何评估标准如何。

结论

Tesseract .NET.SDK 占据了一个特定的、正在缩小的市场:对于长期致力于 Windows Server 部署、 .NET Framework 4.5,并已预算 15-40 小时的开发人员时间来配置 tessdata、实现外部预处理以及从单独的库构建 PDF 渲染管道的团队来说,它是正确的选择。 许可证费用并非成本本身。成本包括围绕许可证费用的一切。

本文开头提出的问题——在升级过程中发现 OCR 依赖项无法以.NET 8 为目标——并非个例。 这是选择明确不支持现代.NET运行时的库的必然结果。 IronOCR完全消除了这一限制:一个NuGet包即可支持从.NET Framework 4.6.2 到.NET 9 的所有运行时,可在 Windows、Linux、macOS 和 Docker 上运行,并包含预处理和 PDF 支持,否则这些功能需要两个额外的依赖项和数百行集成代码。

对于目前在稳定的.NET Framework 4.5 应用程序中运行 Tesseract .NET .SDK 且没有计划对运行时进行现代化改造的团队来说,现状将保持不变——直到容器强制使用、Linux 迁移或框架升级迫使他们解决这个问题。 对于积极进行现代化改造的团队(例如容器化服务、采用.NET 8、迁移到 Linux 基础架构或扩展批量文档管道),Tesseract .NET.SDK 是一个阻碍,而不是一个基础。 从传统 API 切换到IronOCR只需要几个小时的代码修改。 另一种选择是无限期地将一个仅限 Windows 的服务作为孤立的组件保留在现代化架构的边缘。

IronOCR许可费高于 Patagames SDK 费用,但真正的成本比较必须包括 Tesseract .NET.SDK 在生产环境中处理单个文档之前所需的 15-40 小时的 tessdata 配置、外部预处理库集成和 PDF 渲染管道组装。 上述对比中记录了这种设置开销,而且随着团队规模的扩大或文档数量的增加,这种开销并不会减少。

请注意Ghostscript、PDFium、Tesseract 和 iText 是各自所有者的注册商标。 本网站与 Artifex Software、Chromium Project、Google 或 iText Group 无关,也未获得其认可或赞助。所有产品名称、徽标和商标均为其各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

什么是 Tesseract .NET SDK(官方版)?

Tesseract .NET SDK(官方版)是一款OCR解决方案,开发者和企业可使用它从图像和文档中提取文本。它是与IronOCR一同评估的用于.NET应用程序开发的几种OCR方案之一。

IronOCR 与 Tesseract .NET SDK(官方版)相比,对 .NET 开发人员来说有何不同?

IronOCR 是一个基于 NuGet 的 .NET OCR 库,其核心引擎是 IronTesseract。与官方的 Tesseract .NET SDK 相比,它提供了更简便的部署方式(无需 SDK 安装程序)、统一的定价模式以及简洁的 C# API,无需 COM 互操作或云依赖。

IronOCR 的设置是否比 Tesseract .NET SDK(官方版)更容易?

IronOCR 通过单个 NuGet 包进行安装。无需 SDK 安装程序、复制许可证文件、注册 COM 组件或管理单独的运行时二进制文件。整个 OCR 引擎都打包在包中。

Tesseract .NET SDK(官方版)和 IronOCR 在准确率方面存在哪些差异?

IronOCR 对标准商务文档、发票、收据和扫描表格的识别准确率很高。对于严重损坏的文档或不常见的文字,识别准确率会因源文件质量而异。IronOCR 包含图像预处理滤镜,可提高低质量输入文件的识别率。

IronOCR是否支持PDF文本提取?

是的。IronOCR只需一次调用即可从原生PDF和扫描的PDF图像中提取文本。它还支持多页TIFF文件、图像和流。对于扫描的PDF,OCR逐页进行处理,并为每个页面生成一个结果对象。

Tesseract .NET SDK(官方)的许可与 IronOCR 相比如何?

IronOCR采用永久统一费率许可,不按页或扫描次数收费。处理大量文档的机构无论处理量多少,都只需支付相同的许可费用。详情及批量定价请访问IronOCR许可页面。

IronOCR支持哪些语言?

IronOCR 通过独立的 NuGet 语言包支持 127 种语言。添加语言只需一条命令“dotnet add package IronOcr.Languages.{Language}”。无需手动放置文件或配置路径。

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

通过 NuGet 安装:在程序包管理器控制台中运行“Install-Package IronOcr”命令,或在命令行界面 (CLI) 中运行“dotnet add package IronOcr”命令。其他语言包的安装方式相同。无需使用原生 SDK 安装程序。

与 Tesseract .NET SDK 不同,IronOCR 是否适用于 Docker 和容器化部署?

是的。IronOCR 通过 NuGet 包在 Docker 容器中运行。许可证密钥通过环境变量设置。OCR 引擎本身不需要任何许可证文件、SDK 路径或卷挂载。

我可以在购买前试用 IronOCR,并将其与 Tesseract .NET SDK 进行比较吗?

是的。IronOCR 试用模式可以处理文档,并在输出结果上添加水印,从而生成 OCR 结果。您可以在购买许可证之前,先在自己的文档上验证其准确性。

IronOCR是否支持条形码读取和文本提取?

IronOCR专注于文本提取和OCR识别。对于条形码读取,Iron Software提供了配套库IronBarcode。两者都可单独购买,也可作为Iron Suite套装的一部分购买。

从 Tesseract .NET SDK(官方版)迁移到 IronOCR 容易吗?

从 Tesseract .NET SDK(官方版)迁移到 IronOCR 通常涉及将初始化序列替换为 IronTesseract 实例化、移除 COM 生命周期管理以及更新 API 调用。大多数迁移都能显著降低代码复杂度。

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

钢铁支援团队

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