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

ABBYY FineReader引擎对比IronOCR:.NET OCR

XImage.OCR 对其提供的 OCR 库收取商业许可费,而该库提供的 Tesseract 引擎您可以免费使用——然后要求您为所需的每种语言安装一个单独的NuGet包,从而创建了一个依赖链,仅英语就需要 2 个包,而对于一个中等规模的多语言应用程序,则需要 11 个包。 这种碎片化并非包装上的怪癖; 它是XImage.OCR中的核心架构决策,决定了使用该库的各个方面:您的.csproj文件、您的CI/CD管道、您的版本管理,最终您对您实际购买的商业价值问题的回答。

了解 XImage.OCR

XImage.OCR 是 RasterEdge 提供的商业.NET OCR 库,是其更广泛的文档图像处理 SDKSuite的一部分。该库封装了 Google 的开源 Tesseract 引擎,为 OCR 操作提供托管的.NET绑定。 RasterEdge 将其作为一款EnterpriseOCR 解决方案推向市场,供开发人员嵌入到他们现有的文档图像处理生态系统中。

该库面向.NET Standard 2.0 和.NET Framework 4.5+,因此对旧版项目仍然适用。 它的主要支持重点是视窗系统,跨平台覆盖范围远不如现代替代方案广泛。

主要架构特征:

  • 碎片化语言打包:每种支持的语言都作为一个独立的NuGet包(XImage.OCR.Language.German等)发布,需要单独安装和版本同步维护。
  • Tesseract 核心引擎:其底层 OCR 技术与免费封装程序提供的技术完全相同——采用 Apache 2.0 许可的 Tesseract,可免费使用。 -无内置预处理:直接访问原始 Tesseract 图像,不进行自动去斜、降噪、对比度增强或分辨率校正; poor-quality input produces poor output -线程安全限制:作为 Tesseract 的封装器,XImage.OCR 不是线程安全的; 每个并发线程都需要自己的OCRHandler实例,成比例地增加内存消耗。
  • RasterEdge 生态系统集成: PDF 处理需要单独的 RasterEdge PDF SDK——XImage.OCR 本身不包含原生 PDF OCR 功能。 -语言覆盖范围有限:目前大约只有 10-15 个语言包,远少于通过标准 tessdata 发行版免费提供的 100 多种语言。

语言包碎片化实践

每个语言一个软件包的做法,其后果会具体体现在项目文件中。例如,对于一个处理五种欧洲语言文档的应用程序,其软件包清单如下所示:


<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />

<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
XML

核心软件包和语言软件包版本不匹配会导致运行时初始化错误。 当XImage.OCR.Language.English为12.3.0时,这是一种任何部分更新后可能出现的情况,库在运行时会失败,并伴随不明确指出版本同步是原因的错误。 您的 CI/CD 管道现在有 6 个不同的恢复操作和 6 个独立的故障点。 为全球部署添加亚洲语言需要添加 CJK 包:简体中文、繁体中文、日语和韩语都需要各自的包,这使得一个 10 种语言的应用程序需要 11 个独立的NuGet依赖项。

了解IronOCR

IronOCR是一个基于优化的 超立方体5 引擎构建的.NET商业 OCR 库,具有专有的预处理和输出扩展。 它作为一个包含OCR引擎、所有预处理功能、本地PDF输入和可搜索PDF输出、条码读取以及全跨平台运行时支持的单一NuGet包(IronOcr)发布。

主要特点:

  • 单一包部署:一个dotnet add package IronOcr命令安装所有内容; 没有原生二进制文件管理,没有 tessdata 文件夹配置,也没有平台特定的 DLL 协调
  • 自动预处理管道:内置OcrInput,在识别之前——无需外部图像处理库
  • 本地PDF支持:input.LoadPdf()直接读取PDF; result.SaveAsSearchablePdf()生成可搜索的PDF; 受密码保护的 PDF 文件使用单个参数进行处理。
  • 线程安全设计:单个IronTesseract实例处理跨多个线程的并发请求,而不需要每线程实例化
  • 通过可选NuGet包提供125+种语言:语言按需安装为独立的IronOcr.Languages.*包; 核心英语默认包含在课程包中。 -跨平台运行时:同一软件包支持 Windows(x86、x64)、Linux x64、macOS、Docker、Azure 应用服务和 AWS Lambda。
  • 结构化结果模型:Words以及每个单词的坐标和置信度分数
  • 定价:$2,999Professional——一次性购买,包括一年更新

功能对比

特征 XImage.OCR IronOCR
支持 5 种语言的NuGet包 6 1
内置预处理
原生 PDF 输入 需要 RasterEdge PDF SDK
可搜索的 PDF 输出 需要单独的 SDK
线程安全
跨平台 主要使用视窗系统 Windows、Linux、macOS、Docker
可用语言 约15 125+

详细功能对比

特征 XImage.OCR IronOCR
软件包管理
NuGet包(仅限英文) 2 1
NuGet包(10 种语言) 11 1
版本同步要求 所有包裹必须匹配 单版本
CI/CD 恢复操作 每包1个 共 1 人
OCR引擎
核心引擎 Tesseract(与免费包装器相同) 优化后的 超立方体5
引擎版本 4.x/5.x 超立方体5
置信度评分 部分(通过 Tesseract) 是 (result.Confidence)
预处理
德斯丘 是 (input.Deskew())
降噪 是 (input.DeNoise())
对比度增强 是 (input.Contrast())
二值化 是 (input.Binarize())
分辨率增强 是 (input.EnhanceResolution(300))
文档支持
图像输入
原生 PDF 输入 需要额外的SDK
受密码保护的PDF 需要额外的SDK 是的(单参数)
可搜索的 PDF 输出 需要额外的SDK
hOCR 输出
语言支持
可用语言总数 约15 125+
英语包含在核心课程中
欧盟24种官方语言 未完成 所有费用均已包含
中日韩语 4 个独立包装 可提供
架构
螺纹安全 不线程安全 线程安全
每个并发线程的内存 每个实例约 100MB 共享单实例
基于区域的OCR 有限 (ProcessRegion) 是 (CropRectangle)
OCR过程中的条形码读取
结构化结果模型 基本字符串输出 页数、行数、字数、坐标
部署
视窗
Linux
MacOS
多克
Azure/AWS

包碎片化与单一NuGet包

XImage.OCR 和IronOCR之间最明显的结构性区别在于它们处理语言支持的方式。 这并非无关紧要的细节——它会影响到参与项目的每一个团队成员、每一个构建流程以及每一次部署。

XImage.OCR 方法

XImage.OCR 将每种语言作为单独的NuGet包分发。 核心安装命令仅安装 OCR 引擎。 然后,您需要安装每种所需的语言:

# XImage.OCR: Install sequence for a multilingual application
dotnet add package RasterEdge.XImage.OCR
dotnet add package XImage.OCR.Language.English
dotnet add package XImage.OCR.Language.German
dotnet add package XImage.OCR.Language.French
dotnet add package XImage.OCR.Language.Spanish
dotnet add package XImage.OCR.Language.Italian
dotnet add package XImage.OCR.Language.Portuguese
dotnet add package XImage.OCR.Language.ChineseSimplified
dotnet add package XImage.OCR.Language.ChineseTraditional
dotnet add package XImage.OCR.Language.Japanese
# 10 languages = 11 package commands
# XImage.OCR: Install sequence for a multilingual application
dotnet add package RasterEdge.XImage.OCR
dotnet add package XImage.OCR.Language.English
dotnet add package XImage.OCR.Language.German
dotnet add package XImage.OCR.Language.French
dotnet add package XImage.OCR.Language.Spanish
dotnet add package XImage.OCR.Language.Italian
dotnet add package XImage.OCR.Language.Portuguese
dotnet add package XImage.OCR.Language.ChineseSimplified
dotnet add package XImage.OCR.Language.ChineseTraditional
dotnet add package XImage.OCR.Language.Japanese
# 10 languages = 11 package commands
SHELL

代码本身也体现了同样的复杂性。 设置多语言 OCR 需要所有语言包都已安装——该库无法在编译时验证这一点:

// XImage.OCR: Language codes must match installed packages exactly
// If XImage.OCR.Language.German is not installed, this fails at runtime

var ocrHandler = new OCRHandler();

// 许可证激活 required before any OCR operation
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-license-key");

// Set multiple languages — each requires its own NuGet package installed
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };

string result = ocrHandler.Process(imagePath);
// XImage.OCR: Language codes must match installed packages exactly
// If XImage.OCR.Language.German is not installed, this fails at runtime

var ocrHandler = new OCRHandler();

// 许可证激活 required before any OCR operation
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-license-key");

// Set multiple languages — each requires its own NuGet package installed
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };

string result = ocrHandler.Process(imagePath);
' XImage.OCR: Language codes must match installed packages exactly
' If XImage.OCR.Language.German is not installed, this fails at runtime

Dim ocrHandler As New OCRHandler()

' 许可证激活 required before any OCR operation
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-license-key")

