從 Aspose.OCR 遷移到 IronOCR
這個指南為 .NET 開發者提供了從 Aspose.OCR 遷移到 IronOCR 的完整過程。 它涵蓋了包交換、命名空間更改、授權初始化以及四個具體的程式碼遷移範例,這些範例來自於實際的 Aspose.OCR 使用模式——識別設置配置、區域檢測模式、使用信任度過濾的批量識別和結構化輸出處理。 每個範例都會同時顯示 Aspose.OCR 方法和IronOCR的對應方法,使您能夠無需猜測地翻譯現有的程式碼。
為什麼要從 Aspose.OCR 遷移
團隊離開 Aspose.OCR 的原因聚焦在兩個壓力點上:訂閱計費模式和手動識別流程引入的配置負擔。
訂閱費用無上限地累積。 Aspose.OCR 沒有永久授權等級。 開發者小企業授權每位開發者每年 $999。 一個五人團隊續訂三年需要支付 $14,985,還沒寫一行業務邏輯。IronOCR的 Professional 等級僅需支付 $2,999 一次——相同的覆蓋範圍,永遠不需續訂。 當財務部門詢問為什麼 OCR 相依性每年更新如同 SaaS 訂閱時,數字變得不容忽視。
每次辨識呼叫都需要設置物件的儀式。 Aspose.OCR 將其配置介面分為 DetectAreasMode 和 PreprocessingFilter 集合。 在您能呼叫 RecognizeImage 之前,您需要構建一個設置物件,填充它,並顯式傳遞它。IronOCR將其合併為 .Read()。 每次呼叫的差異很小; 它累積在整個程式碼庫中。
區域檢測模式選擇是手動且具有影響的。 Aspose.OCR 揭露 DetectAreasMode 值(NONE),開發者必須為每種文件型別選擇。 在結構化表單上選錯模式會降低識別精度。IronOCR自動分析文件佈局,並揭露結構化結果——段落、行、字詞——無需事先聲明模式。
批處理需要進行手動管理。 在 Aspose.OCR 中將識別的頁面批處理保存為可搜尋的 PDF 或結構化資料文件,意味著需要將 RecognitionResult 物件累積到 List<RecognitionResult> 中,然後將該列表傳遞給 SaveMultipageDocument。 列表執行緒是您的負責。IronOCR通過單個 OcrInput 物件接受多個輸入,並生成一個包含所有頁面的 OcrResult。
輸出格式轉換涉及多個 API 介面。 在 Aspose.OCR 中導出到 JSON、XML 或純文字都需要將單獨的 SaveFormat 枚舉值傳給 SaveMultipageDocument。 在保存之前根據信任度過濾這些結果需要遍歷列表並檢查每個 RecognitionAreasConfidence 陣列。IronOCR在單個結果物件上揭露 result.Confidence 和 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;
// 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.RecognitionText
IronOCR 使用單一的 .Read() 呼叫。 配置啟用在 IronTesseract 實例上,而不是在每次呼叫的物件上觸發:
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
// 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").Text
IronOCRvs Aspose.OCR:功能比較
下表對兩個庫在遷移決策中最重要的方面進行了映射。
| 功能 | Aspose.OCR | IronOCR |
|---|---|---|
| 授權模式 | 年度訂閱(無永久選項) | 永久一次性購買 |
| 一位開發者成本 | 每年 $999 | $999 一次 |
| 10 位開發者成本 | 每年 $4,995(站點授權) | 一次性 $2,999(專業版) |
| 授權到期影響 | 不能部署新版本,無安全補丁 | 無—購買的版本無限期運行 |
| 主要的 OCR 類 | AsposeOcr |
IronTesseract |
| 需要設置物件 | 是(RecognitionSettings 或 DocumentRecognitionSettings) |
無—進階情境下可選用 OcrInput |
| 區域檢測 | 手動 DetectAreasMode 枚舉選擇 |
自動佈局分析 |
| 預處理 | 手動 PreprocessingFilter 集合 |
自動,有可選的顯式覆蓋 |
| PDF輸入 | 標準 PDF 透過 RecognizePdf() |
原生透過 .Read() 或 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、寬度、高度、信心 |
| 頁級結構化資料 | 未提供 | result.Pages,包括段落、行、字詞、字元 |
| 多語言同時支援 | 每次呼叫單一語言 | OcrLanguage.French + OcrLanguage.German |
| 包含的語言 | 主包中超過 130 種 | 125+經由NuGet語言包 |
| 條碼識別 | 不可用 | 內建(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
dotnet remove package Aspose.OCR
從NuGet安裝IronOCR:
dotnet add package IronOcr
步驟2:更新命名空間
替換所有 Aspose.OCR 命名空間導入:
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;
// 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");
// 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");
' Remove Aspose license setup
' Dim license As New Aspose.OCR.License()
' license.SetLicense("Aspose.OCR.lic")
' Add IronOCR license 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);
// 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);
// 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 實例上; 區域定位需要在載入時放置在 OcrInput 上。 DetectAreasMode 和 RecognizeSingleLine 決策由引擎自動處理。 有關基於區域的 OCR 之詳細指導,請參見 基於區域的 OCR 指南。
區域檢測模式遷移
Aspose.OCR 需要您在每次識別呼叫前選擇一個 DetectAreasMode 值。 COMBINE 合併來自不同佈局區域的文字,DOCUMENT 將圖像視為標準文件,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;
// 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).RecognitionText
IronOCR方法:
// 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}");
}
}
// 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
Next
IronOCR 完全消除了模式選擇決策。 引擎分析佈局並通過 Lines 和 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}");
// 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}");
// 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}")
result.Confidence 是一個範圍從 0 到 100 的 double。Aspose RecognitionAreasConfidence 陣列平均值以該版本而定的範圍返回 float —在遷移期間需要調整比較閾值。 信任分數指南記錄了文件驗證工作流程中的每個字、每行和整頁的信任值。 有關高容量批次模式,請參見多執行緒範例。
結構化輸出處理
Aspose.OCR 通過 SaveMultipageDocument 輸出結構化資料,並使用格式特定的 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
}
// 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
Next
IronOCR方法:
// 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}");
}
// 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 Using
IronOCR 在每頁上將字級資料作為直接的 Words 集合揭露,每字有個別的 Confidence 值。 Aspose.OCR 的 RecognitionAreasRectangles 提供區域幾何,而無法分析字級信任。 hOCR 輸出生成與消費帶有邊界盒標註輸出的工具相容的 XHTML—格式細節請參見 hOCR 輸出指南。 有關完整的結構化結果模型,OcrResult API 參考記錄了OcrResult.Line 和 OcrResult.Word 上的每個屬性。
Aspose.OCR API 到IronOCR映射參考
| Aspose.OCR | IronOCR 等效 |
|---|---|
AsposeOcr |
IronTesseract |
RecognitionSettings |
IronTesseract 上的屬性 + OcrInput |
DocumentRecognitionSettings |
OcrInput,帶有 LoadPdf() / LoadPdfPages() |
api.RecognizeImage(path, settings) |
ocr.Read(path) 或 ocr.Read(input) |
api.RecognizePdf(path, settings) |
ocr.Read(path) 或 ocr.Read(input) |
result.RecognitionText |
result.Text |
result.RecognitionAreasConfidence.Average() |
result.Confidence(單一雙精度,0-100) |
result.RecognitionAreasRectangles |
result.Words(備有 X、Y、寬度、高度、信任) |
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: 程式碼設置 settings.DetectAreasMode = DetectAreasMode.TABLE 或 DetectAreasMode.COMBINE 預期特定的佈局行為。 移除枚舉留給如何以IronOCR處理相同佈局的問題。
解決方案: 完全移除枚舉。IronOCR自動進行佈局分析。 如果您需要檢查檢測的佈局結構,請導航 result.Pages[n].Paragraphs —每個段落都帶有 X、Y、寬度、高度邊框盒及其包含的文字。 要進行顯式表格提取,請參見表格讀取指南:
// 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}");
}
// 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:RecognitionAreasConfidence 閾值不匹配
Aspose.OCR: 現有程式碼將 result.RecognitionAreasConfidence.Average() 與閾值如 0.75f 比較。IronOCR的 result.Confidence 位於不同的尺度上。
解決方案: result.Confidence 是一個 0-100 百分比。 將您的 Aspose 閾值乘以 100 以進行轉換:0.75f 變為 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}");
}
// 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}");
}
Imports IronOcr
Dim result = New IronTesseract().Read("document.jpg")
If result.Confidence >= 75.0 Then
Console.WriteLine($"High confidence result: {result.Text}")
End If
議題 3:SaveMultipageDocument JSON/XML 輸出無直接方法
Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results) 寫入帶有識別元資料的 JSON 文件。 耗用此輸出資料的團隊下游需要找到對應內容。
解決方案:IronOCR沒有 SaveFormat.Json 對應方法。 替代方法是導航 result.Pages 和 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 }));
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);
// 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());
// 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 lambda 中建立實例。
解決方案: 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}%");
});
// 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" .
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 IronOcr;替換using Aspose.OCR;和using Aspose.OCR.Models; - 在應用程式啟動時使用
IronOcr.License.LicenseKey = "key"替換new Aspose.OCR.License().SetLicense("file.lic") - 使用
new IronTesseract()替換new AsposeOcr() - 移除所有
RecognitionSettings、DocumentRecognitionSettings建構區塊 - 移除所有
DetectAreasMode枚舉參考—不需要對應 - 使用
ocr.Read(path)替換api.RecognizeImage(path, settings) - 使用
ocr.Read(path)或ocr.Read(input)並用input.LoadPdf()替換api.RecognizePdf(path, settings) - 使用
result.Text替換result.RecognitionText - 使用
result.Confidence替換result.RecognitionAreasConfidence.Average(),並將舊閾值乘以 100 - 使用
result.SaveAsSearchablePdf(path)替換api.SaveMultipageDocument(path, SaveFormat.Pdf, list) - 使用
result.Pages的直接序列化替換api.SaveMultipageDocument(path, SaveFormat.Json, list) - 將所有
PreprocessingFilter鏈條轉為OcrInput方法呼叫(參見 API 映射表) - 將
DocumentRecognitionSettings.StartPage更新為 0 基於到 1 基於(給每個值加 1) - 移除每執行緒
AsposeOcr實例化——共享單一IronTesseract實例
遷移後測試
- 在每種文件型別的代表性樣本上運行 OCR ,並將字元計數與基準 Aspose.OCR 輸出進行比較
- 驗證信任值:IronOCR 返回 0-100; 確認所有閾值比較使用新尺度
- 在一個 10+ 頁面的 PDF 上測試頁面範圍選擇,使用 1 基於頁碼,並驗證正確的頁面被返回
- 測試不安裝 Aspose.PDF 的情況下的密碼保護 PDF 輸入——確認沒有相依性異常
- 確認
result.Text與使用的每個DetectAreasMode相符的預期輸出(COMBINE、TABLE、DOCUMENT) - 測試 JSON 輸出路徑:序列化
result.Pages,並根據下游消費者驗證架構 - 運行並行批次處理器,驗證沒有執行緒處理異常(共享
IronTesseract實例) - 確認搜尋 PDF 輸出在 PDF 檢視器中開啟,且文字在正確位置可選
- 驗證在每次部署環境內(ASP.NET 啟動、Azure 功能、Docker 容器)許可金鑰皆成功初始化
- 檢查預處理過的 TIFF 輸入是否仍然通過
input.LoadImageFrames()產生預期輸出
遷移至IronOCR的主要好處
從第一天起預測可擁有的總成本。 $2,999 的專業版授權涵蓋 10 位開發者和 10 個專案,無需每年續訂。 財務部門只需關閉 OCR 項目一次。 新增工程師、啟動新項目或擴展產品生命週期的預算影響為零——無需運行許可層級數學運算,沒有續訂日期需要跟踪,且不存在因未支付而造成的合規風險。 IronOCR 許可頁面文件顯示了每個層級覆蓋範圍。
表達意圖而非基礎設施的識別呼叫。 遷移後,每次識別呼叫皆為 ocr.Read("document")。 在每次 Aspose.OCR 呼叫前的 RecognitionSettings 構建、 DetectAreasMode 選擇和 PreprocessingFilter 填充完全消失。 新工程師閱讀程式碼庫的 OCR 層時,看到的是業務目的——"讀取該文件"——而不是在實際工作開始之前組裝的設定物件。 IronTesseract API 參考涵蓋每個可用的配置屬性。
無需第二產品支持加密 PDF。 企業文件流水線通常會處理受密碼保護的 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 App Service 和 AWS Lambda 上運行。 Aspose.OCR 在各平台上工作,但在容器環境中可能需要調整原生庫。 遷移後,OCR 服務的 Dockerfile 是一個標準的 .NET 基礎映像,除包裝安裝之外無需 OCR 特定的設置步驟。 Deployment guides cover Docker, Azure, AWS, and Linux.
與 OCR 同步執行的條碼識別。 設置 ocr.Configuration.ReadBarCodes = true 從同一張圖片中擷取條碼、二維碼和 Code 128 符號,在一次引擎過程中。 Aspose.OCR 不具備條碼能力——需要單獨的條碼庫。 遷移後,混合了印刷文字及條碼的文件(運送標籤、庫存表單、事件票券)由單次呼叫透過 result.Barcodes 處理其結果。 查看條碼 OCR 指南以獲取支援的符號列表。
常見問題
我為什麼應該從Aspose.OCR for .NET遷移到IronOCR?
常見的驅動因素包括消除COM互操作複雜性、更換基於文件的許可證管理、避免按頁收費、啟用Docker/容器部署,以及採取與標準.NET工具整合的NuGet本地工作流。
從Aspose.OCR for .NET遷移到IronOCR的主要程式碼變更是什麼?
將Aspose.OCR的初始化序列替換為IronTesseract的實例化,去除COM生命周期管理(顯式的Create/Load/Close模式),並更新結果屬性名稱。結果是顯著減少樣板程式碼。
如何安裝IronOCR以開始遷移?
在套件管理器控制台中運行 'Install-Package IronOcr' 或在CLI中運行 'dotnet add package IronOcr'。語言包是單獨的包:例如 'dotnet add package IronOcr.Languages.French' 安裝法語支持。
IronOCR能否達到Aspose.OCR for .NET在標準商業文件上的OCR準確度?
IronOCR在包括發票、合同、收據和鍵入的表單等標準業務內容上達到高準確性。圖像預處理過濾器(糾偏、噪音去除、對比度增強)進一步提高了變質輸入的識別。
IronOCR如何處理Aspose.OCR for .NET獨立安裝的語言資料?
IronOCR中的語言資料分發為NuGet包。'dotnet add package IronOcr.Languages.German' 安裝德語支持。不涉及手動文件放置或目錄路徑。
從Aspose.OCR for .NET遷移到IronOCR是否需要更改部署基礎設施?
IronOCR需要的基礎設施更改比Aspose.OCR for .NET少。沒有SDK二進制路徑、授權文件位置或授權伺服器配置。NuGet包包含完整的OCR引擎,授權金鑰是一個在應用程式程式碼中設置的字串。
遷移後如何配置IronOCR許可證?
在應用啟動程式碼中分配IronOcr.License.LicenseKey = "YOUR-KEY"。在Docker或Kubernetes中,將金鑰儲存為環境變數並在啟動時讀取。在接受流量之前,使用License.IsValidLicense驗證。
IronOCR能否像Aspose.OCR一樣處理PDF?
是的。IronOCR能讀取本地和掃描的PDF。實例化IronTesseract,調用ocr.Read(input),其中input是PDF路徑或OcrPdfInput,並迭代OcrResult頁面。不需要單獨的PDF渲染管道。
IronOCR如何處理大批量處理中的多執行緒?
IronTesseract可以安全地在每個執行緒中實例化。在Parallel.ForEach或Task池中為每個執行緒建立一個實例,並發併運行OCR,當完成時處置每個實例。不需要全域狀態或鎖定。
IronOCR在文字提取後支持哪些輸出格式?
IronOCR返回結構化結果,包括文字、單詞坐標、信心分數和頁面結構。導出選項包括純文字、可搜索PDF以及下游處理的結構化結果物件。
IronOCR的價格是否比Aspose.OCR for .NET在擴展工作負載上的預測性更好?
IronOCR使用固定費率的永久性許可證,沒有按頁或按量收費。無論您處理10000頁還是1000萬頁,許可證費用保持不變。團隊和批量許可證選項可在IronOCR定價頁面上找到。
從Aspose.OCR for .NET遷移到IronOCR後,我現有的測試會發生什麼變化?
遷移後,斷言提取的文字內容的測試應繼續通過。需要更新的測試是驗證API調用模式或COM物件生命週期,這需要反映IronOCR較簡單的初始化和結果模型。

