Migración de Aspose.OCR a IronOCR
Esta guía acompaña a los desarrolladores .NET a través de una migración completa de Aspose.OCR a IronOCR . Abarca el intercambio de paquetes, los cambios de espacio de nombres, la inicialización de la licencia y cuatro ejemplos concretos de migración de código extraídos de patrones de uso reales de Aspose.OCR: configuración de los ajustes de reconocimiento, modos de detección de áreas, reconocimiento por lotes con filtrado basado en la confianza y manejo de la salida estructurada. Cada ejemplo muestra el enfoque de Aspose.OCR junto con su equivalente en IronOCR para que pueda traducir su código existente sin tener que adivinar.
¿Por qué migrar desde Aspose.OCR?
Los motivos por los que los equipos abandonan Aspose.OCR se centran en dos puntos clave: el modelo de facturación por suscripción y la carga de configuración que supone el proceso de reconocimiento manual.
Los costos de suscripción se acumulan sin límite máximo. Aspose.OCR no tiene una licencia perpetua. La licencia para desarrolladores de pequeñas empresas cuesta 999 dólares por desarrollador al año. Un equipo de cinco personas que renueva su contrato por tres años paga 14.985 dólares antes de escribir una sola línea de lógica de negocio. El plan Professional de IronOCR cuesta 2999 dólares por única vez: la misma cobertura, para siempre, sin obligación de renovación. Las matemáticas se vuelven inevitables cuando el departamento de finanzas pregunta por qué una dependencia de OCR se renueva anualmente como una suscripción a SaaS.
Cada llamada de reconocimiento requiere una ceremonia de objetos de configuración. Aspose.OCR separa su superficie de configuración en RecognitionSettings, DocumentRecognitionSettings, DetectAreasMode, y la colección PreprocessingFilter. Antes de que puedas llamar a RecognizeImage, construyes un objeto de configuración, lo llenas y lo pasas explícitamente.IronOCR colapsa eso en .Read(). La diferencia es pequeña por llamada; Se acumula a lo largo de todo el código fuente.
La selección manual del modo de detección de área es consecuente. Aspose.OCR expone valores de DetectAreasMode (COMBINE, DOCUMENT, TABLE, NONE) que el desarrollador debe elegir para cada tipo de documento. El uso de un modo incorrecto en un formulario estructurado reduce la precisión del reconocimiento.IronOCR analiza automáticamente el diseño del documento y muestra el resultado estructurado (párrafos, líneas, palabras) sin necesidad de declarar el modo previamente.
El procesamiento por lotes requiere manejar listas de resultados a mano. Guardar un lote de páginas reconocidas como un PDF buscable o un archivo de datos estructurados en Aspose.OCR significa acumular objetos RecognitionResult en un List<RecognitionResult>, luego pasar esa lista a SaveMultipageDocument. La organización de la lista es responsabilidad suya.IronOCR acepta múltiples entradas a través de un solo objeto OcrInput y produce un OcrResult que cubre todas las páginas.
El cambio de formato de salida toca múltiples superficies de API. Exportar a JSON, XML o texto plano en Aspose.OCR requiere un valor de enumeración SaveFormat separado pasado a SaveMultipageDocument. Filtrar esos resultados por confianza antes de guardar requiere iterar la lista e inspeccionar cada matriz RecognitionAreasConfidence.IronOCR expone result.Text, result.Confidence, y result.Pages en un único objeto de resultado, el filtrado de confianza es una expresión LINQ de una línea.
El modelo de licencias de IronOCR elimina por completo el riesgo de renovación. Una licencia adquirida es suya de forma permanente. Las actualizaciones están incluidas durante un año; Posteriormente, la última versión recibida continúa funcionando en producción sin riesgos de incumplimiento normativo. No existe ningún escenario en el que un pago omitido interrumpa su implementación.
El problema fundamental
Aspose.OCR vincula la configuración de reconocimiento a un objeto de configuración que debe construirse, rellenarse y pasarse en cada llamada. El modo, el idioma, los filtros y la estrategia de área son todas propiedades de ese objeto:
// 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 utiliza una única llamada .Read(). La configuración reside en la instancia de IronTesseract cuando es necesario, no en un objeto por llamada:
// 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
IronOCR vs Aspose.OCR: Comparación de características
La tabla que aparece a continuación muestra la relación entre las dos bibliotecas en función de las dimensiones más importantes a la hora de tomar una decisión sobre la migración.
| Característica | Aspose.OCR | IronOCR |
|---|---|---|
| Modelo de licencia | Suscripción anual (sin opción perpetua) | Compra única perpetua |
| 1-costo del desarrollador | $999 al año | $999 una vez |
| Costo del desarrollador 10 | $4,995/año (Licencia de sitio) | $2,999 una sola vez (Professional) |
| Consecuencia del vencimiento de la licencia | No se pueden implementar nuevas compilaciones, no hay parches de seguridad. | Ninguno: la versión comprada funciona indefinidamente. |
| Clase OCR primaria | AsposeOcr |
IronTesseract |
| Se requiere el objeto de configuración | Sí (RecognitionSettings o DocumentRecognitionSettings) |
No — opcional OcrInput para escenarios avanzados |
| Detección de área | Selección manual de enum DetectAreasMode |
Análisis automático de la disposición |
| Preprocesamiento | Recolección manual de PreprocessingFilter |
Automático con anulación explícita opcional |
| Entrada de PDF | PDFs estándar vía RecognizePdf() |
Nativo vía .Read() o OcrInput.LoadPdf() |
| PDF protegido con contraseña | Requiere Aspose.PDF (licencia aparte). | Parámetro Password: incorporado |
| Salida en PDF con capacidad de búsqueda | SaveMultipageDocument(path, SaveFormat.Pdf, list) |
result.SaveAsSearchablePdf(path) |
| Valor de confianza | result.RecognitionAreasConfidence.Average() (matriz) |
result.Confidence (doble único, 0–100) |
| Datos estructurados a nivel de palabra | Geometría a nivel de área vía RecognitionAreasRectangles |
result.Words con X, Y, Ancho, Altura, Confianza |
| Datos estructurados a nivel de página | No expuesto | result.Pages con párrafos, líneas, palabras, caracteres |
| Multilingüe simultáneo | Un solo idioma por llamada | OcrLanguage.French + OcrLanguage.German |
| Idiomas incluidos | Más de 130 en el paquete principal | Más de 125 paquetes de idiomas NuGet |
| Lectura de BarCodes | No disponible | Incorporado (ocr.Configuration.ReadBarCodes = true) |
| Seguridad de los hilos | Se recomienda una nueva instancia por hilo. | Instancia compartida única y totalmente segura para subprocesos |
| TIFF multifotograma | No es nativo | input.LoadImageFrames("file.tiff") |
| Exportación hOCR | Limitado | result.SaveAsHocrFile(path) |
| NuGet multiplataforma | Sí | Sí (Windows, Linux, macOS, Docker, Azure, AWS) |
| Número de paquetes NuGet | 1 idioma principal + paquetes de idiomas opcionales | 1 idioma principal + paquetes de idiomas opcionales |
Inicio rápido: Migración de Aspose.OCR a IronOCR
Paso 1: Sustituir el paquete NuGet
Eliminar Aspose.OCR:
dotnet remove package Aspose.OCR
dotnet remove package Aspose.OCR
Instala IronOCR desde NuGet :
dotnet add package IronOcr
Paso 2: Actualizar los espacios de nombres
Reemplaza todas las importaciones de espacio de nombres de 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
Paso 3: Inicializar licencia
Elimine la llamada a la licencia basada en archivos de Aspose y reemplácela con la clave de cadena de IronOCR. Coloque esto al iniciar la aplicación, una vez por proceso, no una vez por solicitud:
// Remove Aspose license setup
// var license = 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");
// Remove Aspose license setup
// var license = 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");
' 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")
Ejemplos de migración de código
Configuración de los ajustes de reconocimiento
Aspose.OCR centraliza todo el comportamiento de reconocimiento en un objeto RecognitionSettings. El idioma, el modo de detección de área, el indicador de línea única y el umbral se encuentran allí como propiedades. Se construye desde cero para cada tipo de documento o patrón de llamada.
Enfoque 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)
Enfoque 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
No hay ningún objeto de configuración que crear por cada llamada. El idioma va en la instancia de IronTesseract; la orientación de la región va en OcrInput en el momento de la carga. Las decisiones de DetectAreasMode y RecognizeSingleLine son manejadas automáticamente por el motor. Para obtener instrucciones detalladas sobre el OCR basado en regiones, consulte la guía práctica sobre OCR basado en regiones .
Migración del modo de detección de área
Aspose.OCR requiere que elijas un valor de DetectAreasMode antes de cada llamada de reconocimiento. COMBINE fusiona texto de diferentes regiones de diseño, DOCUMENT trata la imagen como un documento estándar, TABLE optimiza para diseños de cuadrícula. Seleccionar el modo incorrecto para el tipo de documento provoca una salida desalineada o incompleta.
Enfoque 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
Enfoque 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 elimina por completo la decisión de selección de modo. El motor analiza el diseño y expone el resultado a través de la jerarquía Pages, Paragraphs, Lines, y Words. La guía de lectura de resultados explica cómo navegar por el modelo completo de resultados estructurados para el análisis del diseño del documento. Para conocer los patrones de extracción específicos de cada tabla, consulte la guía de lectura de tablas .
Reconocimiento de lotes con filtrado basado en la confianza
Los flujos de trabajo por lotes de Aspose.OCR acumulan objetos RecognitionResult en una lista. Filtrar por confianza requiere iterar esa lista y calcular el promedio por región antes de aceptar un resultado. La lista debe ser manejada explícitamente y pasada a SaveMultipageDocument si deseas exportar múltiples páginas como un solo archivo.
Enfoque 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}")
Enfoque 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 es un único double que va de 0 a 100. El promedio del array RecognitionAreasConfidence de Aspose devuelve un float en un rango que varía según la versión: el umbral de comparación necesita ajustes durante la migración. Las puntuaciones de confianza guían los documentos con valores de confianza por palabra, por línea y por página para los flujos de trabajo de validación de documentos. Para patrones de procesamiento por lotes de alto volumen, consulte el ejemplo de multihilo .
Manejo de salida estructurada
Aspose.OCR exporta datos estructurados a través de SaveMultipageDocument con valores de enumeración de formato específico SaveFormat. La salida JSON escribe un archivo legible por máquina; la salida XML escribe un archivo de documento anotado. Acceder a los datos estructurados crudos — posiciones de palabras, límites de líneas — requiere iterar RecognitionAreasRectangles, que devuelve la geometría al nivel de región, no al nivel de palabra.
Enfoque 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
Enfoque 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 expone datos a nivel de palabra como una colección Words directa en cada página, con valores individuales Confidence por palabra. El RecognitionAreasRectangles de Aspose.OCR proporciona geometría de región sin un desglose de confianza a nivel de palabra. La exportación hOCR genera código XHTML compatible con herramientas que procesan la salida anotada con cuadros delimitadores; consulte la guía de exportación hOCR para obtener más detalles sobre el formato. Para el modelo completo de resultado estructurado, la referencia API de OcrResult documenta cada propiedad en OcrResult.Page, OcrResult.Paragraph, OcrResult.Line, y OcrResult.Word.
Referencia de mapeo de la API de Aspose.OCR a IronOCR
| Aspose.OCR | Equivalente a IronOCR |
|---|---|
AsposeOcr |
IronTesseract |
RecognitionSettings |
Propiedades en IronTesseract + OcrInput |
DocumentRecognitionSettings |
OcrInput con LoadPdf() / LoadPdfPages() |
api.RecognizeImage(path, settings) |
ocr.Read(path) o ocr.Read(input) |
api.RecognizePdf(path, settings) |
ocr.Read(path) o ocr.Read(input) |
result.RecognitionText |
result.Text |
result.RecognitionAreasConfidence.Average() |
result.Confidence (doble único, 0–100) |
result.RecognitionAreasRectangles |
result.Words (con X, Y, Ancho, Altura, Confianza) |
RecognitionResult |
OcrResult |
Language.Eng |
OcrLanguage.English |
DetectAreasMode.COMBINE |
Automático: no se requiere enumeración |
DetectAreasMode.TABLE |
Automático — usar result.Pages[n].Paragraphs para el diseño |
DetectAreasMode.DOCUMENT |
Automático: el motor realiza el análisis de diseño. |
settings.RecognizeSingleLine = true |
ocr.Configuration.WhiteListCharacters o recorte de una sola región |
settings.RecognitionAreas = new List<Rectangle> { r } |
input.LoadImage(path, cropRectangle) |
settings.AutoSkew = true |
Automático, o input.Deskew() explícito |
PreprocessingFilter.AutoSkew() |
input.Deskew() |
PreprocessingFilter.AutoDenoising() |
input.DeNoise() |
PreprocessingFilter.ContrastCorrectionFilter() |
input.Contrast() |
PreprocessingFilter.Binarize() |
input.Binarize() |
PreprocessingFilter.Threshold(value) |
input.Binarize() (umbral automático) |
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) |
Vía exportación hOCR: result.SaveAsHocrFile(path) |
api.SaveMultipageDocument(path, SaveFormat.Json, list) |
Navegar result.Pages y serializar directamente |
api.PreprocessImage(path, filters) |
input.GetPages()[0].SaveAsImage(path) |
api.CalculateSkew(imagePath) |
input.Deskew() (aplica ángulo detectado automáticamente) |
new Aspose.OCR.License().SetLicense("file.lic") |
IronOcr.License.LicenseKey = "key" |
settings.ThreadsCount = n |
Seguro para subprocesos por defecto; usa Parallel.ForEach |
Problemas comunes de migración y soluciones
Problema 1: DetectAreasMode no tiene un equivalente directo.
Aspose.OCR: El código establece settings.DetectAreasMode = DetectAreasMode.TABLE o DetectAreasMode.COMBINE esperando un comportamiento de diseño específico. Eliminar la enumeración plantea la cuestión de cómo IronOCR maneja el mismo diseño.
Solución: Eliminar la enumeración por completo.IronOCR realiza el análisis de diseño automáticamente. Si necesitas inspeccionar la estructura de diseño detectada, navega por result.Pages[n].Paragraphs — cada párrafo lleva una caja delimitadora con X, Y, Ancho, Altura y el texto que contiene. Para la extracción explícita de tablas, consulte el tutorial sobre cómo leer tablas :
// 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
Problema 2: Desajuste del umbral de confianza de las áreas de reconocimiento
Aspose.OCR: El código existente compara result.RecognitionAreasConfidence.Average() contra un umbral como 0.75f. El result.Confidence de IronOCR está en una escala diferente.
Solución: result.Confidence es un porcentaje de 0 a 100. Multiplica tu umbral de Aspose por 100 para convertirlo: 0.75f se convierte en 75.0. Luego, actualice toda la lógica de comparación:
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
//IronOCR equivalent — 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)
//IronOCR equivalent — 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
Problema 3: La salida JSON/XML de SaveMultipageDocument no tiene un método directo.
Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results) escribe un archivo JSON con metadatos de reconocimiento. Los equipos que consumen este resultado posteriormente deben encontrar el equivalente.
Solución:IronOCR no tiene un método equivalente a SaveFormat.Json. El reemplazo es navegar por result.Pages y serializar con System.Text.Json. Esto te da control total sobre el esquema:
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
Para la salida XHTML con coordenadas incrustadas que las herramientas posteriores pueden analizar, result.SaveAsHocrFile("output.hocr") es el equivalente semántico más cercano.
Problema 4: DocumentRecognitionSettings.StartPage utiliza un índice basado en 0.
Aspose.OCR: DocumentRecognitionSettings.StartPage = 2 significa la tercera página (basado en 0). Este es el error de desplazamiento de uno más común en las migraciones de Aspose a IronOCR.
Solución:IronOCR utiliza la indexación de páginas basada en 1 en todo el proceso. Agrega 1 a cada valor StartPage y recalcula la página final en consecuencia. Escriba una prueba específica contra un PDF multipágina conocido para detectar esto antes de la producción:
// 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
Problema 5: RecognizeSingleLine no tiene indicador directo
Aspose.OCR: settings.RecognizeSingleLine = true le dice al motor que trate toda la imagen como una sola línea de texto. Esto se usa para el reconocimiento de etiquetas, la extracción de campos y otras entradas de formato fijo.
Solución: Usa un CropRectangle para aislar la línea de texto precisamente, lo que evita que el motor ejecute una detección de diseño completa en una imagen de línea única. Para zonas o formatos de etiquetas legibles por máquina, la guía de lectura de documentos específicos abarca el enfoque adecuado:
// 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
Problema 6: No se requieren instancias de Aspose.OCR por subproceso
Aspose.OCR: La documentación recomienda crear una nueva instancia AsposeOcr() por hilo para evitar problemas de seguridad de hilo en el procesamiento paralelo. El código existente crea instancias dentro de lambdas Parallel.ForEach.
Solución: IronTesseract es seguro para hilos. Una única instancia gestiona cargas de trabajo paralelas. Eliminar la instanciación por hilo y compartir una única instancia:
// 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)
Lista de verificación de migración de Aspose.OCR
Tareas previas a la migración
Audite todas las referencias a Aspose.OCR en el código fuente:
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" .
Documente cada ocurrencia por categoría: llamadas de reconocimiento, objetos de configuración, procesos de preprocesamiento, llamadas de salida e inicialización de licencias. Toma nota de todos los valores de DetectAreasMode en uso — estos determinan qué ruta de migración de diseño se aplica. Registra todos los valores de enum SaveFormat — cada formato que no es PDF necesita el enfoque de serialización personalizada descrito en el Problema 3 arriba.
Migración de código
- Elimina el paquete NuGet
Aspose.OCRde todos los proyectos en la solución - Instala el paquete NuGet
IronOcren todos los proyectos - Reemplaza
using Aspose.OCR;yusing Aspose.OCR.Models;conusing IronOcr; - Reemplaza
new Aspose.OCR.License().SetLicense("file.lic")conIronOcr.License.LicenseKey = "key"al iniciar la app - Reemplaza
new AsposeOcr()connew IronTesseract() - Elimina todos los bloques de construcción de
RecognitionSettingsyDocumentRecognitionSettings - Elimina todas las referencias de enum
DetectAreasMode— no se necesita equivalente - Reemplaza
api.RecognizeImage(path, settings)conocr.Read(path) - Reemplaza
api.RecognizePdf(path, settings)conocr.Read(path)oocr.Read(input)usandoinput.LoadPdf() - Reemplaza
result.RecognitionTextconresult.Text - Reemplaza
result.RecognitionAreasConfidence.Average()conresult.Confidencey multiplica el umbral antiguo por 100 - Reemplaza
api.SaveMultipageDocument(path, SaveFormat.Pdf, list)conresult.SaveAsSearchablePdf(path) - Reemplaza
api.SaveMultipageDocument(path, SaveFormat.Json, list)con la serialización directa deresult.Pages - Convierte todas las cadenas
PreprocessingFiltera llamadas de métodoOcrInput(ver tabla de mapeo de API) - Actualiza
DocumentRecognitionSettings.StartPagede basado en 0 a basado en 1 (agrega 1 a cada valor) - Elimina la instanciación por hilo de
AsposeOcr— comparte una única instancia deIronTesseract
Pruebas posteriores a la migración
- Ejecutar OCR en una muestra representativa de cada tipo de documento en uso en producción y comparar el recuento de caracteres con la salida de referencia de Aspose.OCR.
- Verificar los valores de confianza:IronOCR devuelve valores entre 0 y 100; confirme que todas las comparaciones de umbrales utilizan la nueva escala
- Pruebe la selección de rango de páginas en un PDF de más de 10 páginas utilizando una numeración de página basada en 1 y verifique que se devuelvan las páginas correctas.
- Prueba la ingesta de archivos PDF protegidos con contraseña sin tener Aspose.PDF instalado: confirma que no haya ninguna excepción de dependencia.
- Confirma que
result.Textcoincide con la salida esperada para cadaDetectAreasModeque estaba en uso (COMBINAR, TABLA, DOCUMENTO) - Prueba la ruta de salida JSON: serializa
result.Pagesy valida el esquema contra cualquier consumidor posterior - Ejecuta el procesador por lotes en paralelo y verifica que no haya excepciones de hilos (instancia compartida de
IronTesseract) - Confirme que el archivo PDF con capacidad de búsqueda se abre en un visor de PDF y que el texto se puede seleccionar en las ubicaciones correctas.
- Validar que la clave de licencia se inicialice sin errores en cada entorno de implementación (inicio de ASP.NET , función de Azure, contenedor Docker).
- Verifica que las entradas TIFF preprocesadas sigan produciendo la salida esperada a través de
input.LoadImageFrames()
Principales ventajas de migrar a IronOCR
Coste total de propiedad predecible desde el primer día. La licencia Professional de 2999 dólares cubre a 10 desarrolladores en 10 proyectos sin renovación anual. El departamento de finanzas cierra la partida OCR una sola vez. El impacto presupuestario de añadir ingenieros, lanzar nuevos proyectos o extender el ciclo de vida del producto es nulo: no hay que realizar cálculos de niveles de licencia, ni controlar la fecha de renovación, ni existe riesgo de incumplimiento por un pago atrasado. La página de licencias de IronOCR documenta lo que cubre cada nivel.
Llamadas de reconocimiento que expresan intención, no infraestructuras. Después de la migración, cada llamada de reconocimiento es ocr.Read("document"). La construcción RecognitionSettings, la selección DetectAreasMode, y la población PreprocessingFilter que precedían a cada llamada de Aspose.OCR desaparecen por completo. Los nuevos ingenieros que leen la capa de reconocimiento óptico de caracteres (OCR) del código fuente ven la intención del negocio —"lea este documento"— en lugar de un objeto de configuración que se está ensamblando antes de que comience el trabajo real. La documentación de la API de IronTesseract abarca todas las propiedades de configuración disponibles.
Compatibilidad con PDF cifrados sin necesidad de un segundo producto. Los sistemas de gestión de documentos Enterprise manejan habitualmente archivos PDF protegidos con contraseña. Después de la migración, input.LoadPdf("doc.pdf", Password: "secret") los maneja de manera nativa. No hay que gestionar ninguna suscripción a Aspose.PDF, ni mantener ningún proceso de descifrado a imagen, ni realizar un seguimiento de la segunda fecha de renovación. Cada formato PDF en el proceso pasa por un único paquete, una única licencia y una única ruta de código. El tutorial sobre la entrada de archivos PDF abarca rangos de páginas, selección no contigua y entrada de flujo de datos.
Datos de resultados estructurados a nivel de palabra y carácter. result.Pages[n].Words devuelve una colección donde cada palabra lleva su caja delimitadora, su texto y su puntuación de confianza individual. La geometría a nivel de área de Aspose.OCR abarca regiones, no tokens individuales. Tras la migración, los analizadores de diseño de documentos, los extractores de campos de formulario y los procesos de procesamiento de facturas pueden acceder al posicionamiento palabra por palabra sin pasos de procesamiento adicionales. Consulte la página de características de los resultados de OCR para ver la jerarquía completa de resultados.
Implementación de un único paquete en todas las plataformas.IronOCR se distribuye como un único paquete NuGet que se ejecuta en Windows, Linux, macOS, Docker, Azure App Service y AWS Lambda sin necesidad de configuración específica de la plataforma. Aspose.OCR funciona en diferentes plataformas, pero puede requerir ajustes en la biblioteca nativa en entornos de contenedores. Tras la migración, el Dockerfile para un servicio OCR es una imagen base .NET estándar sin pasos de configuración específicos para OCR más allá de la instalación del paquete. Las guías de implementación abarcan Docker , Azure , AWS y Linux .
Lectura de códigos de barras en el mismo paso que OCR. Configurar ocr.Configuration.ReadBarCodes = true extrae códigos de barras, códigos QR y símbolos Code 128 de la misma imagen en una sola pasada del motor. Aspose.OCR no tiene capacidad para códigos de barras; se requeriría una biblioteca de códigos de barras independiente. Después de la migración, los documentos que mezclan texto impreso con códigos de barras (etiquetas de envío, formularios de inventario, boletos de eventos) son manejados por una sola llamada con resultados en result.Barcodes. Consulte la guía de OCR para códigos de barras para conocer las simbologías compatibles.
Preguntas Frecuentes
¿Por qué debería migrar de Aspose.OCR for .NET a IronOCR?
Los impulsores comunes incluyen la eliminación de la complejidad de la interoperabilidad COM, la sustitución de la gestión de licencias basada en archivos, la evitación de la facturación por página, la habilitación de la implementación de Docker/contenedores y la adopción de un flujo de trabajo nativo de NuGet que se integre con las herramientas .NET estándar.
¿Cuáles son los principales cambios de código al migrar de Aspose.OCR for .NET a IronOCR?
Sustituya las secuencias de inicialización de Aspose.OCR por la instanciación de IronTesseract, elimine la gestión del ciclo de vida de COM (patrones explícitos Create/Load/Close) y actualice los nombres de las propiedades de los resultados. El resultado es un número significativamente menor de líneas repetitivas.
¿Cómo instalo IronOCR para comenzar la migración?
Ejecute 'Install-Package IronOcr' en la consola del gestor de paquetes o 'dotnet add package IronOcr' en la CLI. Los paquetes de idiomas son paquetes independientes: 'dotnet add package IronOcr.Languages.French' para el francés, por ejemplo.
¿IronOCR tiene la misma precisión de reconocimiento óptico de caracteres que Aspose.OCR for .NET para documentos comerciales estándar?
IronOCR consigue una gran precisión para contenido empresarial estándar, como facturas, contratos, recibos y formularios mecanografiados. Los filtros de preprocesamiento de imágenes (eliminación de distorsiones, eliminación de ruido, mejora del contraste) mejoran aún más el reconocimiento en entradas degradadas.
¿Cómo gestiona IronOCR los datos de idioma que Aspose.OCR for .NET instala por separado?
Los datos de idiomas en IronOCR se distribuyen como paquetes NuGet. dotnet add package IronOcr.Languages.German' instala la compatibilidad con el alemán. No es necesario colocar manualmente los archivos ni las rutas de los directorios.
¿La migración de Aspose.OCR for .NET a IronOCR requiere cambios en la infraestructura de implantación?
IronOCR requiere menos cambios de infraestructura que Aspose.OCR for .NET. No hay rutas binarias del SDK, ubicaciones de archivos de licencia ni configuraciones del servidor de licencias. El paquete NuGet contiene el motor OCR completo, y la clave de licencia es una cadena establecida en el código de la aplicación.
¿Cómo configuro las licencias de IronOCR después de la migración?
Asigne IronOcr.License.LicenseKey = "YOUR-KEY" en el código de inicio de la aplicación. En Docker o Kubernetes, almacene la clave como una variable de entorno y léala en el inicio. Utilice License.IsValidLicense para validar antes de aceptar tráfico.
¿Puede IronOCR procesar archivos PDF del mismo modo que Aspose.OCR?
Sí, IronOCR lee PDF nativos y escaneados. Instancie IronTesseract, llame a ocr.Read(input) donde input es una ruta PDF u OcrPdfInput, e itere las páginas OcrResult. No es necesario un proceso de renderizado de PDF independiente.
¿Cómo gestiona IronOCR los hilos en el procesamiento de grandes volúmenes?
IronTesseract puede instanciarse de forma segura por subproceso. Gire una instancia por hilo en un Parallel.ForEach o Task pool, ejecute OCR concurrentemente, y disponga de cada instancia cuando termine. No se requiere estado global o bloqueo.
¿Qué formatos de salida admite IronOCR tras la extracción de texto?
IronOCR devuelve resultados estructurados que incluyen texto, coordenadas de palabras, puntuaciones de confianza y estructura de páginas. Las opciones de exportación incluyen texto sin formato, PDF con opción de búsqueda y objetos de resultados estructurados para su procesamiento posterior.
¿Es el precio de IronOCR más predecible que el de Aspose.OCR for .NET para escalar cargas de trabajo?
IronOCR utiliza licencias perpetuas de tarifa plana sin cargos por página o volumen. Tanto si procesa 10.000 como 10 millones de páginas, el coste de la licencia permanece constante. Las opciones de licencias por volumen y por equipo se encuentran en la página de precios de IronOCR.
¿Qué ocurre con mis pruebas existentes después de migrar de Aspose.OCR for .NET a IronOCR?
Las pruebas que validan el contenido de texto extraído deben seguir superándose tras la migración. Las pruebas que validan patrones de llamada a API o el ciclo de vida de objetos COM deberán actualizarse para reflejar el modelo de inicialización y resultados más sencillo de IronOCR.