' Set multiple languages — each requires its own NuGet package installed
ocrHandler.Languages = New String() {"eng", "deu", "fra", "spa", "ita"}

Dim result As String = ocrHandler.Process(imagePath)
$vbLabelText   $csharpLabel

如果缺少语言包或语言包版本错误,则故障发生在运行时 OCR 调用期间,而不是在编译时或包恢复期间。 在部署流程中,这意味着在生产环境或预生产环境中发现问题,而不是在开发人员的机器上发现问题。

IronOCR方法

IronOCR以单个软件包的形式安装。 默认情况下,系统会提供对常用西方语言的语言支持; 其他语言包以可选软件包的形式安装,遵循相同的单包模式,但您是从一个正常工作的状态开始,而不是从一个损坏的状态开始:

# IronOCR: Install everything in one command
dotnet add package IronOcr
# English included. Add specific language packs only when needed.
dotnet add package IronOcr.Languages.German
# IronOCR: Install everything in one command
dotnet add package IronOcr
# English included. Add specific language packs only when needed.
dotnet add package IronOcr.Languages.German
SHELL

多语言OCR代码使用类型安全的OcrLanguage枚举值,而非字符串代码,从而消除因语言标识符键入错误而产生的运行时错误。

// IronOCR: Type-safe languages, single package
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("multilingual-document.jpg");
Console.WriteLine(result.Text);
// IronOCR: Type-safe languages, single package
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("multilingual-document.jpg");
Console.WriteLine(result.Text);
Imports IronOcr

' IronOCR: Type-safe languages, single package
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("multilingual-document.jpg")
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

IronTesseract 设置指南详细介绍了语言配置。 该多语言操作指南将指导您如何将主要语言和辅助语言结合起来,处理包含混合语言内容的文档。

对于一个支持10种语言的应用程序:XImage.OCR需要11个包、.csproj中1个包,另外按需提供的每种语言包。 这种差异会在各个团队之间不断放大。

预处理:原始 Tesseract 与内置流程

XImage.OCR 的主要技术限制是缺乏预处理能力。 由于该库封装了 Tesseract 而没有添加图像增强功能,因此文档质量直接限制了 OCR 质量。 这是实际部署中一个决定性的制约因素。

XImage.OCR 方法

XImage.OCR 直接将图像传递给 Tesseract。 扫描的发票存在 2 度倾斜、扫描仪噪声和 150 DPI 分辨率,将按原样处理。 OCRHandler没有图像校正的方法:

// XImage.OCR: 否 preprocessing available
// A skewed, noisy, low-DPI scan goes straight to Tesseract

var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

// Direct OCR on problematic image — skew, noise, and low resolution
// all degrade accuracy with no mitigation available in the library
string result = ocrHandler.Process(imagePath);

// To improve results, you would need:
// - External library (OpenCV.NET, ImageSharp, etc.)
// - 100-200 lines of deskew and noise-reduction code
// - Per-document-type tuning
// - Image processing expertise your OCR developer may not have
// XImage.OCR: 否 preprocessing available
// A skewed, noisy, low-DPI scan goes straight to Tesseract

var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

// Direct OCR on problematic image — skew, noise, and low resolution
// all degrade accuracy with no mitigation available in the library
string result = ocrHandler.Process(imagePath);

// To improve results, you would need:
// - External library (OpenCV.NET, ImageSharp, etc.)
// - 100-200 lines of deskew and noise-reduction code
// - Per-document-type tuning
// - Image processing expertise your OCR developer may not have
' XImage.OCR: 否 preprocessing available
' A skewed, noisy, low-DPI scan goes straight to Tesseract

Dim ocrHandler As New OCRHandler()
ocrHandler.Language = "eng"

' Direct OCR on problematic image — skew, noise, and low resolution
' all degrade accuracy with no mitigation available in the library
Dim result As String = ocrHandler.Process(imagePath)

' To improve results, you would need:
' - External library (OpenCV.NET, ImageSharp, etc.)
' - 100-200 lines of deskew and noise-reduction code
' - Per-document-type tuning
' - Image processing expertise your OCR developer may not have
$vbLabelText   $csharpLabel

变通办法是引入一个单独的图像处理库,自己编写预处理代码,并在库更新时维护该代码。 对于已经深入 RasterEdge 生态系统的团队来说,一些工具可以通过其他 RasterEdge SDK 组件获得——但这需要购买和集成额外的产品。

IronOCR方法

IronOCR在文档加载和OCR执行之间,将预处理应用为可链式方法在OcrInput上。 无需外部库:

// IronOCR: 内置预处理 pipeline
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Apply corrections in sequence
input.Deskew();              // Detect and correct rotation angle
input.DeNoise();             // Remove scanner artifacts and noise
input.Contrast();            // Enhance contrast for faded text
input.Binarize();            // Convert to clean black-and-white
input.EnhanceResolution(300); // Scale low-DPI images to 300 DPI

var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR: 内置预处理 pipeline
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Apply corrections in sequence
input.Deskew();              // Detect and correct rotation angle
input.DeNoise();             // Remove scanner artifacts and noise
input.Contrast();            // Enhance contrast for faded text
input.Binarize();            // Convert to clean black-and-white
input.EnhanceResolution(300); // Scale low-DPI images to 300 DPI

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

' IronOCR: 内置预处理 pipeline
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    ' Apply corrections in sequence
    input.Deskew()              ' Detect and correct rotation angle
    input.DeNoise()             ' Remove scanner artifacts and noise
    input.Contrast()            ' Enhance contrast for faded text
    input.Binarize()            ' Convert to clean black-and-white
    input.EnhanceResolution(300) ' Scale low-DPI images to 300 DPI

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

图像质量校正指南涵盖了所有预处理滤镜集。 对于特定方向的校正,图像方向校正指南页面旋转检测可处理多角度文档。

预处理对实际文档的影响非常显著。 Tesseract 对 150 DPI、倾斜 5 度的扫描文档进行不经预处理的扫描,精度可达 60-75%。 通过校正倾斜和提高分辨率,同一文档在 300 DPI 下,旋转校正后,准确率可达 93-97%。 XImage.OCR 无法在没有外部代码的情况下弥补这一缺陷。 IronOCR通过 5 次方法调用将其关闭。

价值主张 vs 免费 Tesseract 包装器

Tesseract 包装器的商业定价需要明确回答一个问题:购买商业产品能获得什么免费包装器无法提供的东西? 对于 XImage.OCR 来说,这个问题比想象中更难回答。

免费替代方案差距

NuGet上的 charlesw/tesseract 封装程序下载量超过 800 万次,持续维护,并采用 Apache 2.0 许可——可免费用于商业用途。 它提供的 OCR 输出与 XImage.OCR 基本相同,因为两者都调用了相同的 Tesseract 引擎。区别在于:

-语言支持:免费版 tessdata 支持 100 多种语言; XImage.OCR 支持约 15 种付费套餐 -社区: charlesw/tesseract 在 Stack Overflow 上有 3000 多个问题,并且有大量的社区文档; XImage.OCR 少于 100 个 -预处理:这两个库都没有提供内置的预处理功能——它们都直接将图像传递给 Tesseract。 -线程:两者都具有相同的线程安全约束(每个线程都需要实例)

当商业产品支持的语言较少、社区较小、预处理差距与免费替代方案相同、线程模型也相同时,除了供应商支持和 RasterEdge 生态系统集成之外,其商业价值主张就很难阐明。

IronOCR作为一种商业替代方案

IronOCR的商业定价是合理的,因为它具备 XImage.OCR 和免费封装程序都不具备的功能:自动预处理、原生 PDF 支持、线程安全设计以及跨平台部署。 $999 Lite许可证是一次性永久购买。 问题不在于商业 OCR 是否值得付费——通常情况下是值得的。 问题是,你花这些钱能得到什么。

// What theIronOCRLite license buys vs what commercial pricing buys with XImage.OCR

// IronOCR: Preprocessing, PDF, thread safety, cross-platform in one call
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-invoice.pdf");   // Native PDF — no extra SDK
input.Deskew();                          // Built-in preprocessing
input.DeNoise();                         // 否 external library needed
var result = ocr.Read(input);
result.SaveAsSearchablePdf("output.pdf"); // Searchable PDF output
Console.WriteLine($"Confidence: {result.Confidence}%");

// XImage.OCR: Same Tesseract core, no preprocessing, no PDF, not thread-safe
// Requires purchasing and integrating RasterEdge PDF SDK for PDF operations
// What theIronOCRLite license buys vs what commercial pricing buys with XImage.OCR

// IronOCR: Preprocessing, PDF, thread safety, cross-platform in one call
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-invoice.pdf");   // Native PDF — no extra SDK
input.Deskew();                          // Built-in preprocessing
input.DeNoise();                         // 否 external library needed
var result = ocr.Read(input);
result.SaveAsSearchablePdf("output.pdf"); // Searchable PDF output
Console.WriteLine($"Confidence: {result.Confidence}%");

// XImage.OCR: Same Tesseract core, no preprocessing, no PDF, not thread-safe
// Requires purchasing and integrating RasterEdge PDF SDK for PDF operations
Imports IronOcr

' What theIronOCRLite license buys vs what commercial pricing buys with XImage.OCR

' IronOCR: Preprocessing, PDF, thread safety, cross-platform in one call
Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadPdf("scanned-invoice.pdf")   ' Native PDF — no extra SDK
    input.Deskew()                         ' Built-in preprocessing
    input.DeNoise()                        ' 否 external library needed
    Dim result = ocr.Read(input)
    result.SaveAsSearchablePdf("output.pdf") ' Searchable PDF output
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using

' XImage.OCR: Same Tesseract core, no preprocessing, no PDF, not thread-safe
' Requires purchasing and integrating RasterEdge PDF SDK for PDF operations
$vbLabelText   $csharpLabel

从图像中读取文本教程C# Tesseract OCR 指南记录了全部功能集。 对于正在评估为什么IronOCR比基本的 Tesseract 封装器更可取的团队,专门的"为什么选择IronOCR而不是 Tesseract"页面详细介绍了技术差异。

PDF处理

PDF OCR 是 XImage.OCR 和IronOCR在架构上的差距在运营成本方面最为显著的地方。

XImage.OCR 方法

XImage.OCR 本身并不支持处理 PDF 文件。 该工作流程需要使用 RasterEdge PDF SDK(需单独购买)将 PDF 页面渲染成图像,然后 XImage.OCR 通过临时文件一次处理一页:

// XImage.OCR: PDF requires RasterEdge PDF SDK (additional purchase)
// Workflow: PDF -> render to image -> temp file -> OCR -> delete temp file

var pdfDocument = new PDFDocument(pdfPath); // Requires separate RasterEdge SDK

var results = new System.Text.StringBuilder();
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    // Render PDF page to image at 200 DPI
    var pageImage = pdfDocument.RenderPage(i, 200);

    string tempPath = Path.GetTempFileName() + ".png";
    pageImage.Save(tempPath);

    try
    {
        string pageText = ocrHandler.Process(tempPath);
        results.AppendLine($"--- Page {i + 1} ---");
        results.AppendLine(pageText);
    }
    finally
    {
        File.Delete(tempPath); // Manual cleanup required
    }
}

return results.ToString();
// XImage.OCR: PDF requires RasterEdge PDF SDK (additional purchase)
// Workflow: PDF -> render to image -> temp file -> OCR -> delete temp file

var pdfDocument = new PDFDocument(pdfPath); // Requires separate RasterEdge SDK

var results = new System.Text.StringBuilder();
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    // Render PDF page to image at 200 DPI
    var pageImage = pdfDocument.RenderPage(i, 200);

    string tempPath = Path.GetTempFileName() + ".png";
    pageImage.Save(tempPath);

    try
    {
        string pageText = ocrHandler.Process(tempPath);
        results.AppendLine($"--- Page {i + 1} ---");
        results.AppendLine(pageText);
    }
    finally
    {
        File.Delete(tempPath); // Manual cleanup required
    }
}

return results.ToString();
Imports System.Text
Imports System.IO

' XImage.OCR: PDF requires RasterEdge PDF SDK (additional purchase)
' Workflow: PDF -> render to image -> temp file -> OCR -> delete temp file

Dim pdfDocument As New PDFDocument(pdfPath) ' Requires separate RasterEdge SDK

Dim results As New StringBuilder()
Dim ocrHandler As New OCRHandler()
ocrHandler.Language = "eng"

For i As Integer = 0 To pdfDocument.PageCount - 1
    ' Render PDF page to image at 200 DPI
    Dim pageImage = pdfDocument.RenderPage(i, 200)

    Dim tempPath As String = Path.GetTempFileName() & ".png"
    pageImage.Save(tempPath)

    Try
        Dim pageText As String = ocrHandler.Process(tempPath)
        results.AppendLine($"--- Page {i + 1} ---")
        results.AppendLine(pageText)
    Finally
        File.Delete(tempPath) ' Manual cleanup required
    End Try
Next

Return results.ToString()
$vbLabelText   $csharpLabel

这种模式引入了临时文件管理、显式清理以及对第二个商业产品的依赖。 此模式下的 200 DPI 渲染目标也低于 Tesseract 精度最佳的 300 DPI 阈值,这进一步影响了质量。 使用 XImage.OCR 进行 PDF 工作流程的团队实际上是在为两个产品付费,而其他产品只需一个就能完成相同的功能。

IronOCR方法

IronOCR可直接处理 PDF 文件。 无需中间步骤,无需临时文件,无需第二个SDK:

// IronOCR: Native PDF input, no extra dependencies
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

using var input = new OcrInput();
input.LoadPdf("scanned-invoice.pdf");  // Direct PDF loading
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
Console.WriteLine(result.Text);
// IronOCR: Native PDF input, no extra dependencies
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

using var input = new OcrInput();
input.LoadPdf("scanned-invoice.pdf");  // Direct PDF loading
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
Console.WriteLine(result.Text);
Imports IronOcr

' IronOCR: Native PDF input, no extra dependencies
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Using input As New OcrInput()
    input.LoadPdf("scanned-invoice.pdf")  ' Direct PDF loading
    Dim result = New IronTesseract().Read(input)
    result.SaveAsSearchablePdf("searchable-output.pdf")
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

受密码保护的PDF文件增加了一个参数:

using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Imports IronOcr

Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password: "secret")
    Dim result = New IronTesseract().Read(input)
End Using
$vbLabelText   $csharpLabel

PDF 输入指南涵盖多页 PDF、页面范围选择和 DPI 配置。 可搜索的PDF指南文档提供了输出选项。 对于构建文档归档流程的团队而言, C# 中的 PDF OCR 用例页面涵盖了完整的工作流程。

API 映射参考

XImage.OCR IronOCR当量 备注
new OCRHandler() new IronTesseract() 主OCR类
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") IronOcr.License.LicenseKey = "key" 许可证激活
ocrHandler.Language = "eng" ocr.Language = OcrLanguage.English 类型安全的枚举与字符串
ocrHandler.Languages = new[] { "eng", "deu" } ocr.AddSecondaryLanguage(OcrLanguage.German) 多语言
ocrHandler.Process(imagePath) ocr.Read("image.jpg").Text 核心OCR操作
ocrHandler.ProcessRegion(path, rect) input.LoadImage(path, new CropRectangle(x, y, w, h)) 基于区域的OCR
ocrHandler.SetVariable("tessedit_char_whitelist", "0123456789") ocr.Configuration.WhiteListCharacters = "0123456789" 字符过滤
result.Text result.Text 原始文本输出
result.MeanConfidence result.Confidence 置信度百分比
没有等效物 result.Words / result.Lines / result.Pages 结构化结果
没有等效物 input.Deskew() 内置预处理
没有等效物 input.DeNoise() 内置预处理
没有等效物 input.EnhanceResolution(300) 内置预处理
需要 RasterEdge PDF SDK input.LoadPdf(pdfPath) 原生 PDF 输入
需要 RasterEdge PDF SDK result.SaveAsSearchablePdf("out.pdf") 可搜索的 PDF 输出
每线程OCRHandler实例 单个IronTesseract实例 螺纹安全模型

当团队考虑从 XImage.OCR 迁移到IronOCR时

软件包管理已成为维护负担

最初只有两到三种 XImage.OCR 语言包的团队,在应用程序扩展到 8 到 10 种语言时,往往会遇到一个转折点。 项目文件现在有 9-11 个包引用,都需要进行版本同步。 一位只更新了核心软件包的开发者悄悄地破坏了所有语言的OCR功能。 CI/CD 流水线间歇性失败,原因是软件包缓存恢复了旧的语言包。 现阶段,版本同步开销超过了按语言打包所带来的任何价值,因此合并为单一软件包解决方案就成了显而易见的架构决策。

实际文档质量需要预处理

团队在使用 XImage.OCR 对受控的高质量扫描件进行测试时,最初不会遇到任何准确性问题。 当文档流程扩展时,问题就出现了——移动照片上传、旧版档案扫描、传真文档、手写表格并以 1​​50 DPI 扫描。 如果不进行预处理,无论使用哪种封装器,Tesseract 对这些输入的精度都很差。 团队随后面临一个选择:构建和维护自己的预处理库集成,或者转向内置预处理功能的解决方案。IronOCR内置的去斜、降噪和分辨率增强功能完全消除了对外部的依赖,无需 OCR 开发人员具备图像处理专业知识即可提高准确性。

PDF 工作流程需要购买第二个 SDK

当团队的文档处理流程从图像文件扩展到 PDF 时(这是文档处理应用程序最常见的升级路径),XImage.OCR 将迫使团队购买第二个 RasterEdge 产品。 PDF SDK 需要单独的商业许可。 为 OCR 支付商业价格的团队并没有为第二个商业许可证做预算,以使 OCR 能够在Enterprise环境中最常见的文档格式上运行。IronOCR的原生 PDF 支持从一开始就消除了这种担忧,而PDF OCR 示例则准确地展示了集成是多么直接。

跨平台部署成为一项必要条件

当需要在Linux或MacOS开发环境中进行容器化部署时,XImage.OCR 以视窗为主的架构就成了一个硬性限制。 现代.NET开发团队使用多克进行本地开发,并部署到基于Linux的容器基础设施。 仅限视窗系统的 OCR 库无法参与该协议栈。 IronOCR支持 Windows、Linux、macOS 和 Docker,无需任何配置更改——Docker部署指南Linux 部署指南详细介绍了设置过程。

线程安全限制了服务器应用程序的吞吐量

服务器应用程序中的 OCR、处理批量作业或处理并发 HTTP 请求都需要多线程。 XImage.OCR 的线程处理模型意味着每个并发线程都会加载自己的 Tesseract 引擎实例,每个线程每种语言消耗 40-100MB 内存。 一个 4 线程服务器处理 5 种语言的文档,仅 OCR 处理程序实例就大约需要加载 900MB–1.2GB 的空间。IronOCR的线程安全设计在所有线程之间共享一个实例——该单个实例处理并发请求,而不会增加内存消耗。 生产环境中遇到内存或吞吐量瓶颈的团队通常会发现,根本原因在于这种架构差异。

常见迁移注意事项

将 OCRHandler 替换为 IronTesseract

主要代码替换很简单。 用OcrInput中包裹图像加载。 许可证激活从IronOcr.License.LicenseKey静态属性中,可以从环境变量中设置以确保部署安全:

// Before: XImage.OCR
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-key");
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string text = ocrHandler.Process(imagePath);

// After: IronOCR
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
string text = result.Text;
// Before: XImage.OCR
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-key");
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string text = ocrHandler.Process(imagePath);

// After: IronOCR
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
string text = result.Text;
Imports System
Imports IronOcr

' Before: XImage.OCR
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-key")
Dim ocrHandler As New OCRHandler()
ocrHandler.Language = "eng"
Dim text As String = ocrHandler.Process(imagePath)

' After: IronOCR
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage(imagePath)
    Dim result = ocr.Read(input)
    text = result.Text
End Using
$vbLabelText   $csharpLabel

完整的图像输入指南涵盖所有输入类型:文件路径、字节数组、流和 URL。

添加预处理步骤(之前没有)

从 XImage.OCR 迁移过来的团队可以立即有机会添加以前无法实现的预处理功能。 这次迁移不仅仅是类名的交换——它提供了一个机会来修复那些因为没有更好的选择而被默默接受的准确性问题。 加载完输入内容后,添加适合您文档类型的筛选器:

using var input = new OcrInput();
input.LoadImage(imagePath);

// Add these lines immediately after loading — no other changes needed
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
using var input = new OcrInput();
input.LoadImage(imagePath);

// Add these lines immediately after loading — no other changes needed
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage(imagePath)

    ' Add these lines immediately after loading — no other changes needed
    input.Deskew()
    input.DeNoise()
    input.EnhanceResolution(300)

    Dim result = New IronTesseract().Read(input)
End Using
$vbLabelText   $csharpLabel

图像滤镜教程提供了针对特定文档质量问题应应用哪些滤镜的指导。 仅对质量不稳定的文档应用预处理——清晰的高分辨率扫描件无法从预处理中获益,而且额外的步骤还会增加处理时间。

简化包裹清单

从项目中移除所有 XImage.OCR 包。 对于安装了多种语言的应用程序来说,软件包卸载是整个过程中耗时最长的部分:

# Remove all XImage.OCR packages
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# ... remove all language packages

# Add IronOCR
dotnet add package IronOcr
# Remove all XImage.OCR packages
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# ... remove all language packages

# Add IronOCR
dotnet add package IronOcr
SHELL

更新 CI/CD 流水线,移除多次恢复操作,并简化软件包依赖关系验证步骤。 版本同步逻辑(如果是自动化的)可以完全删除。

处理基于区域的OCR

XImage.OCR通过ProcessRegion(imagePath, rectangle)公开区域处理。 IronOCR通过在输入加载时传递CropRectangle来处理此问题:

//IronOCRregion-based OCR
var region = new CropRectangle(x: 0, y: 0, width: 600, height: 100);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var text = new IronTesseract().Read(input).Text;
//IronOCRregion-based OCR
var region = new CropRectangle(x: 0, y: 0, width: 600, height: 100);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var text = new IronTesseract().Read(input).Text;
Imports IronOcr

Dim region As New CropRectangle(x:=0, y:=0, width:=600, height:=100)
Using input As New OcrInput()
    input.LoadImage("invoice.jpg", region)
    Dim text As String = New IronTesseract().Read(input).Text
End Using
$vbLabelText   $csharpLabel

基于区域的 OCR 指南区域裁剪示例记录了发票和表格等固定布局文档的处理方法。

其他IronOCR功能

除了核心对比点之外, IronOCR还提供了一些 XImage.OCR 所不具备的功能:

-异步 OCR为ASP.NET应用程序在请求管道中处理文档时提供非阻塞式 OCR 执行。 -特殊文档类型专为护照、车牌、MICR支票和手写识别而设计的处理流程 -速度优化在精度要求允许的情况下,针对吞吐量优化配置方案,涵盖页面分段模式和引擎模式选择。 -多帧 TIFF 处理一次调用即可读取多页 TIFF 文件的所有帧,并逐页显示结果——无需手动逐帧迭代

  • NuGet包可在NuGet上获取,具有完整的版本控制和标准包管理工具

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

IronOCR 的目标框架为.NET 6、 .NET 7、 .NET 8 和.NET 9,同时积极支持.NET Standard 2.0 和.NET Framework 4.6.2+,以实现与旧版项目的兼容性。 该库提供跨平台运行时二进制文件,无需条件编译或平台特定的打包,即可在 Windows、Linux 和MacOS上以完全相同的方式运行。 XImage.OCR 的目标框架是.NET Standard 2.0 和.NET Framework 4.5+,这保留了旧版兼容性,但无法有效地扩展到现代部署环境——Docker 容器化、基于Linux的云基础设施和MacOS开发都在测试支持范围之外。 IronOCR会定期更新,与.NET 的发布节奏保持一致,而且其单包架构意味着兼容性更新可以统一应用于各种语言和功能,而无需像 XImage.OCR 的碎片化模型那样进行逐包协调。

结论

XImage.OCR 与其他商业 Tesseract 封装库一样,存在着同样的根本性缺陷:它对基于免费技术的托管层收费,却没有明确区分免费封装库本身提供的功能。碎片化的语言包模型加剧了这一问题,带来了实际的运维开销——例如,一个支持 10 种语言的应用需要 11 个软件包进行版本同步,CI/CD 故障点从 1 个增加到 11 个,并且语言覆盖范围也仅限于 15 种左右,而免费的 Tesseract 发行版则包含 100 多种语言。 已经融入 RasterEdge 生态系统的团队有充分的理由使用 XImage.OCR; 如果团队将其作为独立的 OCR 解决方案进行独立评估,他们将很难证明其商业定价的合理性。

预处理是技术差异最明显的体现。实际文档——扫描分辨率不一、拍摄角度略有偏差、打印设备老旧——都需要进行图像校正,OCR才能产生可​​靠的识别结果。 XImage.OCR 不提供预处理功能。 要对这些输入数据达到可接受的精度,需要编写和维护外部图像处理代码。 IronOCR通过五个方法调用即可处理此问题,且无需任何外部依赖。

PDF 支持和跨平台部署是 XImage.OCR 架构造成成本累积的两个场景。 PDF 处理需要再次购买 RasterEdge 商业版。 不支持Linux和Docker部署。 对于有以下任一需求的团队(现代Enterprise.NET开发通常两者都有), IronOCR在功能上是匹配的,而 XImage.OCR 需要架构上的变通方案,这会增加成本和复杂性。

对于目前使用 XImage.OCR 的团队来说,主要的决定因素是 RasterEdge 生态系统是否值得他们为此付出代价。 对于首次选择 OCR 库的团队而言,IronOCR 的单一软件包模式、内置预处理、原生 PDF 支持和跨平台运行时,以相当的价格提供了更完整的商业产品。

请注意Tesseract 和 xImage.OCR 是各自所有者的注册商标。 本网站与 Google 或 RasterEdge 无关、不被其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

xImage.OCR是什么?

xImage.OCR 是一款 OCR 解决方案,开发者和企业使用它从图像和文档中提取文本。它是与 IronOCR 一起评估的几种适用于 .NET 应用程序开发的 OCR 方案之一。

对于 .NET 开发人员来说,IronOCR 与 xImage.OCR 相比有何不同?

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

IronOCR 比 xImage.OCR 更容易设置吗?

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

xImage.OCR 和 IronOCR 在准确率方面存在哪些差异?

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

IronOCR是否支持PDF文本提取?

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

xImage.OCR 的授权许可与 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 安装程序。

与 xImage.OCR 不同,IronOCR 是否适用于 Docker 和容器化部署?

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

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

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

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

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

从 xImage.OCR 迁移到 IronOCR 容易吗?

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

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

钢铁支援团队

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