从 Aspose.OCR 迁移到 IronOCR
本指南将引导.NET开发人员完成从 Aspose.OCR 到IronOCR 的完整迁移。 它涵盖了软件包交换、命名空间更改、许可证初始化,以及从真实的 Aspose.OCR 使用模式中提取的四个具体的代码迁移示例——识别设置配置、区域检测模式、基于置信度过滤的批量识别和结构化输出处理。 每个示例都展示了 Aspose.OCR 方法以及IronOCR 的等效方法,以便您可以无需猜测即可转换现有代码。
为什么要从 Aspose.OCR 迁移?
团队离开 Aspose.OCR 的原因主要集中在两个方面:订阅计费模式和手动识别流程带来的配置负担。
订阅费用没有上限,不断累积。Aspose.OCR没有永久许可级别。 开发者小型企业许可证的价格为每位开发者每年 999 美元。 一个五人团队续约三年,在编写任何一行业务逻辑代码之前就支付了 14,985 美元。 IronOCRProfessional版套餐价格为 2,999 美元,一次性付费即可享受同样的保障,终身有效,无需续费。 当财务部门询问为什么 OCR 依赖项像 SaaS 订阅一样每年续订时,数学问题就不可避免了。
**每个识别调用都需要设置对象的仪式。**Aspose.OCR将其配置界面分为PreprocessingFilter集合。 在您调用RecognizeImage之前,您需要构建一个设置对象,填充它,然后显式传递。 IronOCR将其简化为.Read()。 每次通话的差别很小; 它会在整个代码库中累积。
**区域检测模式选择是手动且重要的。**Aspose.OCR公开NONE),开发人员必须为每种文档类型选择。 结构化表单模式错误会降低识别准确率。 IronOCR可自动分析文档布局,并显示结构化结果(段落、行、单词),而无需预先声明模式。
**批量处理需要手动管理结果列表。**在Aspose.OCR中将识别的页面批量保存为可搜索的PDF或结构化数据文件需要将SaveMultipageDocument。 邮件列表的线程管理由您负责。 IronOCR通过一个OcrResult。
**输出格式切换涉及多个API界面。**Aspose.OCR中导出到JSON,XML或纯文本每个都需要向SaveFormat枚举值。 在保存之前,通过置信度过滤这些结果需要迭代列表并检查每个RecognitionAreasConfidence数组。 IronOCR在单个结果对象上公开result.Pages——置信度过滤是一行LINQ表达式。
**IronOCR 的许可模式彻底消除了续费风险。**购买的许可证永久有效。 包含一年的更新服务; 此后,最后收到的版本继续在生产环境中运行,不会面临合规性风险。 任何情况下,错过付款都不会导致部署失败。
基本问题
Aspose.OCR 将识别配置与设置对象关联起来,每次调用时都必须构建、填充和传递该设置对象。 模式、语言、过滤器和区域策略都是该对象的属性:
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
RecognizeSingleLine = false,
AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;Imports Aspose.OCR
' Aspose.OCR: build a settings object for every recognition call
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT, ' must choose the right mode
.RecognizeSingleLine = False,
.AutoSkew = True
}
Dim result = api.RecognizeImage("form.jpg", settings)
Dim text As String = result.RecognitionTextIronOCR使用一个.Read()调用。 配置位于所需的IronTesseract实例上,而不是每个调用对象上:
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;Imports IronOcr
Dim text As String = New IronTesseract().Read("form.jpg").TextIronOCR与 Aspose.OCR:功能对比
下表从迁移决策中最关键的几个维度对这两个库进行了比较。
| 特征 | Aspose.OCR | IronOCR |
|---|---|---|
| 许可模式 | 年度订阅(无永久订阅选项) | 永久一次性购买 |
| 1-开发商成本 | 每年999美元 | 一次$999 |
| 10-开发人员成本 | 每年 4,995 美元(站点许可) | 一次性支付 2,999 美元(Professional) |
| 许可证到期后果 | 无法部署新版本,没有安全补丁 | 无——购买版本可无限期使用 |
| 小学 OCR 课程 | AsposeOcr | IronTesseract |
| 需要设置对象 | 是的(DocumentRecognitionSettings) | 否——可选OcrInput用于高级场景 |
| 区域检测 | 手动DetectAreasMode枚举选择 | 自动布局分析 |
| 预处理 | 手动PreprocessingFilter集合 | 自动运行,并可选择显式覆盖 |
| PDF 输入 | 通过RecognizePdf()的标准PDFs | 通过OcrInput.LoadPdf()的本地 |
| 受密码保护的PDF | 需要 Aspose.PDF(单独授权) | 内置Password:参数 |
| 可搜索的 PDF 输出 | SaveMultipageDocument(path, SaveFormat.Pdf, list) | result.SaveAsSearchablePdf(path) |
| 置信值 | result.RecognitionAreasConfidence.Average()(数组) | result.Confidence(单一双倍,0–100) |
| 词级结构化数据 | 通过RecognitionAreasRectangles的区域级别几何 | result.Words,包括X,Y,Width,Height,Confidence |
| 页面级结构化数据 | 未暴露 | result.Pages,包括段落,行,单词,字符 |
| 多语言同步 | 每次通话使用一种语言 | OcrLanguage.French + OcrLanguage.German |
| 包含的语言 | 主套餐包含 130 多个项目 | 通过NuGet语言包提供 125+ 种语言 |
| 条形码读取 | 不可用 | 内置(ocr.Configuration.ReadBarCodes = true) |
| 线程安全 | 建议每个线程使用一个新实例。 | 完全线程安全的单共享实例 |
| TIFF多帧 | 并非原生 | input.LoadImageFrames("file.tiff") |
| hOCR导出 | 有限的 | result.SaveAsHocrFile(path) |
| 跨平台NuGet | 是 | 是的(Windows、Linux、macOS、Docker、Azure、AWS) |
| NuGet包数量 | 1 个主要语言包 + 可选语言包 | 1 个主要语言包 + 可选语言包 |
快速入门:Aspose.OCR 到IronOCR 的迁移
步骤 1:替换 NuGet 软件包
移除 Aspose.OCR:
dotnet remove package Aspose.OCR
从NuGet安装IronOCR :
步骤 2:更新命名空间
替换所有Aspose.OCR命名空间导入:
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;Imports IronOcr步骤 3:初始化许可证
移除 Aspose 基于文件的许可证调用,并将其替换为IronOCR字符串密钥。 请将此代码放在应用程序启动时——每个进程一次,而不是每个请求一次:
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");
// AddIronOCRlicense at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
代码迁移示例
识别设置配置
Aspose.OCR将所有识别行为集中在一个RecognitionSettings对象中。 语言、区域检测模式、单行标志和阈值都作为属性存在于那里。 您需要针对每种文档类型或调用模式重新构建它。
Aspose.OCR 方法:
// Configuring recognition settings for a structured form
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT,
RecognizeSingleLine = false,
AutoSkew = true,
RecognitionAreas = new List<Rectangle>
{
new Rectangle(0, 0, 800, 100) // header zone
}
};
var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Configuring recognition settings for a structured form
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.RecognizeSingleLine = False,
.AutoSkew = True,
.RecognitionAreas = New List(Of Rectangle) From {
New Rectangle(0, 0, 800, 100) ' header zone
}
}
Dim result = api.RecognizeImage("structured-form.jpg", settings)
Console.WriteLine(result.RecognitionText)IronOCR方法:
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);
var result = ocr.Read(input);
Console.WriteLine(result.Text);Imports IronOcr
' Recognition behavior configured once on the IronTesseract instance
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
' Region targeting replaces RecognitionAreas in RecognitionSettings
Dim headerRegion As New CropRectangle(0, 0, 800, 100)
Using input As New OcrInput()
input.LoadImage("structured-form.jpg", headerRegion)
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using每次调用无需构建设置对象。 语言在IronTesseract实例上; 区域定位在加载时位于RecognizeSingleLine决策。 有关基于区域的 OCR 的详细指导,请参阅基于区域的 OCR 操作指南。
区域检测模式迁移
Aspose.OCR要求您在每个识别调用之前选择一个DetectAreasMode值。 TABLE针对网格布局进行了优化。 如果为文档类型选择了错误的模式,会导致输出错位或缺失。
Aspose.OCR 方法:
// Three separate calls with different modes for different document types
var api = new AsposeOcr();
// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.COMBINE,
Language = Language.Eng
};
// For a pure tabular document
var tableSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.TABLE,
Language = Language.Eng
};
// For a single-column text document
var linearSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.DOCUMENT,
Language = Language.Eng
};
string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;Imports AsposeOcr
' Three separate calls with different modes for different document types
Dim api As New AsposeOcr()
' For a document with mixed prose and table content
Dim docSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.COMBINE,
.Language = Language.Eng
}
' For a pure tabular document
Dim tableSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.TABLE,
.Language = Language.Eng
}
' For a single-column text document
Dim linearSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.Language = Language.Eng
}
Dim mixedResult As String = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText
Dim tableResult As String = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText
Dim linearResult As String = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionTextIronOCR方法:
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();
// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;
// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}Imports System
' Single API surface handles all layout types automatically
Dim ocr As New IronTesseract()
' Same code path for every document type
Dim mixedResult As String = ocr.Read("mixed-layout.jpg").Text
Dim tableResult As String = ocr.Read("data-table.jpg").Text
Dim linearResult As String = ocr.Read("text-document.jpg").Text
' For table documents, structured data is immediately available
Dim result = ocr.Read("data-table.jpg")
For Each page In result.Pages
For Each paragraph In page.Paragraphs
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}")
Next
NextIronOCR完全消除了模式选择的问题。 引擎分析布局,并通过Words层次结构公开结果。 读取结果指南涵盖了如何浏览文档布局解析的完整结构化结果模型。 有关特定于表的提取模式,请参阅表读取方法。
基于置信度过滤的批次识别
Aspose.OCR批处理工作流在列表中累积RecognitionResult对象。置信度过滤需要迭代该列表并在接受结果之前计算每个区域的平均值。 如果您想将多个页面输出为一个文件,必须显式管理列表并传递给SaveMultipageDocument。
Aspose.OCR 方法:
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT
};
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = api.RecognizeImage(path, settings);
// Confidence is an array of per-region values — must average manually
float avgConfidence = result.RecognitionAreasConfidence != null
? result.RecognitionAreasConfidence.Average()
: 0f;
if (avgConfidence >= 0.70f)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
}
}
// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults);
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");Imports System
Imports System.IO
Imports System.Linq
Imports Aspose.OCR
' Batch recognition with confidence filtering before output
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT
}
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of RecognitionResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = api.RecognizeImage(path, settings)
' Confidence is an array of per-region values — must average manually
Dim avgConfidence As Single = If(result.RecognitionAreasConfidence IsNot Nothing,
result.RecognitionAreasConfidence.Average(),
0.0F)
If avgConfidence >= 0.70F Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)")
End If
Next
' Save accepted pages as a single searchable PDF
If acceptedResults.Any() Then
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults)
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")IronOCR方法:
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = ocr.Read(path);
// Single confidence value — no averaging required
if (result.Confidence >= 70.0)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
}
}
// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
using var outputInput = new OcrInput();
foreach (var path in documentPaths
.Where(p => !rejectedPaths.Contains(p)))
{
outputInput.LoadImage(path);
}
var combined = ocr.Read(outputInput);
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");Imports IronTesseract
Imports System.IO
Imports System.Linq
' Batch recognition with confidence filtering using unified result model
Dim ocr As New IronTesseract()
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of OcrResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = ocr.Read(path)
' Single confidence value — no averaging required
If result.Confidence >= 70.0 Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)")
End If
Next
' Save accepted pages — each result becomes a page in the output PDF
If acceptedResults.Any() Then
Using outputInput As New OcrInput()
For Each path In documentPaths.Where(Function(p) Not rejectedPaths.Contains(p))
outputInput.LoadImage(path)
Next
Dim combined = ocr.Read(outputInput)
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf")
End Using
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")double。Aspose float范围因版本而异——迁移期间需要调整比较阈值。 置信度评分指导文档验证工作流程中每个单词、每行和每页的置信度值。 对于大批量处理模式,请参阅 多线程示例。
结构化输出处理
Aspose.OCR通过SaveFormat枚举值输出结构化数据。 JSON输出写入机器可读文件;XML输出写入标注的文档文件。访问原始结构化数据——单词位置,行边界——需要迭代RecognitionAreasRectangles,它返回区域级别的几何信息,而不是单词级别。
Aspose.OCR 方法:
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.COMBINE
};
var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
results.Add(api.RecognizeImage(path, settings));
}
// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);
// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);
// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
var areas = result.RecognitionAreasRectangles;
if (areas != null)
{
foreach (var area in areas)
{
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
}
}
// No direct word-level collection with individual confidence values
}Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Structured output: JSON and XML via SaveMultipageDocument
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.COMBINE
}
Dim results As New List(Of RecognitionResult)()
For Each path In New String() {"page1.jpg", "page2.jpg", "page3.jpg"}
results.Add(api.RecognizeImage(path, settings))
Next
' Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results)
' Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results)
' Accessing area-level geometry (not word-level)
For Each result In results
Dim areas = result.RecognitionAreasRectangles
If areas IsNot Nothing Then
For Each area In areas
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}")
Next
End If
' No direct word-level collection with individual confidence values
NextIronOCR方法:
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");
var result = ocr.Read(input);
// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");
// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");
// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
$"{page.Confidence:F1}% confidence");
foreach (var word in page.Words)
{
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
}
}
// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}Imports IronTesseract
' Structured output: navigate a rich result object model
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("page1.jpg")
input.LoadImage("page2.jpg")
input.LoadImage("page3.jpg")
Dim result = ocr.Read(input)
' Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf")
' Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr")
' Word-level structured access — direct collection, no indirection
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " &
$"{page.Confidence:F1}% confidence")
For Each word In page.Words
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " &
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%")
Next
Next
' Paragraph-level layout for document structure analysis
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
End UsingIronOCR将单词级数据作为直接Confidence值。 Aspose.OCR的RecognitionAreasRectangles提供区域几何信息,但没有单词级置信度细分。 hOCR 导出生成的 XHTML 与使用边界框注释输出的工具兼容——有关格式详情,请参阅hOCR 导出指南。 对于完整的结构化结果模型,OcrResult API参考记录了OcrResult.Word上的每个属性。
Aspose.OCR API 到IronOCR映射参考
| Aspose.OCR | IronOCR当量 |
|---|---|
AsposeOcr | IronTesseract |
RecognitionSettings | 在IronTesseract + OcrInput上的属性 |
DocumentRecognitionSettings | LoadPdf() / LoadPdfPages() |
api.RecognizeImage(path, settings) | ocr.Read(input) |
api.RecognizePdf(path, settings) | ocr.Read(input) |
result.RecognitionText | result.Text |
result.RecognitionAreasConfidence.Average() | result.Confidence(单一双倍,0–100) |
result.RecognitionAreasRectangles | result.Words(包括X,Y,Width,Height,Confidence) |
RecognitionResult | OcrResult |
Language.Eng | OcrLanguage.English |
DetectAreasMode.COMBINE | 自动——无需枚举 |
DetectAreasMode.TABLE | 自动——使用result.Pages[n].Paragraphs进行布局 |
DetectAreasMode.DOCUMENT | 自动——引擎处理布局分析 |
settings.RecognizeSingleLine = true | ocr.Configuration.WhiteListCharacters或单一区域裁剪 |
settings.RecognitionAreas = new List<Rectangle> { r } | input.LoadImage(path, cropRectangle) |
settings.AutoSkew = true | 自动或显式input.Deskew() |
PreprocessingFilter.AutoSkew() | input.Deskew() |
PreprocessingFilter.AutoDenoising() | input.DeNoise() |
PreprocessingFilter.ContrastCorrectionFilter() | input.Contrast() |
PreprocessingFilter.Binarize() | input.Binarize() |
PreprocessingFilter.Threshold(value) | input.Binarize()(自动阈值) |
PreprocessingFilter.Median() | input.DeNoise() |
PreprocessingFilter.Scale(factor) | input.Scale(percent) |
PreprocessingFilter.Invert() | input.Invert() |
PreprocessingFilter.Rotate(angle) | input.Rotate(angle) |
api.SaveMultipageDocument(path, SaveFormat.Pdf, list) | result.SaveAsSearchablePdf(path) |
api.SaveMultipageDocument(path, SaveFormat.Docx, list) | 通过hOCR导出:result.SaveAsHocrFile(path) |
api.SaveMultipageDocument(path, SaveFormat.Json, list) | 导航result.Pages并直接序列化 |
api.PreprocessImage(path, filters) | input.GetPages()[0].SaveAsImage(path) |
api.CalculateSkew(imagePath) | input.Deskew()(自动应用检测到的角度) |
new Aspose.OCR.License().SetLicense("file.lic") | IronOcr.License.LicenseKey = "key" |
settings.ThreadsCount = n | 默认情况下线程安全; 使用Parallel.ForEach |
常见迁移问题和解决方案
问题 1:DetectAreasMode 没有直接等效项
**Aspose.OCR:**代码设置DetectAreasMode.COMBINE,期望特定的布局行为。 移除枚举后, IronOCR如何处理相同的布局就成了一个问题。
**解决方法:**完全移除枚举类型。 IronOCR可自动执行布局分析。 如果您需要检查检测到的布局结构,请导航result.Pages[n].Paragraphs——每个段落都有一个X,Y,Width,Height边界框和它包含的文本。 有关显式表格提取方法,请参阅表格读取操作指南:
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}Imports IronTesseract
Dim result = New IronTesseract().Read("data-table.jpg")
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next问题 2:识别区域置信度阈值不匹配
**Aspose.OCR:**现有代码将0.75f等阈值比较。 IronOCR的result.Confidence位于不同的尺度。
解决方案:result.Confidence是0–100百分比。 将您的Aspose阈值乘以100进行转换:75.0。 然后更新所有比较逻辑:
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
//IronOCRequivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
Console.WriteLine($"High confidence result: {result.Text}");
}
问题 3:SaveMultipageDocument JSON/XML 输出没有直接方法
Aspose.OCR:api.SaveMultipageDocument("out.json", SaveFormat.Json, results)写入一个带有识别元数据的JSON文件。 下游团队需要找到等效的输出结果。
**解决方案:**IronOCR没有等效于SaveFormat.Json的方法。 替代方法是导航System.Text.Json进行序列化。 这样您就可以完全控制架构:
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);
// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
PageNumber = p.PageNumber,
Confidence = p.Confidence,
Text = p.Text,
Words = p.Words.Select(w => new
{
Text = w.Text,
X = w.X,
Y = w.Y,
Width = w.Width,
Height = w.Height,
Confidence = w.Confidence
}).ToArray()
}).ToArray();
File.WriteAllText("output.json",
System.Text.Json.JsonSerializer.Serialize(pageData,
new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));Imports IronOcr
Imports System.IO
Imports System.Text.Json
Using input As New OcrInput()
input.LoadImage("document.jpg")
Dim result = New IronTesseract().Read(input)
' Build your own structured JSON from the result model
Dim pageData = result.Pages.Select(Function(p) New With {
.PageNumber = p.PageNumber,
.Confidence = p.Confidence,
.Text = p.Text,
.Words = p.Words.Select(Function(w) New With {
.Text = w.Text,
.X = w.X,
.Y = w.Y,
.Width = w.Width,
.Height = w.Height,
.Confidence = w.Confidence
}).ToArray()
}).ToArray()
File.WriteAllText("output.json",
JsonSerializer.Serialize(pageData,
New JsonSerializerOptions With {.WriteIndented = True}))
End Using对于包含可嵌入坐标的XHTML输出,后端工具可以解析,result.SaveAsHocrFile("output.hocr")是更接近语义等效的。
问题 4:DocumentRecognitionSettings.StartPage 使用从 0 开始的索引
Aspose.OCR:DocumentRecognitionSettings.StartPage = 2意味着第三页(从0开始)。 这是 Aspose 到IronOCR迁移中最常见的差一错误。
解决方案: IronOCR全程采用基于 1 的页面索引。 请为每个StartPage值加1,并相应地重新计算结束页面。 针对已知的多页 PDF 编写有针对性的测试,以便在生产环境出现问题之前将其发现:
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };
// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);Imports IronOcr
' Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
' Dim settings As New DocumentRecognitionSettings With {.StartPage = 2, .PagesNumber = 3}
' IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
Using input As New OcrInput()
input.LoadPdfPages("document.pdf", 3, 5)
Dim result = New IronTesseract().Read(input)
End Using问题 5:RecognizeSingleLine 没有直接标志
Aspose.OCR:settings.RecognizeSingleLine = true指示引擎将整个图像视为单一文本行。这用于标签识别、字段提取和其他固定格式输入。
**解决方案:**使用CropRectangle精确隔离文本行,这可以防止引擎在单行映像上运行完整的布局检测。 对于机器可读区域或标签格式,阅读特定文档指南涵盖了相应的正确方法:
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };
// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());Imports IronOcr
Dim lineRegion As New CropRectangle(10, 45, 600, 30) ' x, y, width, height
Using input As New OcrInput()
input.LoadImage("label.jpg", lineRegion)
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text.Trim())
End Using问题6: 不需要每线程Aspose.OCR实例
**Aspose.OCR:**文档建议为每个线程创建一个新的AsposeOcr()实例,以避免并行处理中的线程安全问题。 现有代码在Parallel.ForEach lambdas内创建实例。
解决方案:IronTesseract是线程安全的。 单个实例可处理并行工作负载。 取消每个线程的实例化,共享一个实例:
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });
// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();
Parallel.ForEach(documentPaths, path =>
{
var result = ocr.Read(path);
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});Imports System.IO
Imports IronOcr
Imports System.Threading.Tasks
Dim ocr As New IronTesseract()
Parallel.ForEach(documentPaths, Sub(path)
Dim result = ocr.Read(path)
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%")
End Sub)Aspose.OCR 迁移检查清单
迁移前任务
审核代码库中所有 Aspose.OCR 引用:
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
按类别记录每次发生的情况:识别调用、设置对象、预处理管道、输出调用和许可证初始化。 注意所使用的DetectAreasMode值——这些决定了适用哪个布局迁移路径。 记录所有SaveFormat枚举值——每个非PDF格式都需要上面问题3中的自定义序列化方法。
代码迁移
- 从解决方案中的所有项目中移除
Aspose.OCRNuGet包 - 在所有项目中安装
IronOcrNuGet包 - 用
using Aspose.OCR.Models; - 在应用程序启动时用
new Aspose.OCR.License().SetLicense("file.lic") - 用
new AsposeOcr() - 移除所有
DocumentRecognitionSettings构造块 - 移除所有
DetectAreasMode枚举引用——不需要等效项 - 用
api.RecognizeImage(path, settings) - 用
input.LoadPdf() - 用
result.RecognitionText - 用
result.RecognitionAreasConfidence.Average()并将旧阈值乘以100 - 用
api.SaveMultipageDocument(path, SaveFormat.Pdf, list) - 用
api.SaveMultipageDocument(path, SaveFormat.Json, list) - 将所有
OcrInput方法调用(参见API映射表) - 将
DocumentRecognitionSettings.StartPage从0基更新为以1为基(每个值加1) - 移除每个线程的
IronTesseract实例
迁移后测试
- 对生产环境中每种文档类型的代表性样本运行 OCR,并将字符计数与 Aspose.OCR 的基线输出进行比较。
- 验证置信度值: IronOCR返回 0–100; 请确认所有阈值比较均使用新标度。
- 使用从 1 开始的页码,对包含 10 页以上内容的 PDF 文件进行页面范围选择测试,并验证是否返回了正确的页面。
- 在未安装 Aspose.PDF 的情况下测试受密码保护的 PDF 文件导入功能 — 确认无依赖项异常
- 确认
DetectAreasMode(COMBINE, TABLE, DOCUMENT)的预期输出 - 测试JSON输出路径:序列化
result.Pages并针对所有下游使用者验证架构 - 运行并行批处理处理器并验证没有线程异常(共享
IronTesseract实例) - 确认可搜索的 PDF 输出文件能在 PDF 查看器中打开,并且文本在正确的位置可选中。
- 验证许可证密钥在每个部署环境(ASP.NET启动、Azure 函数、Docker 容器)中初始化是否无错误
- 检查预处理的TIFF输入是否仍会通过
input.LoadImageFrames()产生预期输出
迁移到IronOCR的主要优势
从一开始,总拥有成本就可预测。2,999美元的Professional许可证涵盖 10 个开发人员,可用于 10 个项目,无需每年续费。 财务部门只需关闭一次 OCR 项目即可。 增加工程师、启动新项目或延长产品生命周期对预算的影响为零——无需进行许可级别计算,无需跟踪续订日期,也无需承担因错过付款而产生的合规风险。 IronOCR许可页面详细说明了每个级别涵盖的内容。
**表示意图而不是基础设施的识别调用。**迁移后,每个识别调用都是ocr.Read("document")。 每个Aspose.OCR调用前的PreprocessingFilter填充全部消失。 新工程师在阅读代码库的 OCR 层时,看到的是业务意图——"阅读此文档"——而不是在实际工作开始之前组装的配置对象。 IronTesseract API 参考文档涵盖了所有可用的配置属性。
**无需额外产品即可支持加密 PDF。**Enterprise文档处理流程通常会处理受密码保护的 PDF 文件。 迁移后,input.LoadPdf("doc.pdf", Password: "secret")能够原生处理它们。 无需管理 Aspose.PDF 订阅,无需维护解密到图像的管道,也无需跟踪第二个续订日期。 流程中的每个 PDF 格式都使用同一个软件包、一个许可证和一个代码路径。 PDF 输入操作指南涵盖页面范围、非连续选择和流式输入。
词汇和字符级的结构化结果数据。result.Pages[n].Words返回一个集合,其中每个单词都有其边界框、文本和单独的置信度评分。 Aspose.OCR 的区域级几何形状覆盖的是区域,而不是单个标记。 迁移后,文档布局解析器、表单字段提取器和发票处理管道无需额外的处理步骤即可访问逐字定位。 请参阅OCR 结果功能页面,了解完整的结果层级结构。
IronOCR以单个NuGet包的形式发布,无需平台特定的配置即可在 Windows、Linux、macOS、Docker、Azure 应用服务和 AWS Lambda 上运行。 Aspose.OCR 可跨平台运行,但在容器环境中可能需要对原生库进行调整。 迁移后,OCR 服务的 Dockerfile 是一个标准的.NET基础镜像,除了软件包安装之外,没有其他 OCR 特定的设置步骤。 部署指南涵盖Docker 、 Azure 、 AWS和Linux 。
**在与OCR相同的过程中读取条码。**设置ocr.Configuration.ReadBarCodes = true从同一图像中提取条码,QR码和Code 128符号,仅需一个引擎过程。 Aspose.OCR 不具备条形码功能——需要单独的条形码库。 迁移后,混合打印文本和条码的文档(如运输标签、库存表单、活动票证)通过单个调用处理,结果保存在result.Barcodes上。 请参阅条形码 OCR 使用指南,了解支持的符号体系。
