Saltar al pie de página
VIDEOS

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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í (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
SHELL

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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}")
$vbLabelText   $csharpLabel

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}")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. Elimina el paquete NuGet Aspose.OCR de todos los proyectos en la solución
  2. Instala el paquete NuGet IronOcr en todos los proyectos
  3. Reemplaza using Aspose.OCR; y using Aspose.OCR.Models; con using IronOcr;
  4. Reemplaza new Aspose.OCR.License().SetLicense("file.lic") con IronOcr.License.LicenseKey = "key" al iniciar la app
  5. Reemplaza new AsposeOcr() con new IronTesseract()
  6. Elimina todos los bloques de construcción de RecognitionSettings y DocumentRecognitionSettings
  7. Elimina todas las referencias de enum DetectAreasMode — no se necesita equivalente
  8. Reemplaza api.RecognizeImage(path, settings) con ocr.Read(path)
  9. Reemplaza api.RecognizePdf(path, settings) con ocr.Read(path) o ocr.Read(input) usando input.LoadPdf()
  10. Reemplaza result.RecognitionText con result.Text
  11. Reemplaza result.RecognitionAreasConfidence.Average() con result.Confidence y multiplica el umbral antiguo por 100
  12. Reemplaza api.SaveMultipageDocument(path, SaveFormat.Pdf, list) con result.SaveAsSearchablePdf(path)
  13. Reemplaza api.SaveMultipageDocument(path, SaveFormat.Json, list) con la serialización directa de result.Pages
  14. Convierte todas las cadenas PreprocessingFilter a llamadas de método OcrInput (ver tabla de mapeo de API)
  15. Actualiza DocumentRecognitionSettings.StartPage de basado en 0 a basado en 1 (agrega 1 a cada valor)
  16. Elimina la instanciación por hilo de AsposeOcr — comparte una única instancia de IronTesseract

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.Text coincide con la salida esperada para cada DetectAreasMode que estaba en uso (COMBINAR, TABLA, DOCUMENTO)
  • Prueba la ruta de salida JSON: serializa result.Pages y 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.

Por favor notaAspose y Tesseract son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Aspose Pty Ltd ni Google. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

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.

Kannaopat Udonpant
Ingeniero de Software
Antes de convertirse en Ingeniero de Software, Kannapat completó un doctorado en Recursos Ambientales de la Universidad de Hokkaido en Japón. Mientras perseguía su grado, Kannapat también se convirtió en miembro del Laboratorio de Robótica de Vehículos, que es parte del Departamento de Ingeniería ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame