IRONSOFTWAREHOME
VIDEOS

Migración de TesseractOCR a IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 de agosto de 2026

Esta guía guía a los desarrolladores de .NET a través de una migración completa del paquete NuGet TesseractOCR(la bifurcación de Sicos1977/Kees van Spelde) a IronOCR. Abarca todo el proceso de sustitución: eliminar las dependencias de preprocesamiento externo, habilitar la entrada de PDF nativos y la salida de PDF con capacidad de búsqueda, actualizar los espacios de nombres y las llamadas a la API, y verificar la integración migrada. No es necesario haber leído previamente el artículo comparativo.

¿Por qué migrar desde TesseractOCR?

TesseractOCR es un envoltorio comunitario mantenido activamente que está orientado a .NET moderno e incluye las bibliotecas nativas de Tesseract 5. Actualizar a esta versión desde envoltorios más antiguos resuelve los problemas de compatibilidad del marco. No resuelve las deficiencias arquitectónicas que se encuentran por debajo de la capa de envoltura. Cuando esas deficiencias salen a la luz en producción, comienza el debate sobre la migración.

El preprocesamiento vive completamente fuera de la biblioteca. TesseractOCRllama a engine.Process(image) en cualquier conjunto de píxeles que suministres. Un escaneo torcido, un fax con poco contraste, una foto de un recibo tomada con el móvil... todos ellos se envían sin procesar al motor de Tesseract. Recuperar una salida utilizable requiere agregar SixLabors.ImageSharp, SkiaSharp, o una biblioteca de imágenes similar, escribir cadenas de filtro manuales con parámetros ajustados por tipo de documento, y dirigir la imagen preprocesada a través de un archivo temporal porque TesseractOCR.Pix.Image espera una ruta de archivo. La corrección de la inclinación no está disponible en absoluto en las bibliotecas de imágenes estándar de .NET Standard; requiere implementar un algoritmo de detección de ángulos mediante la transformada de Hough desde cero, lo que suele suponer entre 50 y 100 líneas de código adicionales. No se trata de un coste de configuración único; se repite cada vez que se incorpora un nuevo tipo de documento al proceso.

La entrada de PDF requiere una segunda biblioteca y un canal de archivos temporales. TesseractOCRprocesa imágenes, no archivos PDF. Cada flujo de trabajo de PDF requiere un paquete adicional —Docnet.Core, PdfiumViewer o similar— para renderizar las páginas PDF en matrices de bytes BGRA, un método auxiliar para convertir esos bytes a un formato que TesseractOCRpueda leer, y una lógica de creación y limpieza de archivos temporales que envuelva todo el bucle. El resultado son aproximadamente 100 líneas de código de infraestructura que rodean cada operación de OCR de PDF. Los PDFs protegidos por contraseña requieren una tercera biblioteca (iText con licencia AGPL, o PDFSharp) solo para descifrar antes de procesar.

La salida en PDF con capacidad de búsqueda no tiene ruta. Los equipos que necesitan generar archivos PDF legibles por máquina a partir de documentos escaneados —un requisito habitual en los flujos de trabajo de gestión de documentos, archivo y cumplimiento normativo— se encuentran con que TesseractOCRno ofrece ningún mecanismo para ello. No hay SaveAsSearchablePdf(), no hay una canalización hOCR a PDF, no hay un formato de salida más allá del texto extraído. Añadir esta capacidad requiere o bien una biblioteca PDF independiente o bien abandonar TesseractOCRpor completo.

Los documentos TIFF de varios fotogramas requieren un bucle de páginas manual. Los archivos TIFF de varias páginas, habituales en flujos de trabajo de fax y escáneres de documentos, no tienen gestión nativa de varios fotogramas en TesseractOCR. Para extraer todos los fotogramas es necesario cargar el TIFF con una biblioteca externa, recorrer los fotogramas, guardar cada uno en un archivo temporal y procesar cada archivo temporal por separado a través del motor OCR.

El tamaño de la comunidad limita el soporte práctico. TesseractOCRcuenta con aproximadamente 200 000 descargas en NuGet. Stack Overflow, publicaciones de blogs, y hilos de problemas de GitHub sobre envoltorios de Tesseract .NET mayoritariamente hacen referencia a la API de charlesw — TesseractEngine, Pix.LoadFromFile — no a la API de Sicos1977. La resolución de problemas en el mundo real para cuestiones específicas de TesseractOCRse topa rápidamente con este obstáculo.

El problema fundamental

