IRONSOFTWAREHOME
VIDEOS

Migración de Syncfusion OCR a IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 de agosto de 2026

Esta guía describe el proceso completo de migración de Syncfusion OCRProcessor a IronOCR for .NET para desarrolladores que necesitan extraer texto de documentos escaneados y archivos PDF. Cubre los cambios específicos de configuración, reescrituras de código y limpieza de implementación necesarios para reemplazar Syncfusion.PDF.OCR.Net.Core con el paquete NuGet IronOcr, con un enfoque particular en eliminar la gestión de archivos tessdata y la configuración de la ruta binaria de Tesseract que cada implementación de Syncfusion OCRrequiere.

¿Por qué migrar desde Syncfusion OCR?

Syncfusion OCR es un envoltorio de Tesseract integrado en una Suite de 1600 componentes. Para los equipos cuyo único requisito es la extracción de texto, esa arquitectura crea fricciones en todos los niveles: configuración, implementación, mantenimiento y licencias.

La carpeta tessdata sigue a cada entorno. Cada estación de trabajo del desarrollador, ejecutor de CI, servidor de ensayo y contenedor de producción necesita un directorio tessdata que contenga archivos .traineddata para cada idioma que la aplicación utiliza. Solo el inglés ocupa 23 MB para el modelo estándar o 94 MB para el mejor modelo LSTM. Una aplicación en cinco idiomas añade entre 100 y 500 MB a cada artefacto de implementación. Esa carpeta debe estar exactamente en la ruta que el constructor de OCRProcessor espera o la aplicación fallará inmediatamente al inicio. Este no es un costo de configuración única, es un costo operacional recurrente que aparece cada vez que se provisiona un nuevo entorno.

La configuración de la ruta binaria de Tesseract falla entre entornos. El constructor de OCRProcessor requiere una ruta al directorio tessdata que debe resolverse correctamente en cada plataforma de destino. La ruta que funciona en una máquina de desarrollo Windows (@"tessdata/") falla en un contenedor Linux a menos que el canal de despliegue copie explícitamente la carpeta. Las construcciones de imágenes Docker deben incluir una capa COPY tessdata/ /app/tessdata/. Los procesos de CI deben automatizar las descargas de tessdata. Los entornos aislados deben gestionar la distribución de archivos binarios por separado de la restauración de paquetes NuGet. Cada entorno añade una nueva posibilidad de discrepancia en la ruta que provoca un fallo silencioso del OCR o una excepción en tiempo de ejecución.

La arquitectura centrada en PDF impone una sobrecarga de conversión para la entrada de imágenes. El OCRProcessor de Syncfusion acepta objetos PdfLoadedDocument, no archivos de imagen. Extraer texto de un JPG requiere crear un PdfDocument, agregar una página, dibujar la imagen sobre ella, guardar a un MemoryStream, recargar como un PdfLoadedDocument, y luego ejecutar OCR — nueve operaciones antes del paso de reconocimiento de texto. Ese ciclo añade sobrecarga de ejecución y complejidad de código para cada flujo de trabajo OCR basado en imágenes.

Las licencias de la Suite generan eventos de cumplimiento motivados por el crecimiento. La licencia de comunidad de Syncfusion requiere menos de cinco desarrolladores, menos de diez empleados, menos de 1 millón de dólares de ingresos anuales y menos de 3 millones de dólares en financiación externa acumulada, todo ello simultáneamente. Cualquier límite superado invalida la licencia inmediatamente y requiere una actualización comercial por un importe de entre 995 y 1595 dólares por desarrollador al año. Un equipo de cinco desarrolladores que utiliza Syncfusion OCRde forma comercial durante tres años paga entre 14 925 y 23 925 dólares por la misma capacidad de extracción de texto que ofrece IronOCR Professional por un pago único de 2999 dólares.

La ausencia de preprocesamiento integrado implica dependencias externas para escaneos de baja calidad. Tesseract produce resultados deficientes en imágenes giradas, con ruido o de bajo contraste sin preprocesamiento. Syncfusion no expone ninguna API de preprocesamiento. Los desarrolladores que necesiten corregir la inclinación, eliminar el ruido o ajustar el contraste deben añadir una biblioteca de imágenes independiente (System.Drawing, SkiaSharp, ImageSharp), implementar los filtros y conectar la salida al proceso de ida y vuelta al PDF antes de que pueda comenzar el OCR. Eso supone una dependencia de terceros y entre 20 y 40 líneas de código adicionales para una funcionalidad que IronOCR incluye como métodos integrados.

Solo se necesita OCR, pero la suite completa está licenciada. Syncfusion incorpora Syncfusion.Pdf.Net.Core, Syncfusion.Compression.Net.Core, y otras dependencias transitivas independientemente de qué características se usen realmente. Para los equipos que crean un servicio de procesamiento de documentos especializado, ese gráfico de dependencias tiene un peso significativo —en tiempo de compilación, tamaño de la imagen del contenedor y coste de las licencias— para componentes que no tienen relevancia para la extracción de texto.

El problema fundamental

Syncfusion OCR requiere configurar una ruta del sistema de archivos tessdata antes de que sea posible realizar cualquier llamada OCR:

// Syncfusion: tessdata path required — fails in any environment where this path is wrong
private const string TessDataPath = @"tessdata/";

using var document = new PdfLoadedDocument("scanned-invoice.pdf");
using var processor = new OCRProcessor(TessDataPath);  // throws if path does not resolve
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);

var text = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
    text.AppendLine(page.ExtractText());
C#

IronOCR no requiere configuración de ruta. Los datos de idioma se incluyen en el paquete:

// IronOCR: no tessdata path, no path configuration, no folder to deploy
var text = new IronTesseract().Read("scanned-invoice.pdf").Text;
C#

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

La tabla siguiente recoge las capacidades más importantes para los equipos que migran desde Syncfusion OCR.

CaracterísticaSyncfusion OCRIronOCR
Paquete NuGetSyncfusion.PDF.OCR.Net.Core (suite)IronOcr (autónomo)
Datos de prueba requeridosSí — descarga manual y configuración de la rutaNo — incluido internamente
OCR de imagen directaNo — requiere conversión de ida y vuelta a PDFSí — LoadImage() o ruta directamente
OCR directo de PDFSí — modelo de entrada principalSí — asistencia de primera clase
Preprocesamiento automáticoNo — se requiere biblioteca externaSí — enderezar, eliminar ruido, contraste, binarizar
Salida en PDF con capacidad de búsquedaSí — guardar después de PerformOCR()Sí — result.SaveAsSearchablePdf()
Idiomas compatiblesMás de 60 mediante descarga manual de TessdataMás de 125 paquetes de lenguaje NuGet
Multilingüe simultáneoSí — banderas de bits en la enumeración LanguagesSí — AddSecondaryLanguage()
OCR basado en regionesNoSí — CropRectangle
Lectura de códigos de barrasNoSí — ocr.Configuration.ReadBarCodes = true
Salida estructuradaPáginas solo a través de page.ExtractText()Páginas, párrafos, líneas, palabras, caracteres con coordenadas
Puntuación de confianzaNoSí — result.Confidence y puntuaciones por palabra
Exportación hOCRNo
Entrada de flujoSolo a través de flujo de PDFEntrada directa de flujo para imágenes y archivos PDF
Seguridad de hilosNo documentado como seguro para subprocesosCompleto — una instancia de IronTesseract por hilo
Traducción multiplataformaSí, pero tessdata debe resolverse en cada plataformaSí — un único NuGet, sin configuración de ruta
Despliegue de DockerRequiere capa tessdata en la imagenUn único paquete, sin capas adicionales
Modelo de licenciaSuscripción anual a la Suite (995–1595 $/desarrollador/año)Perpetual (Lite $999, Pro $1,499, Enterprise $2,999)
Restricciones de la licencia comunitariaLímites de ingresos, empleados y financiación con derechos de auditoríaSin restricciones en la prueba gratuita
Motor OCRTesseract 5 (envoltura estándar)Tesseract 5 optimizado con mejoras en la precisión

Inicio rápido: Migración de Syncfusion OCRa IronOCR

Paso 1: Sustituir el paquete NuGet

Elimina Syncfusion OCRy cualquier otro paquete de Syncfusion que se haya incluido únicamente por la función de OCR:

dotnet remove package Syncfusion.PDF.OCR.Net.Core
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.Compression.Net.Core
SHELL

Instala IronOCR desde NuGet :

dotnet add package IronOcr

Paso 2: Actualizar los espacios de nombres

Sustituya las importaciones del espacio de nombres Syncfusion por el único espacio de nombres IronOCR:

// Before (Syncfusion)
using Syncfusion.OCRProcessor;
using Syncfusion.PDF;
using Syncfusion.Pdf.Parsing;

// 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";

No es necesario registrarse en la Suite. No es necesario comprobar la elegibilidad para la licencia de la comunidad. La clave es una cadena simple asignada a una propiedad estática.

Ejemplos de migración de código

Eliminación de rutas de Tessdata e inicialización del OCR

Las bases de código de Syncfusion comúnmente incluyen lógica de validación tessdata — verificando que el directorio exista y que los archivos .traineddata requeridos estén presentes antes de intentar OCR. Este código de protección existe porque la falta de un archivo tessdata provoca una excepción en tiempo de ejecución, y los incidentes de producción causados por la falta de archivos de idioma son lo suficientemente comunes como para que los equipos escriban comprobaciones defensivas.

Enfoque de Syncfusion OCR:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class DocumentOcrService
{
    // Path hardcoded — different on every deployment target
    private const string TessDataPath = @"tessdata/";

    private bool ValidateTessdataBeforeUse(string languageCode)
    {
        // Guard required because missing files cause runtime exceptions
        if (!Directory.Exists(TessDataPath))
            throw new InvalidOperationException(
                "tessdata directory not found. Download from github.com/tesseract-ocr/tessdata_best");

        string filePath = Path.Combine(TessDataPath, $"{languageCode}.traineddata");
        if (!File.Exists(filePath))
            throw new InvalidOperationException(
                $"{languageCode}.traineddata not found — file must be downloaded manually");

        return true;
    }

    public string ExtractText(string pdfPath, string languageCode = "eng")
    {
        ValidateTessdataBeforeUse(languageCode);  // defensive check before every call

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);
        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }
}
C#

Enfoque IronOCR:

using IronOcr;

public class DocumentOcrService
{
    // No tessdata path — no validation logic — no defensive checks
    public string ExtractText(string pdfPath)
    {
        return new IronTesseract().Read(pdfPath).Text;
    }
}
C#

Todo el método ValidateTessdataBeforeUse y la constante TessDataPath se eliminan. Se han eliminado los pasos del proceso de implementación que copiaban la carpeta tessdata. Se elimina el script de CI que descarga archivos .traineddata. Se ha eliminado la capa del Dockerfile que copia tessdata en la imagen del contenedor. No es necesario sustituir nada de ese código; simplemente ya no es necesario. La guía de configuración de IronTesseract cubre todas las opciones de inicialización disponibles si se necesita una configuración que vaya más allá de los valores predeterminados.

Proceso de generación de PDF con capacidad de búsqueda

La salida de PDF con capacidad de búsqueda de Syncfusion funciona llamando a PerformOCR() en un documento cargado, lo que añade una capa de texto invisible en su lugar, y luego guardando el documento modificado en un flujo. El patrón requiere gestionar dos flujos —el de entrada y el de salida— y los pasos de OCR y guardado son operaciones independientes sobre el mismo objeto de documento mutable.

Enfoque de Syncfusion OCR:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class SearchablePdfService
{
    private const string TessDataPath = @"tessdata/";

    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        // Load document — mutable: PerformOCR modifies it in place
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;

        // Step 1: OCR modifies the document object
        processor.PerformOCR(document);

        // Step 2: Save the modified document to a separate output file
        using var outputStream = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write);
        document.Save(outputStream);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        using var outputStream = new MemoryStream();
        document.Save(outputStream);
        return outputStream.ToArray();
    }
}
C#

Enfoque IronOCR:

using IronOcr;

public class SearchablePdfService
{
    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        var result = new IronTesseract().Read(inputPdfPath);
        result.SaveAsSearchablePdf(outputPdfPath);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var input = new OcrInput();
        input.LoadPdf(inputPdfPath);

        var result = new IronTesseract().Read(input);

        // SaveAsSearchablePdf also accepts a MemoryStream
        using var ms = new MemoryStream();
        result.SaveAsSearchablePdf(ms);
        return ms.ToArray();
    }
}
C#

El modelo de documento mutable que utiliza Syncfusion — donde PerformOCR() modifica el documento cargado en su lugar antes de guardar — se reemplaza por el patrón de lectura-y-luego-salida inmutable de IronOCR. El objeto OcrResult contiene el texto reconocido y puede guardarse como un PDF con capacidad de búsqueda, exportarse como texto plano o recorrerse como datos estructurados, todo desde el mismo resultado. La guía práctica en PDF con función de búsqueda y el ejemplo en PDF con función de búsqueda incluyen opciones de salida adicionales, como la configuración de cumplimiento de PDF/A.

Pipeline de OCR de PDF basado en flujos

Los servicios de producción que reciben documentos PDF mediante carga HTTP, cola de mensajes o almacenamiento de blobs suelen trabajar con flujos en lugar de rutas de archivos. Syncfusion acepta flujos a través de PdfLoadedDocument, pero la restricción del camino tessdata todavía se aplica — la carpeta tessdata debe existir en el servidor donde se procesa el flujo.

Enfoque de Syncfusion OCR:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StreamOcrService
{
    private const string TessDataPath = @"tessdata/";

    public string ExtractFromStream(Stream pdfStream)
    {
        // Stream input works, but tessdata path constraint remains
        using var document = new PdfLoadedDocument(pdfStream);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        // No native async — must wrap in Task.Run
        return await Task.Run(() => ExtractFromStream(pdfStream));
    }
}
C#

Enfoque IronOCR:

using IronOcr;

public class StreamOcrService
{
    public string ExtractFromStream(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);    // accepts Stream directly

        return new IronTesseract().Read(input).Text;
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);

        var ocr = new IronTesseract();
        var result = await ocr.ReadAsync(input);   // native async support
        return result.Text;
    }
}
C#

El método LoadPdf() en OcrInput acepta un Stream directamente, sin requerir escritura de archivos intermedios.IronOCR también proporciona un método ReadAsync() para integración asincrónica nativa — no se necesita un contenedor Task.Run(). Para controladores de API web, Azure Functions y otros patrones de servicios asíncronos, esta es una API ideal. La guía de entrada de flujos documenta todas las opciones de carga de flujos, incluidos los flujos de imágenes y los flujos TIFF de varias páginas. La guía de OCR asíncrono cubre la compatibilidad con tokens de cancelación y las devoluciones de llamada de progreso para lotes de documentos de larga duración.

Extracción estructurada de párrafos y palabras WORD

El modelo de extracción de texto de Syncfusion ofrece dos niveles: texto concatenado para el documento completo a través de result.Text, y texto por página iterando page.ExtractText(). No hay estructura de subpáginas: no hay coordenadas de WORDs, ni límites de párrafos, ni puntuaciones de confianza por token. Las aplicaciones que necesiten localizar campos específicos por posición o filtrar tokens de baja confianza deben implementar su propia lógica de análisis sintáctico sobre la cadena concatenada.

Enfoque de Syncfusion OCR:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StructuredExtractionService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<int, string> ExtractPerPage(string pdfPath)
    {
        var pageTexts = new Dictionary<int, string>();

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        // Page-level is the finest granularity available
        int pageNum = 1;
        foreach (PdfLoadedPage page in document.Pages)
        {
            pageTexts[pageNum] = page.ExtractText();
            pageNum++;
        }

        return pageTexts;
        // No word coordinates, no paragraph boundaries, no per-token confidence
    }
}
C#

Enfoque IronOCR:

using IronOcr;

public class StructuredExtractionService
{
    public void ExtractWithStructure(string pdfPath)
    {
        var result = new IronTesseract().Read(pdfPath);

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

        foreach (var page in result.Pages)
        {
            Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");

            foreach (var paragraph in page.Paragraphs)
            {
                Console.WriteLine($"  Paragraph at ({paragraph.X}, {paragraph.Y}):");
                Console.WriteLine($"  {paragraph.Text}");
            }
        }
    }

    public IEnumerable<string> ExtractHighConfidenceWords(string pdfPath, int minConfidence = 80)
    {
        var result = new IronTesseract().Read(pdfPath);

        // Per-word confidence filtering — not possible with Syncfusion's page-level model
        return result.Pages
            .SelectMany(p => p.Words)
            .Where(w => w.Confidence >= minConfidence)
            .Select(w => w.Text);
    }
}
C#

El modelo de salida estructurado muestra párrafos, líneas, palabras y caracteres con coordenadas de cuadro delimitador y puntuaciones de confianza individuales. Esto resulta especialmente útil para la extracción de campos de facturas, el análisis de formularios y la clasificación de documentos, flujos de trabajo en los que saber dónde aparece el texto en la página es tan importante como lo que dice el texto. La guía de resultados de lectura y el documento de referencia de la API OcrResult documentan el gráfico de objetos completo.

Procesamiento por lotes de documentos con ejecución en paralelo

Los servicios de OCR de gran volumen procesan decenas o cientos de documentos simultáneamente. Syncfusion no documenta OCRProcessor como seguro para hilos, lo que fuerza el procesamiento secuencial o requiere que los desarrolladores implementen su propio grupo de instancias. Las instancias de IronOCR son seguras para crear por hilo, permitiendo el uso directo con Parallel.ForEach o PLINQ sin sincronización adicional.

Enfoque de Syncfusion OCR:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class BatchOcrService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new Dictionary<string, string>();

        // Sequential processing — OCRProcessor thread safety not guaranteed
        foreach (var path in pdfPaths)
        {
            using var document = new PdfLoadedDocument(path);
            using var processor = new OCRProcessor(TessDataPath);

            processor.Settings.Language = Languages.English;
            processor.PerformOCR(document);

            var sb = new StringBuilder();
            foreach (PdfLoadedPage page in document.Pages)
                sb.AppendLine(page.ExtractText());

            results[path] = sb.ToString();
        }

        return results;
    }
}
C#

Enfoque IronOCR:

using IronOcr;

public class BatchOcrService
{
    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new ConcurrentDictionary<string, string>();

        // Parallel processing — IronTesseract is safe per-thread
        Parallel.ForEach(pdfPaths, pdfPath =>
        {
            var ocr = new IronTesseract();   // one instance per thread
            var text = ocr.Read(pdfPath).Text;
            results[pdfPath] = text;
        });

        return new Dictionary<string, string>(results);
    }
}
C#

Crear una instancia de IronTesseract por hilo es el patrón documentado para procesamiento paralelo. Sin estado compartido, sin conflictos de bloqueo, sin necesidad de infraestructura de agrupación de instancias. El ejemplo de multithreading muestra pruebas de rendimiento para tamaños típicos de lotes de documentos, y la guía de optimización de la velocidad abarca opciones de configuración del motor para cargas de trabajo sensibles a la latencia.

Referencia de mapeo de la API OCR de Syncfusion a IronOCR

Syncfusion OCREquivalente a IronOCRNotas
Syncfusion.PDF.OCR.Net.CoreIronOcrReemplazar el paquete NuGet
Syncfusion.OCRProcessorIronOcrEspacio de nombres único
Syncfusion.PdfEliminarYa no es necesario
Syncfusion.Pdf.ParsingEliminarYa no es necesario
SyncfusionLicenseProvider.RegisterLicense()IronOcr.License.LicenseKey =Asignación de cadenas, sin registro de Suite
new OCRProcessor(tessdataPath)new IronTesseract()No hay argumento de ruta
PdfLoadedDocument(filePath)Pasar la ruta directamente a ocr.Read(path)O usar OcrInput con LoadPdf()
PdfLoadedDocument(stream)input.LoadPdf(stream)El soporte de Stream es directo
processor.Settings.Language = Languages.Englishocr.Language = OcrLanguage.EnglishOcrLanguage enum
Languages.English | Languages.Frenchocr.Language = OcrLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French)El patrón aditivo sustituye a los indicadores bit a bit
processor.PerformOCR(document)ocr.Read(input)Devuelve OcrResult directamente
page.ExtractText()result.Text o result.Pages[i].TextNo se requiere bucle para el texto completo
document.Pages iteraciónresult.Pages[] arrayIncluye párrafos, palabras, caracteres
document.Save(outputStream) después de OCRresult.SaveAsSearchablePdf(path)Método específico
Lógica de validación de TessdataEliminar por completoNo hay datos de prueba para validar
Constante de ruta manual de tessdataEliminar por completoNo requerido por IronOCR
PdfBitmap conversión de imagen a PDFinput.LoadImage(imagePath)Sin conversión a PDF para el OCR de imágenes
API sin preprocesamientoinput.Deskew(), input.DeNoise(), input.Contrast()Incorporado a OcrInput

Problemas comunes de migración y soluciones

Problema 1: No se encuentra el directorio Tessdata tras cambiar de paquete

Syncfusion OCR: La comprobación de validación del directorio tessdata se escribió como una protección al inicio o por llamada. Después de eliminar Syncfusion e instalar IronOCR, este código de validación todavía compila (usa System.IO, no espacios de nombres de Syncfusion) pero ahora protege una operación que ya no existe. Dejarlo ahí es código muerto que puede confundir a futuros desarrolladores.

Solución: Eliminar por completo toda la lógica de validación de datos. Eliminar la constante TessDataPath, todas las comprobaciones Directory.Exists(TessDataPath), todas las comprobaciones File.Exists(Path.Combine(TessDataPath, ...)) y cualquier método de validación de inicio.IronOCR no lanza excepciones relacionadas con tessdata porque no hay ningún tessdata que pueda faltar:

// Delete these entirely — they have no equivalent in IronOCR
// private const string TessDataPath = @"tessdata/";
// private bool ValidateTessdata() { ... }

// The only error handling needed after migration:
try
{
    return new IronTesseract().Read(pdfPath).Text;
}
catch (FileNotFoundException)
{
    throw new ArgumentException($"PDF file not found: {pdfPath}");
}
C#

Problema 2: Archivos de idioma no disponibles en tiempo de ejecución

Syncfusion OCR: Los archivos .traineddata de idioma se desplegaron como artefactos del sistema de archivos, marcados como CopyToOutputDirectory en el .csproj, y copiados por el sistema de construcción. Después de eliminar la carpeta tessdata del proyecto, los pasos de CI relacionados con el idioma y entradas .csproj pueden todavía referenciar los archivos eliminados, causando advertencias de construcción o fallos en la canalización.

Solución: Eliminar todas las entradas relacionadas con tessdata de los archivos .csproj y las definiciones de la canalización CI. Instala los paquetes de idioma como paquetes NuGet en su lugar:

# Languages install as NuGet packages — no manual file management
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
SHELL
// Language configuration after migration
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-report.pdf");
C#

La guía de múltiples idiomas cubre la instalación de paquetes de idioma y los valores de enumeración OcrLanguage para todos los más de 125 idiomas soportados.

Problema 3: El orden de los bytes en los archivos PDF con capacidad de búsqueda difiere

Syncfusion OCR: El PDF con capacidad de búsqueda se produjo llamando a document.Save(stream) después de que PerformOCR() mutara el documento. Es posible que algunos consumidores posteriores de la matriz de bytes hayan sido programados para esperar la estructura de PDF específica de Syncfusion, los campos de metadatos o la cadena del productor.

Solución: La SaveAsSearchablePdf() de IronOCR produce un PDF estándar con una capa de texto. Pruebe el resultado con sus consumidores finales (visores de PDF, índices de búsqueda, sistemas de archivo) para verificar la compatibilidad. Si se requiere un resultado idéntico byte a byte, una prueba de transición que compare la extraibilidad del texto (no los bytes sin procesar) es el criterio de aceptación adecuado:

// Verify the searchable PDF contains the expected text
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("output-searchable.pdf");

// Validation: confirm text layer is present and readable
var verificationText = new IronTesseract().Read("output-searchable.pdf").Text;
Assert.True(verificationText.Contains("expected content"));
C#

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

Syncfusion OCR: Algunos equipos intentan la migración dejando los archivos tessdata en la imagen de Docker como medida de precaución durante las pruebas. Esto da como resultado que tanto la capa tessdata como el paquete IronOCR estén presentes en la imagen, lo que aumenta innecesariamente el tamaño de la misma.

Solución: Eliminar la capa COPY tessdata del Dockerfile antes de construir la imagen migrada. El paquete IronOCR es autónomo. La guía de implementación de Docker proporciona imágenes base verificadas y configuraciones para los destinos Alpine, Debian y Ubuntu:

# Eliminar this layer entirely after migration
# COPY tessdata/ /app/tessdata/

#IronOCR requires only the standard .NET runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourService.dll"]
Text

Problema 5: El patrón de dos pasos PerformOCR / ExtractText no tiene un equivalente directo

Syncfusion OCR: Algún código de llamada pasa una referencia PdfLoadedDocument entre métodos — un método llama a PerformOCR() y otro llama a ExtractText() — confiando en la mutación de estado del objeto documento. Este patrón no existe en IronOCR porque Read() devuelve un objeto de resultado auto contenido.

Solución: Refactorizar cualquier patrón de OCR/separado en un único método que acepte una ruta de archivo o flujo y devuelva un OcrResult. El objeto resultante contiene todo: texto, páginas, párrafos, nivel de confianza y la posibilidad de guardar como PDF con capacidad de búsqueda:

// Replace split PerformOCR / ExtractText pattern
public OcrResult ProcessDocument(string pdfPath)
{
    // One call, immutable result, all data available
    return new IronTesseract().Read(pdfPath);
}

// Callers decide what they need from the result
var result = service.ProcessDocument("contract.pdf");
var fullText = result.Text;
var confidence = result.Confidence;
result.SaveAsSearchablePdf("contract-searchable.pdf");
C#

Problema 6: El código de registro de la licencia de la comunidad permanece tras la migración

Syncfusion OCR: La llamada a Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense() al inicio de la aplicación registra la licencia de la suite. Esta llamada se encuentra a menudo en Program.cs, Startup.cs, o un inicializador estático. Tras eliminar los paquetes de Syncfusion, esta línea provoca un error de compilación.

Solución: Eliminar la llamada SyncfusionLicenseProvider.RegisterLicense() y reemplazarla con la inicialización de licencia IronOCR. Elimine también cualquier referencia a la lógica de elegibilidad de licencias comunitarias, a la documentación de cumplimiento normativo o a comentarios sobre umbrales de ingresos y de empleados, ya que ninguno de esos conceptos se aplica a IronOCR:

// Eliminar (causes compile error after package removal)
// Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("SYNCFUSION-KEY");

// Add at application startup
IronOcr.License.LicenseKey = "YOUR-IRONOCR-KEY";
C#

Lista de verificación para la migración de Syncfusion OCR

Pre-Migración

Revise el código fuente para identificar todos los usos de Syncfusion OCRantes de realizar cambios:

# Find all Syncfusion namespace imports
grep -r "using Syncfusion" --include="*.cs" .

# Find OCRProcessor usage
grep -r "OCRProcessor\|PerformOCR\|PdfLoadedDocument\|ExtractText" --include="*.cs" .

# Find tessdata path references
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .

# Find Syncfusion license registration
grep -r "SyncfusionLicenseProvider\|RegisterLicense" --include="*.cs" .

# Find csproj tessdata copy rules
grep -r "tessdata\|traineddata" --include="*.csproj" .

# Find Dockerfile tessdata layers
grep -r "tessdata" Dockerfile* docker-compose*.yml .
SHELL

Haga un inventario de los resultados antes de escribir cualquier código. Tenga en cuenta qué archivos contienen llamadas OCR, cuáles contienen validación de tessdata y qué definiciones de canalización hacen referencia a la carpeta tessdata.

Migración de código

  1. Eliminar Syncfusion.PDF.OCR.Net.Core, Syncfusion.Pdf.Net.Core, y paquetes relacionados de todos los archivos .csproj.
  2. Ejecutar dotnet add package IronOcr en cada proyecto que realice OCR.
  3. Instalar paquetes de idioma a través de NuGet para cualquier idioma no inglés utilizado: dotnet add package IronOcr.Languages.[Language].
  4. Eliminar la constante private const string TessDataPath de todas las clases de servicio.
  5. Eliminar todos los métodos de validación tessdata (ValidateTessdata() y guardas similares).
  6. Reemplazar SyncfusionLicenseProvider.RegisterLicense() con IronOcr.License.LicenseKey = "YOUR-KEY" al inicio de la aplicación.
  7. Reemplazar using Syncfusion.OCRProcessor; using Syncfusion.PDF; using Syncfusion.Pdf.Parsing; with using IronOcr;.
  8. Reemplazar cada inicialización new OCRProcessor(TessDataPath) con new IronTesseract().
  9. Reemplazar cadenas PdfLoadedDocument + processor.PerformOCR() + page.ExtractText() con ocr.Read(path).Text.
  10. Sustituya los indicadores de idioma en formato binario de Syncfusion (Languages.English |Llamadas Idiomas.Francés plus ocr.AddSecondaryLanguage()`.
  11. Reemplazar document.Save(stream) después de PerformOCR() con result.SaveAsSearchablePdf(path) para salida de PDF con capacidad de búsqueda.
  12. Reemplazar viajes de ida y vuelta de conversión de imagen a PDF con input.LoadImage(imagePath) o ocr.Read(imagePath) directo.
  13. Eliminar entradas CopyToOutputDirectory tessdata de todos los archivos .csproj.
  14. Eliminar los pasos de descarga de tessdata de todas las definiciones de canalizaciones de CI/CD.
  15. Eliminar capas COPY tessdata de todos los Dockerfiles.

Posmigración

  • Comprueba que el OCR de PDF genere el contenido de texto esperado en los mismos documentos de muestra utilizados antes de la migración.
  • Verificar que el OCR de imágenes (JPG, PNG, BMP) funcione sin necesidad de convertir a PDF.
  • Confirme que los documentos multilingües se reconocen correctamente utilizando los paquetes de idiomas de NuGet instalados.
  • Prueba el resultado del PDF con capacidad de búsqueda abriendo el archivo generado en un visor de PDF y comprobando que la selección de texto y la búsqueda funcionan.
  • Ejecute la aplicación en un contenedor Docker nuevo creado a partir del archivo Dockerfile actualizado para confirmar que no se producen errores de inicio relacionados con tessdata.
  • Confirmar que la aplicación inicia sin una llamada Syncfusion.Licensing o cualquier referencia al espacio de nombres Syncfusion.
  • Verificar que result.Confidence devuelve un valor plausible (típicamente 80–99% para documentos limpios) para confirmar que el motor OCR está activo.
  • Prueba el procesamiento por lotes en paralelo ejecutando llamadas OCR simultáneas y verificando que no haya excepciones de subprocesos ni resultados dañados.
  • Compare la precisión de la extracción de texto en escaneos de baja calidad o girados antes y después de la migración, observando la mejora aportada por el proceso de preprocesamiento automático.

Principales ventajas de migrar a IronOCR

La complejidad de despliegue se reduce a un solo paquete NuGet. Después de la migración, cada entorno — estación de trabajo del desarrollador, ejecutor de CI, contenedor de ensayo, servidor de producción — requiere exactamente una cosa: el paquete NuGet IronOcr restaurado por el sistema de construcción. No hay carpeta tessdata. No hay que configurar ninguna ruta del sistema de archivos. Sin scripts de descarga de archivos de idioma. Sin capas de Dockerfile que contengan entre 100 y 500 MB de datos binarios. Las imágenes de contenedor son más pequeñas, los procesos de CI son más sencillos y los nuevos entornos se aprovisionan correctamente en la primera compilación sin intervención manual.

Los costes de licencia se vuelven predecibles y no recurrentes. La compra de una licencia perpetua única sustituye al ciclo de renovación anual por desarrollador. Un equipo de cinco desarrolladores que adquiera IronOCR Professional (2999 $) será propietario de la biblioteca IronOCR de forma indefinida, con un año de actualizaciones incluido. No hay umbrales de ingresos que supervisar, ni límites de plantilla que controlar, ni disposiciones de auditoría, ni documentación de cumplimiento que mantener. Los acontecimientos relacionados con el crecimiento —nuevos contratistas, grandes contratos, rondas de financiación— no dan lugar a revisiones de las licencias.

La canalización OCR maneja documentos degradados sin dependencias externas. Deskew, denoise, mejora de contraste, binarización y escalado de resolución están disponibles como métodos en OcrInput. No se necesita ninguna biblioteca de imágenes independiente. Los documentos con una ligera rotación, ruido de escáner o bajo contraste que antes requerían una etapa de preprocesamiento utilizando System.Drawing o SkiaSharp ahora pueden gestionarse dentro de la misma llamada a IronOCR. La guía de corrección de la calidad de la imagen y la página de funciones de preprocesamiento documentan todos los filtros disponibles y su efecto en la precisión del reconocimiento.

La salida estructurada permite inteligencia de documentos a nivel de campo. El objeto OcrResult expone la estructura completa del documento — páginas, párrafos, líneas, palabras y caracteres — con coordenadas del cuadro delimitador y puntuaciones de confianza por token. Las aplicaciones que antes analizaban cadenas de texto concatenadas para encontrar los límites de los campos pueden, en su lugar, utilizar directamente los datos de coordenadas de párrafos y palabras. Los flujos de trabajo de procesamiento de facturas, extracción de formularios y clasificación de documentos obtienen acceso a información espacial que el modelo a nivel de página de Syncfusion no puede proporcionar. La página de casos de uso de OCR de PDF cubre patrones comunes de inteligencia documental.

El procesamiento por lotes paralelo escala sin infraestructura. Crear una instancia de IronTesseract por hilo es la estrategia de enhebrado completa — sin agrupamiento de instancias, sin gestión de semáforos, sin restricciones de procesamiento secuencial. Un servicio de procesamiento por lotes que procese 500 documentos por hora puede saturar los núcleos de CPU disponibles con Parallel.ForEach y una única línea de sincronización. La arquitectura de motor autónomo significa que cada subproceso opera de forma independiente sin un estado mutable compartido.

Hay más de 125 idiomas disponibles sin necesidad de gestionar archivos binarios. Cada paquete de idioma se instala como un paquete NuGet a través del gestor de paquetes estándar. La gestión de versiones, la obtención de actualizaciones y la resolución de dependencias se gestionan mediante las mismas herramientas que gestionan el resto de dependencias del proyecto. Agregar OCR Japonés o Árabe a un servicio requiere un solo comando dotnet add package, no una descarga manual desde un repositorio GitHub seguida de actualizaciones de la canalización de despliegue. El índice de idiomas enumera todos los scripts compatibles con los comandos de instalación.

Por favor nota: Syncfusion y Tesseract son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Google o Syncfusion. 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.

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