TesseractOCR no requiere preprocesamiento y no es compatible con PDF. Todos los flujos de trabajo de documentos de producción acaban requiriendo bibliotecas externas solo para llegar al punto en el que se puede ejecutar el OCR:

// TesseractOCR: three packages, a temp file, and manual byte conversion
// just to OCR one PDF page — before any preprocessing
// dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// dotnet add package SixLabors.ImageSharp   (preprocessing)

using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(200, 200));
using var pageReader = docReader.GetPageReader(0);
var bytes = pageReader.GetImage(); // BGRA — not a format Pix.Image accepts directly

string tempPath = Path.GetTempFileName() + ".png";
SaveBgraAsPng(bytes, pageReader.GetPageWidth(), pageReader.GetPageHeight(), tempPath);
// ^ 30+ line helper method needed here

using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
string text = page.Text;
File.Delete(tempPath); // hope this succeeds
C#
// IronOCR: one package, three lines, preprocessing automatic
// dotnet add package IronOcr

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
string text = ocr.Read(input).Text;
C#

##IronOCR frente a TesseractOCR: comparación de características

La tabla siguiente recoge las capacidades más importantes a la hora de evaluar la migración.

CaracterísticaTesseractOCRIronOCR
Paquete NuGetTesseractOCRIronOcr
Compatibilidad con .NET.NET 6.0, 7.0, 8.0.NET Framework 4.6.2+, .NET Core, .NET 5/6/7/8/9
LicenciaApache 2.0 (gratuito)Comercial (perpetua, desde $999)
Gestión de TessdataRequerido (descarga manual desde GitHub)No es necesario (incluido internamente)
Preprocesamiento integradoNoneEnderezar, Reducir ruido, Contraste, Binarizar, Enfocar, Escalar, Dilatar, Erosionar, Invertir
Eliminación profunda del ruido de fondoNoSí (DeepCleanBackgroundNoise())
Entrada nativa de PDFNo (requiere Docnet.Core o similar)Sí (input.LoadPdf())
PDF protegido con contraseñaNo (requiere una tercera biblioteca para descifrarlo)Sí (parámetro único Password)
Salida en PDF con capacidad de búsquedaNoSí (result.SaveAsSearchablePdf())
Entrada TIFF multifotogramaNo (requiere extracción de marcos externos)Sí (input.LoadImageFrames())
Entrada de flujo y matriz de bytesNo (requiere un archivo temporal intermedio)Sí (directa LoadImage(stream), LoadImage(bytes))
Seguridad de los hilosNo (una instancia del motor por subproceso)Sí (única IronTesseract compartida entre hilos)
OCR basado en la regiónNoSí (CropRectangle)
Lectura de BarCodes durante el OCRNoSí (ocr.Configuration.ReadBarCodes = true)
Salida estructurada (páginas, WORD, coordenadas)No (solo cadena de texto sin formato)Sí (Pages, Paragraphs, Lines, Words con X/Y)
Puntuación de confianzaFloat a nivel de documento (0,0–1,0)Doble revisión a nivel de documento y de WORD (0–100)
Exportación hOCRNo
Paquetes NuGet en más de 125 idiomasNo
Implementación multiplataformaWindows, Linux, macOSWindows, Linux, macOS, Docker, Azure, AWS
Apoyo comercialNo (un único mantenedor voluntario)Sí (correo electrónico, opciones de SLA)

Inicio rápido: Migración de TesseractOCRa IronOCR

Paso 1: Sustituir el paquete NuGet

Elimina TesseractOCRy cualquier biblioteca añadida para dar soporte a esta:

dotnet remove package TesseractOCR
dotnet remove package Docnet.Core
dotnet remove package SixLabors.ImageSharp
SHELL

Instala IronOCR desde NuGet :

dotnet add package IronOcr

Paso 2: Actualizar los espacios de nombres

Reemplace todas las importaciones de espacio de nombres TesseractOCRcon IronOCR:

// Before (TesseractOCR)
using TesseractOCR;
using TesseractOCR.Enums;

// After (IronOCR)
using IronOcr;
C#

Paso 3: Inicializar licencia

Añade la inicialización de la licencia una vez al iniciar la aplicación, antes de cualquier llamada a OCR:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

Hay disponible una licencia de prueba gratuita en la página de licencias de IronOCR para su evaluación.

Ejemplos de migración de código

Sustitución del canal de preprocesamiento externo

TesseractOCR requiere una biblioteca de imágenes externa para mejorar la calidad de cada documento. El código siguiente muestra el patrón que siguen los equipos cuando la calidad del documento es variable: conversión a escala de grises, ajuste del contraste, reducción del ruido y escritura de un archivo temporal antes de que se pueda ejecutar el OCR. La función Deskew (corrección de un escaneo inclinado) no está disponible en las bibliotecas de imágenes estándar de .NET Standard y requiere un algoritmo independiente.

Enfoque de TesseractOCR:

// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — parameters must be tuned per document type
// Deskew is NOT in ImageSharp — requires custom Hough transform (~50-100 lines)

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromLowQualityScan(string imagePath)
{
    using var image = Image.Load(imagePath);

    image.Mutate(x => x.Grayscale());
    image.Mutate(x => x.Contrast(1.5f));          // manual tuning required
    image.Mutate(x => x.GaussianBlur(0.5f));      // noise reduction approximation
    image.Mutate(x => x.BinaryThreshold(0.5f));   // threshold requires per-doc adjustment

    // Deskew omitted — no built-in support, ~80 lines of additional code

    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        image.Save(tempPath);

        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
        using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
        using var page = engine.Process(pix);

        return page.Text;
    }
    finally
    {
        File.Delete(tempPath);
    }
}
C#

Enfoque IronOCR:

// No external imaging library
// No temp file — OcrInput accepts a path, stream, or byte array directly
// Deskew is built in — automatic angle detection and correction

using IronOcr;

public string ExtractFromLowQualityScan(string imagePath)
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    input.Deskew();           // automatic angle correction
    input.DeNoise();          // intelligent noise removal
    input.Contrast();         // automatic contrast enhancement
    input.Binarize();         // clean black-and-white conversion

    var ocr = new IronTesseract();
    return ocr.Read(input).Text;
}
C#

Al eliminar la dependencia de ImageSharp, se elimina por completo el ciclo de ajuste. La canalización de preprocesamiento OcrInput aplica algoritmos calibrados para OCR de documentos — sin conjeturas sobre multiplicadores de contraste o radios de desenfoque. El tutorial sobre filtros de imagen y la guía de corrección de la calidad de imagen abarcan todos los filtros disponibles con opciones de parámetros para los casos en los que sea necesario ajustar los valores predeterminados.

Sustitución del procesamiento de TIFF de múltiples fotogramas

Los documentos de fax, los archivos escaneados y los archivos de archivo suelen llegar en formato TIFF de varias páginas. TesseractOCRno admite múltiples fotogramas: cada fotograma debe extraerse con una biblioteca externa, guardarse en el disco y pasarse por el motor de uno en uno.IronOCR carga el TIFF completo en una sola llamada.

Enfoque de TesseractOCR:

// Requires: dotnet add package SixLabors.ImageSharp
// Manual frame extraction — every frame becomes a temp file on disk

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Tiff;
using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();
    var tempFiles = new List<string>();

    try
    {
        using var image = Image.Load(tiffPath);
        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);

        for (int frameIndex = 0; frameIndex < image.Frames.Count; frameIndex++)
        {
            // Clone frame and save to temp file — no in-memory path
            using var frameImage = image.Frames.CloneFrame(frameIndex);
            string tempPath = Path.GetTempFileName() + ".png";
            tempFiles.Add(tempPath);
            frameImage.SaveAsPng(tempPath);

            using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
            using var page = engine.Process(pix);

            allText.AppendLine($"=== Frame {frameIndex + 1} ===");
            allText.AppendLine(page.Text);
        }
    }
    finally
    {
        foreach (var f in tempFiles)
            try { File.Delete(f); } catch { }
    }

    return allText.ToString();
}
C#

Enfoque IronOCR:

// No external library for frame extraction
// All frames processed in one Read() call — no manual loop required

using IronOcr;

public string ExtractFromMultiPageTiff(string tiffPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);   // loads all frames automatically
    var result = ocr.Read(input);

    // Access per-page text if needed
    foreach (var page in result.Pages)
        Console.WriteLine($"Frame {page.PageNumber}: {page.Text}");

    return result.Text;
}
C#

El bucle de extracción de fotogramas, la lista de archivos temporales, el bloque de limpieza finally — todo eso desaparece. En el caso de un TIFF de fax de 20 páginas, esto sustituye aproximadamente 40 líneas por 6. La guía de entrada de TIFF y GIF cubre opciones de carga de múltiples fotogramas, incluidos rangos de fotogramas selectivos.

Generación de archivos PDF con capacidad de búsqueda

Este escenario no tiene ruta de migración en TesseractOCR: simplemente no se puede hacer. Los archivos PDF escaneados que deben convertirse en documentos legibles por máquina y en los que se pueda seleccionar texto (para la indexación de búsquedas, la accesibilidad o el archivo) requieren la generación de un PDF con capacidad de búsqueda. TesseractOCRsolo genera texto extraído.IronOCR genera directamente el PDF con capacidad de búsqueda.

Enfoque de TesseractOCR:

// No path available — TesseractOCRcannot produce any PDF output.
// The closest workaround requires a separate PDF library (iTextSharp AGPL,
// or similar) to overlay extracted text onto the original PDF manually.
// This is 150-300 lines of additional code and introduces AGPL license concerns.

// The best available output from TesseractOCR:
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var pix = TesseractOCR.Pix.Image.LoadFromFile("scanned-page.png");
using var page = engine.Process(pix);

string extractedText = page.Text; // flat string — no PDF output possible
File.WriteAllText("output.txt", extractedText);
// Cannot produce a searchable PDF — no API exists for this
C#

Enfoque IronOCR:

// Native searchable PDF output — no additional library required
// Input can be a scanned image, a scanned PDF, or a multi-page TIFF

using IronOcr;

public void CreateSearchablePdf(string scannedPdfPath, string outputPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdf(scannedPdfPath);
    input.Deskew();     // improve accuracy before generating the output
    input.DeNoise();

    var result = ocr.Read(input);
    result.SaveAsSearchablePdf(outputPath);   // searchable, text-selectable PDF
}
C#

La llamada SaveAsSearchablePdf() incrusta el texto OCR en el PDF como una capa invisible detrás de la imagen escaneada original. El documento sigue siendo visualmente idéntico, pero pasa a ser totalmente buscable, seleccionable e indexable. La guía en PDF con función de búsqueda cubre toda la API, y el ejemplo en PDF con función de búsqueda muestra el patrón de funcionamiento completo.

Sustitución de la entrada de matrices de bytes y eliminación de archivos temporales

La API Pix.Image de TesseractOCRacepta una ruta de archivo. Cuando los datos de imagen llegan como una matriz de bytes —desde una base de datos, una carga multiparte HTTP o una caché de memoria—, TesseractOCRfuerza una escritura en un archivo temporal antes de procesarlos. La API OcrInput de IronOCR acepta directamente arreglos de bytes y flujos, eliminando por completo el paso de archivo temporal.

Enfoque de TesseractOCR:

// TesseractOCR.Pix.Image has no byte[] or Stream overload
// Every in-memory image must be written to disk before processing

using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromBytes(byte[] imageBytes)
{
    // Force a disk write just to satisfy the file-path API
    string tempPath = Path.GetTempFileName() + ".png";

    try
    {
        File.WriteAllBytes(tempPath, imageBytes);

        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
        using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
        using var page = engine.Process(pix);

        return page.Text;
    }
    finally
    {
        // Risk: if an exception fires between WriteAllBytes and Delete,
        // temp files accumulate on the server disk
        if (File.Exists(tempPath))
            File.Delete(tempPath);
    }
}
C#

Enfoque IronOCR:

// OcrInput accepts byte arrays and streams natively
// No disk write, no temp file cleanup, no cleanup failure risk

using IronOcr;

public string ExtractFromBytes(byte[] imageBytes)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imageBytes);   // direct byte array — no temp file
    return ocr.Read(input).Text;
}

public string ExtractFromStream(Stream imageStream)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imageStream);  // direct stream — no intermediate buffer
    return ocr.Read(input).Text;
}
C#

En las aplicaciones web que procesan documentos cargados, el patrón de archivos temporales acumula uso de disco bajo carga e introduce condiciones de carrera si el código de limpieza lanza un error. La guía de entradas de flujo y la guía de entradas de imágenes cubren cada formato de entrada soportado, incluyendo MemoryStream, byte[], Bitmap, y ruta de archivo.

Filtrado de confianza a nivel de WORD con datos estructurados

TesseractOCR devuelve una única puntuación de confianza a nivel de documento (page.MeanConfidence, un flotante de 0.0 a 1.0) y una cadena de texto plana. No hay confianza por palabra, ni posicionamiento de palabras, ni jerarquía estructural. Crear un flujo de trabajo que marque palabras dudosas, extraiga regiones específicas o asigne el texto a coordenadas del documento requiere cambiar a un modelo de salida fundamentalmente diferente.

Enfoque de TesseractOCR:

// Only document-level confidence available
// No word coordinates, no structural hierarchy

using TesseractOCR;
using TesseractOCR.Enums;

public void ProcessWithConfidence(string imagePath)
{
    using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
    using var pix = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
    using var page = engine.Process(pix);

    float docConfidence = page.MeanConfidence; // 0.0 to 1.0 for the whole document

    if (docConfidence >= 0.7f)
        Console.WriteLine($"Accepted ({docConfidence:P0}): {page.Text}");
    else
        Console.WriteLine($"Rejected ({docConfidence:P0}): document needs preprocessing");

    // No way to identify WHICH words are uncertain
    // No word coordinates available
}
C#

Enfoque IronOCR:

// Per-word confidence and coordinate data
// Filter individual uncertain words without discarding the whole document

using IronOcr;

public void ProcessWithWordLevelConfidence(string imagePath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);

    Console.WriteLine($"Document confidence: {result.Confidence}%");

    // Iterate words and flag those below threshold
    foreach (var page in result.Pages)
    {
        foreach (var word in page.Words)
        {
            if (word.Confidence < 70)
            {
                // Low-confidence word — log position for review
                Console.WriteLine(
                    $"Low confidence word '{word.Text}' ({word.Confidence}%) " +
                    $"at X:{word.X} Y:{word.Y}");
            }
        }
    }

    // Extract only high-confidence text
    var reliableWords = result.Pages
        .SelectMany(p => p.Words)
        .Where(w => w.Confidence >= 70)
        .Select(w => w.Text);

    Console.WriteLine(string.Join(" ", reliableWords));
}
C#

El filtrado de confianza por WORD es esencial para el procesamiento de facturas, la extracción de formularios y cualquier flujo de trabajo en el que actuar sobre texto incierto sea peor que marcarlo para su revisión. La guía de puntuaciones de confianza abarca el modelo de puntuación completo, y la guía de resultados de lectura documenta la jerarquía completa de salida estructurada.

Referencia de mapeo de la API de TesseractOCRa IronOCR

TesseractOCRIronOCRNotas
new Engine(tessDataPath, Language.English, EngineMode.Default)new IronTesseract()Sin ruta de tessdata; No es necesario seleccionar EngineMode
TesseractOCR.Pix.Image.LoadFromFile(path)input.LoadImage(path)También acepta byte[] y Stream
engine.Process(pixImage)ocr.Read(input)Devuelve OcrResult en lugar de Page
page.Textresult.TextSemántica idéntica
page.MeanConfidence (flotante de 0.0–1.0)result.Confidence (doble de 0–100)La escala varía: actualizar las comparaciones de umbrales
Language.English | Language.FrenchOcrLanguage.English + OcrLanguage.FrenchOperador de suma, no OR bit a bit
EngineMode.DefaultN/AIronOCR selecciona el modo internamente
EngineMode.LstmOnlyN/AAutomático
TesseractOCR.Exceptions.TesseractExceptionIronOcr.Exceptions.OcrExceptionMenos tipos de excepciones que gestionar
DllNotFoundException (nativo faltante)No procedeIronOCR incluye sus dependencias nativas
BadImageFormatException (desajuste de arquitectura)No procedeGestionado internamente
Externo Image.Mutate(x => x.Grayscale())input.Binarize()Integrado, sin biblioteca externa.
Externo Image.Mutate(x => x.Contrast(...))input.Contrast()Calibración automática
Transformación de Hough externa para la corrección de la inclinacióninput.Deskew()Integrado, una llamada a método
Filtro de ruido externo GaussianBlurinput.DeNoise()Eliminación inteligente de ruido
DocLib.GetDocReader(pdfPath, ...)input.LoadPdf(pdfPath)No se necesita Docnet.Core
docReader.GetPageReader(i).GetImage() + archivo temporalinput.LoadPdf(pdfPath)Se ha sustituido todo el bucle
input.LoadPdf(encrypted, Password: "...")Un único parámetro: no se necesita una tercera biblioteca
N/A (sin salida en PDF)result.SaveAsSearchablePdf(outputPath)No existe un equivalente en TesseractOCR.
N/A (sin soporte para marcos)input.LoadImageFrames(tiffPath)TIFF de múltiples fotogramas en una sola llamada
N/A (solo ruta de archivo)input.LoadImage(stream) / input.LoadImage(bytes)Elimina el patrón de archivos temporales
Instancias Engine por hiloÚnico IronTesseract compartido entre hilosThread-safe por diseño
page.MeanConfidence (solo documento)word.Confidence por palabraPuntuación a nivel de palabra disponible

Problemas comunes de migración y soluciones

Problema 1: Los valores del umbral de confianza se rompen tras la migración

TesseractOCR: page.MeanConfidence devuelve un flotante en el rango de 0.0 a 1.0. El código comúnmente verifica if (confidence >= 0.7f) para aceptar resultados.

**Solución:**IronOCR indica el nivel de confianza como un doble en una escala de 0 a 100. Multiplica todos los valores de umbral existentes por 100. Un umbral de 0.7f se convierte en 70.0. La confianza a nivel de documento está en result.Confidence; la confianza a nivel de palabra está en word.Confidence dentro de result.Pages[n].Words.

// Before (TesseractOCR): page.MeanConfidence >= 0.7f
// After (IronOCR):
var result = new IronTesseract().Read("document.png");
if (result.Confidence >= 70.0)
{
    Console.WriteLine(result.Text);
}
C#

Problema 2: El directorio temporal se llena tras intentar la migración

TesseractOCR: El código escrito en torno a la restricción Pix.Image.LoadFromFile() frecuentemente crea archivos temporales que se limpian en bloques finally. Si el mismo bloque finally lanza una excepción, o si la aplicación se termina a la fuerza, los archivos temporales se acumulan.

Solución: Reemplaza todos los patrones File.WriteAllBytes(tempPath, bytes) + Pix.Image.LoadFromFile(tempPath) con input.LoadImage(bytes) o input.LoadImage(stream). Una vez que no se cree ningún código que genere archivos temporales, la lógica de limpieza y la creación del directorio para el almacenamiento temporal pueden eliminarse por completo. Busca GetTempFileName, GetTempPath, y SaveBgraAsPng para encontrar todas las ocurrencias.

grep -rn "GetTempFileName\|GetTempPath\|SaveBgraAsPng" --include="*.cs" .
SHELL
// Before: byte[] → temp file → Pix.Image.LoadFromFile
// After: byte[] → OcrInput directly
using var input = new OcrInput();
input.LoadImage(imageBytes);   // no disk write
var result = ocr.Read(input);
C#

Consulte la guía de entrada de imágenes para ver todos los formatos de entrada admitidos.

Problema 3: El cambio de operador de lenguaje provoca un error del compilador

TesseractOCR: El OCR multilingüe utiliza el operador OR bit a bit en una enumeración de indicadores: Language.English | Idioma: francés. Este es un patrón de enumeración [Flags]`.

**Solución:**IronOCR utiliza el operador de adición: OcrLanguage.English + OcrLanguage.French. Estos parecen similares, pero son operadores diferentes. Una búsqueda y reemplazo para Language. por OcrLanguage. combinado con | to + dentro de expresiones de lenguaje maneja la mayoría de los casos. Verifica que cualquier combinación de lenguajes construida en tiempo de ejecución también use +.

// Before (TesseractOCR):
var engine = new Engine(@"./tessdata",
    Language.English | Language.French | Language.German,
    EngineMode.Default);

// After (IronOCR):
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German;
C#

Problema 4: Los paquetes Docnet e ImageSharp siguen apareciendo como referencias tras la desinstalación

TesseractOCR: Los proyectos que utilizan TesseractOCRpara flujos de trabajo con PDF suelen tener Docnet.Core como dependencia directa, y SixLabors.ImageSharp o SkiaSharp para el preprocesamiento. Después de cambiar a IronOCR, estos paquetes frecuentemente permanecen en el .csproj porque las sentencias using no han sido completamente eliminadas.

Solución: Después de eliminar los paquetes de .csproj, busca cualquier resquicio de using Docnet.Core, using SixLabors.ImageSharp, y referencias de namespaces relacionadas. Si las sentencias using hacen referencia a namespaces que ya no existen en el árbol de dependencias, el compilador las marcará — pero solo si los comandos dotnet remove package realmente se ejecutaron.

grep -rn "using Docnet\|using SixLabors\|using SkiaSharp" --include="*.cs" .
SHELL

Elimina las referencias de los archivos identificados, luego elimina los métodos de ayuda para el preprocesamiento (SaveBgraAsPng, ApplyGrayscale, ApplyThreshold, y similares) que servían al antiguo canal.

Problema 5: El tamaño de la imagen de Docker aumenta tras la migración

TesseractOCR: Algunas configuraciones de Docker instalan Tesseract mediante apt-get install tesseract-ocr tesseract-ocr-eng como un paquete de sistema, luego hacen referencia a esos binarios del sistema. Esto añade aproximadamente entre 30 y 80 MB a la imagen, dependiendo de los paquetes de idiomas.

**Solución:**IronOCR incluye sus propios binarios de Tesseract dentro del paquete NuGet. La línea apt-get install tesseract-ocr en el Dockerfile ya no es necesaria y debería eliminarse. Los paquetes de idioma también vienen de NuGet, no de apt-get install tesseract-ocr-fra. La guía de implementación de Docker proporciona configuraciones de imágenes base validadas y los paquetes exactos necesarios para que IronOCR se ejecute en un contenedor.

# Remove these lines after migration:
# RUN apt-get install -y tesseract-ocr tesseract-ocr-eng tesseract-ocr-fra
# COPY ./tessdata /app/tessdata
Text

Problema 6: TesseractException y DllNotFoundException bloques catch se vuelven inaccesibles

TesseractOCR: Las integraciones de producción de TesseractOCRcapturan TesseractOCR.Exceptions.TesseractException, DllNotFoundException (por binarios nativos faltantes), y BadImageFormatException (por desajustes de arquitectura). Estos tipos de excepción son respuestas defensivas a la inestabilidad de tessdata y la implementación de binarios nativos.

**Solución:**IronOCR agrupa las dependencias nativas y gestiona la inicialización internamente. DllNotFoundException y BadImageFormatException no aplican. Elimina esos bloques de catch. La superficie de excepciones se reduce a IronOcr.Exceptions.OcrException para fallos de OCR y IOException estándar para problemas de acceso a archivos.

// Before: five exception types to handle
catch (TesseractOCR.Exceptions.TesseractException ex) { ... }
catch (DllNotFoundException ex) { ... }
catch (BadImageFormatException ex) { ... }
catch (OutOfMemoryException ex) { ... }

// After: two exception types
catch (IronOcr.Exceptions.OcrException ex) { ... }
catch (IOException ex) { ... }
C#

Lista de verificación para la migración a TesseractOCR

Pre-Migración

Revisar todos los puntos de uso de TesseractOCRen el código fuente:

grep -rn "using TesseractOCR" --include="*.cs" .
grep -rn "new Engine(" --include="*.cs" .
grep -rn "Pix\.Image\.LoadFromFile\|engine\.Process\|page\.Text\|MeanConfidence" --include="*.cs" .
grep -rn "Language\." --include="*.cs" .
SHELL

Identifique toda la infraestructura de apoyo que se va a eliminar:

grep -rn "using Docnet\|using SixLabors\|GetTempFileName\|SaveBgraAsPng" --include="*.cs" .
grep -rn "tessdata" --include="*.cs" .
grep -rn "tessdata" --include="*.csproj" .
grep -rn "tessdata" Dockerfile 2>/dev/null || true
SHELL

Documente el nivel de precisión actual en una muestra representativa de documentos antes de la migración, para que se pueda verificar la calidad tras la migración.

Migración de código

  1. Ejecuta dotnet remove package TesseractOCR
  2. Ejecuta dotnet remove package Docnet.Core (si está presente)
  3. Ejecuta dotnet remove package SixLabors.ImageSharp (si se añadió para el preprocesamiento)
  4. Ejecuta dotnet add package IronOcr
  5. Agrega IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY" al inicio de la aplicación
  6. Reemplaza using TesseractOCR y using TesseractOCR.Enums con using IronOcr
  7. Reemplaza new Engine(tessDataPath, Language.English, EngineMode.Default) con new IronTesseract()
  8. Reemplaza TesseractOCR.Pix.Image.LoadFromFile(path) con input.LoadImage(path) en una instancia OcrInput
  9. Reemplaza engine.Process(pixImage) con ocr.Read(input)
  10. Reemplaza page.Text con result.Text
  11. Actualizar las comparaciones de umbrales de confianza: multiplicar todos los valores de 0,0 a 1,0 por 100 para la escala de 0 a 100 de IronOCR
  12. Reemplazar Language.X | Language.Y with OcrLanguage.X + OcrLanguage.Y
  13. Elimina todos los métodos de ayuda de preprocesamiento (SaveBgraAsPng, cadenas de filtro manuales, lógica de archivos temporales)
  14. Reemplaza los bucles de representación de Docnet PDF con input.LoadPdf(path) o input.LoadPdfPages(path, start, end)
  15. Reemplaza los bucles TIFF de múltiples tramas con input.LoadImageFrames(tiffPath)
  16. Reemplaza File.WriteAllBytes(tempPath, bytes) + LoadFromFile(tempPath) con input.LoadImage(bytes)
  17. Actualiza bloques catch — elimina TesseractException, DllNotFoundException, BadImageFormatException
  18. Eliminar la carpeta tessdata de la configuración del directorio de salida del proyecto y de las imágenes de Docker

Posmigración

  • Confirma dotnet build produce cero errores de compilador y cero advertencias de bloques-catch inaccesibles
  • Ejecuta el OCR sobre la muestra de referencia de precisión previa a la migración y compara los resultados
  • Verificar que los archivos TIFF de varias páginas generen el número correcto de páginas extraídas
  • Confirme que el PDF resultante, en el que se puede realizar búsquedas, se abre en un visor de PDF con texto seleccionable
  • Probar las rutas de entrada de matrices de bytes y flujos desde las fuentes de datos reales de la aplicación
  • Comprueba que los valores de confianza a nivel de WORD estén en el rango de 0 a 100 (no de 0,0 a 1,0)
  • Ejecutar pruebas de procesamiento paralelo para confirmar que no hay advertencias de asignación del motor por subproceso
  • Despliega al entorno objetivo (Docker, Azure, Linux) y confirma que IronOCR se inicializa sin DllNotFoundException
  • Verifica que no se haga referencia a la carpeta tessdata o al archivo .traineddata en ningún lugar de los scripts de implementación

Principales ventajas de migrar a IronOCR

El preprocesamiento se convierte en una configuración de una línea, no una dependencia de 100 líneas. Después de la migración, input.Deskew(), input.DeNoise(), y input.Contrast() reemplazan una biblioteca de imágenes externa, ajuste manual de parámetros, y la escritura del archivo temporal que conectaba los dos. Las fotos de móvil, los escaneos torcidos y los faxes con poco contraste —tipos de documentos que antes requerían un ingeniero de preprocesamiento dedicado— producen resultados fiables gracias al proceso integrado. La página de funciones de preprocesamiento enumera todos los filtros disponibles.

El PDF es un formato de entrada y salida de primera clase. La dependencia de Docnet, el asistente de conversión de BGRA a PNG, el bucle de gestión de archivos temporales, la tercera biblioteca para archivos protegidos con contraseña... todo eso desaparece. Cualquier PDF que llegue al sistema va directamente a input.LoadPdf(). Cualquier documento escaneado que necesite volverse buscable sale a través de result.SaveAsSearchablePdf(). Todo el proceso de PDF que requería más de 100 líneas en TesseractOCRse reduce a unas pocas llamadas a métodos. Explora la página de casos de uso de OCR de PDF para ver toda la gama de flujos de trabajo de PDF compatibles.

La salida estructurada reemplaza las cadenas de texto planas. result.Pages, result.Paragraphs, result.Lines, y result.Words exponen la estructura del documento con coordenadas por elemento y puntuaciones de confianza por palabra. Los flujos de trabajo que antes requerían heurísticas de análisis sintáctico para encontrar campos específicos —números de factura, fechas, importes— pueden utilizar en su lugar coordenadas a nivel de palabra y filtrado por confianza. Esta es la base para crear procesos fiables de extracción de formularios y procesamiento de documentos a partir de las funciones de resultados de OCR de IronOCR.

El despliegue deja de requerir la orquestación de tessdata. La carpeta de tessdata, los scripts de descarga curl, la capa Docker COPY ./tessdata, la configuración de caché CI/CD para archivos .traineddata — todo eso desaparece. Los lenguajes se distribuyen como paquetes NuGet, versionados, restaurados junto con el resto de las dependencias del proyecto e implementados de forma idéntica, ya sea que el destino sea una estación de trabajo de desarrollador, un contenedor Docker, un Azure App Service o un AWS Lambda. La guía de implementación de Azure y la guía de implementación de Linux proporcionan configuraciones validadas para entornos de producción.

El modelo de licencia es predecible. TesseractOCRes gratuito, pero la infraestructura que requiere no lo es: el tiempo de los desarrolladores para la implementación del preprocesamiento, la evaluación de la biblioteca PDF, la creación de scripts para el despliegue de tessdata y el mantenimiento continuo de la cadena de dependencias externas. La licencia perpetua de IronOCR($999 Lite, $1,499 Professional, $2,399 Enterprise) es un costo único que reemplaza semanas de trabajo de infraestructura y elimina la superficie de mantenimiento recurrente. El soporte comercial con una vía de respuesta garantizada sustituye a la dependencia de la cola de incidencias de GitHub de un único mantenedor voluntario.

Por favor nota: PDFium, PDFSharp, Tesseract, e iText son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Chromium Project, Google, empira Software GmbH o iText Group. Todos los nombres de productos, logotipos y marcas son propiedad de sus respectivos propietarios. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta