Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

AWS Textract vs IronOCR para España: Cumplimiento AEAT, Facturae, LOPDGDD y TicketBAI

GdPicture.NET requiere una licencia principal antes de pagar un solo dólar por el plugin OCR, y si desea leer PDFs o producir salida con capacidad de búsqueda, también necesita plugins PDF adicionales. Contacte a GdPicture para obtener precios actuales. Para un equipo que necesita extraer texto de imágenes y PDFs, el costo combinado de múltiples complementos más las tarifas de mantenimiento anuales pueden sumar significativamente. La facturación es una consecuencia directa de la arquitectura de GdPicture: se trata de una plataforma completa de procesamiento de imágenes de documentos que abarca escaneo, DICOM, anotaciones, procesamiento de códigos de barras y edición de PDF, y el OCR es solo uno de los muchos complementos disponibles. Los equipos que solo requieren OCR asumen el coste de un SDK completo de procesamiento de imágenes de documentos que nunca utilizarán por completo.

La API refleja la misma filosofía. GdPicture utiliza ID de imágenes enteros para rastrear recursos en memoria: cada imagen que cargas devuelve un int, llamas a métodos contra ese identificador entero, y luego debes liberarlo explícitamente o aceptar una fuga de memoria. Este patrón precede a IDisposable y using declaraciones. Funciona, pero traslada la responsabilidad de cada decisión de limpieza al desarrollador, siempre. Esta comparación analiza esas dos tensiones —el precio basado en complementos y el ciclo de vida del ID de imagen— junto con la complejidad de la API, el preprocesamiento y el manejo de PDF, con IronOCR como contrapunto.

Comprender GdPicture .NET

GdPicture .NET es un SDK comercial para el procesamiento de imágenes de documentos desarrollado por ORPALIS. A lo largo de muchos años, se ha desarrollado hasta convertirse en una plataforma de amplio alcance que abarca el procesamiento de imágenes, la creación y edición de PDF, la lectura y generación de códigos de barras, la integración de escáneres TWAIN/WIA, imágenes médicas DICOM, flujos de trabajo de anotación y revisión, y el archivo de documentos con conformidad con el formato PDF/A. El reconocimiento óptico de caracteres (OCR) es una de las funcionalidades de este ecosistema, que se ofrece a través de un complemento específico.

El SDK organiza su funcionalidad en módulos distintos, cada uno con su propia clase principal:

  • GdPictureImaging : carga de imágenes, procesamiento, conversión de formato y origen de todos los identificadores de imagen enteros.
  • GdPicturePDF : creación, edición, renderizado y operaciones OCR a nivel de página para archivos PDF (se requiere una licencia de complemento aparte).
  • GdPictureOCR : reconocimiento y extracción de texto; consume identificadores de imagen producidos por GdPictureImaging
  • GdPicture1DBarcode / GdPicture2DBarcode : lectura y escritura de códigos de barras lineales y 2D (licencias de complementos independientes)
  • GdPictureDocumentImaging : filtros avanzados de limpieza de documentos que incluyen corrección de inclinación, eliminación de ruido, eliminación de bordes y eliminación de perforaciones (complemento independiente).
  • GdPictureAnnotations : marcado, revisión y edición de documentos

Incluso el OCR básico requiere instanciar dos componentes: GdPictureImaging para cargar la imagen y GdPictureOCR para reconocer el texto, y gestionar ambos ciclos de vida. OCR desde un PDF requiere un tercero: GdPicturePDF. El propio espacio de nombres incluye un número de versión (GdPicture14), lo que significa que cada actualización mayor del SDK obliga a una búsqueda y reemplazo en toda la base de código.

El árbol de dependencias de complementos para escenarios comunes de OCR se ve así:

Si lo necesita Debe obtener una licencia.
Reconocimiento óptico de caracteres (OCR) a partir de imágenes Licencia básica + complemento OCR
Reconocimiento óptico de caracteres (OCR) a partir de archivos PDF Base + Plugin OCR + Plugin PDF
Salida en PDF con capacidad de búsqueda Base + Plugin OCR + Plugin PDF
Limpieza del documento antes del OCR Base + Complemento OCR + Complemento de procesamiento de imágenes de documentos

El ciclo de vida de la identificación de imágenes

La característica arquitectónica que define a GdPicture es la gestión de identificadores de imagen enteros. Cargar cualquier imagen asigna memoria dentro del tiempo de ejecución de GdPicture y devuelve un manejador de int. Utilizas ese número entero para hacer referencia a la imagen en todas las llamadas posteriores. Cuando terminas, llamas a ReleaseGdPictureImage con ese entero. Si no lo hace, la memoria no se liberará hasta que finalice el proceso.

using GdPicture14;

// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);

if (imageId == 0)
{
    throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}

try
{
    _ocr.SetImage(imageId);
    _ocr.Language = "eng";

    string resultId = _ocr.RunOCR();

    if (string.IsNullOrEmpty(resultId))
    {
        throw new Exception($"OCR failed: {_ocr.GetStat()}");
    }

    return _ocr.GetOCRResultText(resultId);
}
finally
{
    // CRITICAL: omitting this line causes a memory leak
    _imaging.ReleaseGdPictureImage(imageId);
}
using GdPicture14;

// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);

if (imageId == 0)
{
    throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}

try
{
    _ocr.SetImage(imageId);
    _ocr.Language = "eng";

    string resultId = _ocr.RunOCR();

    if (string.IsNullOrEmpty(resultId))
    {
        throw new Exception($"OCR failed: {_ocr.GetStat()}");
    }

    return _ocr.GetOCRResultText(resultId);
}
finally
{
    // CRITICAL: omitting this line causes a memory leak
    _imaging.ReleaseGdPictureImage(imageId);
}
Imports GdPicture14

' Every image load returns an integer handle
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(imagePath)

If imageId = 0 Then
    Throw New Exception($"Failed to load image: {_imaging.GetStat()}")
End If

Try
    _ocr.SetImage(imageId)
    _ocr.Language = "eng"

    Dim resultId As String = _ocr.RunOCR()

    If String.IsNullOrEmpty(resultId) Then
        Throw New Exception($"OCR failed: {_ocr.GetStat()}")
    End If

    Return _ocr.GetOCRResultText(resultId)
Finally
    ' CRITICAL: omitting this line causes a memory leak
    _imaging.ReleaseGdPictureImage(imageId)
End Try
$vbLabelText   $csharpLabel

Al procesar archivos PDF de varias páginas, cada página renderizada genera un ID de imagen independiente. Un documento de 100 páginas a 200 ppp puede consumir entre 1 y 5 GB de memoria si no se realiza la limpieza correspondiente. El patrón correcto requiere reunir todos los ID y liberarlos en un bloque finally, pero esa disciplina recae completamente en el desarrollador.

Comprender IronOCR

IronOCR es una biblioteca OCR comercial para .NET , creada como un único paquete NuGet . Su objetivo de diseño es la precisión sin sobrecarga de configuración: instala el paquete, configura una clave de licencia, llama a Read. La biblioteca integra un motor Tesseract 5 optimizado con preprocesamiento automático, manejo nativo de PDF y acceso a resultados estructurados, todo ello expuesto a través de patrones .NET estándar.

Características clave:

  • Paquete único de NuGetdotnet add package IronOcr instala todo, incluyendo soporte de idioma inglés; Sin carpetas de recursos externas, sin gestión de binarios nativos
  • Gestión de recursos estándar de .NETOcrInput implementa IDisposable; una declaración using maneja toda la limpieza independientemente de las excepciones
  • Preprocesamiento automático — Deskew, DeNoise, Contrast, Binarize, y EnhanceResolution son llamadas a métodos de una línea en OcrInput; el motor también aplica correcciones automáticas sin instrucciones explícitas
  • Entrada nativa de PDF — los PDFs escaneados y los PDFs nativos se introducen directamente en IronTesseract.Read sin un paso de renderización separado
  • Seguro para hilos por diseño — una sola instancia de IronTesseract maneja solicitudes concurrentes; Parallel.ForEach funciona sin sincronización adicional
  • 125+ idiomas — distribuidos como paquetes de NuGet separados (IronOcr.Languages.French, etc.), sin carpeta tessdata para gestionar
  • Acceso estructurado a los resultadosOcrResult expone .Pages, .Lines, .Words, .Characters, y .Barcodes como colecciones tipadas con datos de coordenadas

Pricing is perpetual: $999 Lite, $1,499 Plus, $2,999 Professional, $5,999 Unlimited. Todas las funciones están disponibles en todos los niveles; La diferencia radica en el número de desarrolladores y proyectos que abarca.

Comparación de características

Característica GdPicture.NET IronOCR
Modelo de precios Licencia perpetua basada en plugins + 20 %/año de mantenimiento Plan plano perpetuo, actualizaciones anuales opcionales
Coste de entrada (OCR a partir de archivos PDF) Se requieren múltiples complementos (contacte a GdPicture para precios) $2,999 (un paquete, todas las funcionalidades)
Gestión de recursos Seguimiento y liberación manual de ID enteros IDisposable / using declaración
Estabilidad del espacio de nombres Número de versión en el espacio de nombres (GdPicture14) Compatible con versiones anteriores (IronOcr)
OCR de PDF Requiere un complemento PDF independiente. Integrado, sin necesidad de licencia adicional.
Instalación Múltiples paquetes NuGet + carpeta de recursos externos Un único NuGet, sin archivos externos.
Multiplataforma Windows, Linux, macOS Windows, Linux, macOS, Docker, AWS, Azure

Comparación detallada de características

Característica GdPicture.NET IronOCR
Configuración e instalación
Instalación de NuGet Se requieren varios paquetes dotnet add package IronOcr
Carpeta de recursos externos Archivos de idioma obligatorios (estilo tessdata) No es obligatorio (incluido en el paquete)
Activación de licencia LicenseManager.RegisterKEY() IronOcr.License.LicenseKey = "..."
Inicialización de componentes 3-4 clases para el flujo de trabajo OCR de PDF new IronTesseract()
Espacio de nombres en actualización importante Debe actualizarse cada archivo fuente. No se requiere ningún cambio
Capacidades de OCR
OCR de imágenes
OCR de PDF Sí (se requiere el complemento PDF) Sí (integrado)
PDF protegido con contraseña
PDF de varias páginas Bucle de página manual + limpieza de ID Automático
Salida en PDF con capacidad de búsqueda OcrPage + SaveToFile result.SaveAsSearchablePdf()
Exportación hOCR No
Preprocesamiento
Inclinación Mediante el complemento GdPictureDocumentImaging input.Deskew()
Eliminación de ruido Mediante el complemento GdPictureDocumentImaging input.DeNoise()
Mejora del contraste Vía GdPictureImaging input.Contrast()
Binarización Vía GdPictureImaging input.Binarize()
Mejora de DPI Vía GdPictureImaging input.EnhanceResolution(300)
Corrección automática (sin código) No Sí (integrado en Read)
Gestión de recursos
Modelo de gestión de memoria Seguimiento manual de ID entero IDisposable / GC
riesgo de fuga de memoria Alto (falta ReleaseGdPictureImage) Ninguno (usando una instrucción)
Seguridad de los hilos Gestión manual de instancias Thread-safe por diseño
Resultados y datos
Texto sin formato GetOCRResultText(resultId) result.Text
Puntuación de confianza GetOCRResultConfidence(resultId) result.Confidence
Datos a nivel de palabra Iteración de bloques/líneas/palabras anidadas result.Words colección
Coordinar el acceso Mediante llamadas al índice de bloques/líneas/palabras Directo .X, .Y, .Width, .Height
Lectura de BarCodes durante el OCR Mediante un complemento de código de barras independiente ocr.Configuration.ReadBarCodes = true
Idiomas
Recuento de palabras Cobertura similar basada en Tesseract Más de 125 paquetes NuGet
Distribución lingüística Archivos de la carpeta de recursos Paquetes NuGet
Multilingüe en una sola pasada Sí (AddSecondaryLanguage)
Despliegue
Docker Se admite Compatible (documentado)
Linux Se admite Se admite
AWS Lambda Posible Guía documentada
Azure App Service Posible Guía documentada

Ciclo de vida de la identificación de imagen frente a la entrada OCR desechable

La diferencia arquitectónica más importante entre GdPicture e IronOCR no radica en una falta de funcionalidades, sino en cómo cada biblioteca gestiona la memoria para las imágenes que procesa.

Enfoque GdPicture

Cada imagen en GdPicture existe como un identificador entero en un grupo administrado en tiempo de ejecución. Se obtiene el identificador cargando una imagen, se pasa ese número entero al OCR y a otras operaciones, y luego se libera cuando se termina. El patrón es explícito y correcto cuando se sigue. El problema es que es fácil equivocarse, y la consecuencia es un crecimiento ilimitado de la memoria.

El flujo de trabajo de OCR de PDF demuestra el riesgo con mayor claridad. Cada llamada a pdf.RenderPageToGdPictureImage() asigna una nueva imagen rasterizada en memoria y devuelve un nuevo ID entero. Un documento de 100 páginas crea 100 asignaciones separadas. Omitir una llamada ReleaseGdPictureImage y el proceso acumula memoria perdida:

using GdPicture14;

public string ExtractTextFromPdf(string pdfPath)
{
    var text = new StringBuilder();

    using var pdf = new GdPicturePDF();

    GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
    if (status != GdPictureStatus.OK)
        throw new Exception($"Failed to load PDF: {status}");

    int pageCount = pdf.GetPageCount();

    for (int i = 1; i <= pageCount; i++)
    {
        pdf.SelectPage(i);

        // Each page render = new memory allocation + new integer ID
        int imageId = pdf.RenderPageToGdPictureImage(200, false);

        if (imageId == 0) continue;

        try
        {
            _ocr.SetImage(imageId);
            _ocr.Language = "eng";
            string resultId = _ocr.RunOCR();

            if (!string.IsNullOrEmpty(resultId))
                text.AppendLine(_ocr.GetOCRResultText(resultId));
        }
        finally
        {
            // Without this: ~10–50MB leaked per page
            _imaging.ReleaseGdPictureImage(imageId);
        }
    }

    return text.ToString();
}
using GdPicture14;

public string ExtractTextFromPdf(string pdfPath)
{
    var text = new StringBuilder();

    using var pdf = new GdPicturePDF();

    GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
    if (status != GdPictureStatus.OK)
        throw new Exception($"Failed to load PDF: {status}");

    int pageCount = pdf.GetPageCount();

    for (int i = 1; i <= pageCount; i++)
    {
        pdf.SelectPage(i);

        // Each page render = new memory allocation + new integer ID
        int imageId = pdf.RenderPageToGdPictureImage(200, false);

        if (imageId == 0) continue;

        try
        {
            _ocr.SetImage(imageId);
            _ocr.Language = "eng";
            string resultId = _ocr.RunOCR();

            if (!string.IsNullOrEmpty(resultId))
                text.AppendLine(_ocr.GetOCRResultText(resultId));
        }
        finally
        {
            // Without this: ~10–50MB leaked per page
            _imaging.ReleaseGdPictureImage(imageId);
        }
    }

    return text.ToString();
}
Imports GdPicture14
Imports System.Text

Public Function ExtractTextFromPdf(ByVal pdfPath As String) As String
    Dim text As New StringBuilder()

    Using pdf As New GdPicturePDF()
        Dim status As GdPictureStatus = pdf.LoadFromFile(pdfPath, False)
        If status <> GdPictureStatus.OK Then
            Throw New Exception($"Failed to load PDF: {status}")
        End If

        Dim pageCount As Integer = pdf.GetPageCount()

        For i As Integer = 1 To pageCount
            pdf.SelectPage(i)

            ' Each page render = new memory allocation + new integer ID
            Dim imageId As Integer = pdf.RenderPageToGdPictureImage(200, False)

            If imageId = 0 Then Continue For

            Try
                _ocr.SetImage(imageId)
                _ocr.Language = "eng"
                Dim resultId As String = _ocr.RunOCR()

                If Not String.IsNullOrEmpty(resultId) Then
                    text.AppendLine(_ocr.GetOCRResultText(resultId))
                End If
            Finally
                ' Without this: ~10–50MB leaked per page
                _imaging.ReleaseGdPictureImage(imageId)
            End Try
        Next
    End Using

    Return text.ToString()
End Function
$vbLabelText   $csharpLabel

El procesamiento por lotes en múltiples archivos PDF agrava este problema. La documentación para cada bucle for debe llevar una nota recordando a los mantenedores que recojan los ID en un List<int> y que los liberen todos en finally. Eso es trabajo de infraestructura, no trabajo de OCR.

Enfoque de IronOCR

OcrInput es un estándar IDisposable. Una declaración using garantiza la limpieza ya sea que el método devuelva normalmente o lance. No hay identificadores enteros que rastrear, ni un componente de imagen independiente que inicializar, ni un paso de renderizado DPI externo para las páginas PDF.

using IronOcr;

public string ExtractTextFromPdf(string pdfPath)
{
    // LoadPdf handles page rendering internally
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);

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

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

    return result.Text;
    // using block exits — all internal resources released automatically
}
using IronOcr;

public string ExtractTextFromPdf(string pdfPath)
{
    // LoadPdf handles page rendering internally
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);

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

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

    return result.Text;
    // using block exits — all internal resources released automatically
}
Imports IronOcr

Public Function ExtractTextFromPdf(pdfPath As String) As String
    ' LoadPdf handles page rendering internally
    Using input As New OcrInput()
        input.LoadPdf(pdfPath)

        Dim result = New IronTesseract().Read(input)

        For Each page In result.Pages
            Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
        Next

        Return result.Text
        ' using block exits — all internal resources released automatically
    End Using
End Function
$vbLabelText   $csharpLabel

Para los archivos PDF protegidos con contraseña, el parámetro es un argumento con nombre en lugar de una sobrecarga separada que requiere una comprobación de estado adicional:

using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");

var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");

var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")

    Dim result = New IronTesseract().Read(input)
    result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
$vbLabelText   $csharpLabel

La guía de entrada de PDF de IronOCR incluye opciones adicionales, como la selección de rangos de páginas. Para equipos que ya están familiarizados con patrones IDisposable en Entity Framework, HttpClient y manejo de flujos, OcrInput no requiere un nuevo modelo mental.

Costo de agrupación de complementos

Para una aplicación de servidor que extrae texto de imágenes y PDFs y produce salidas buscables, la pila de licencias de GdPicture requiere múltiples complementos. Contacte a GdPicture para obtener precios actuales para la licencia central Professional, el complemento OCR y el complemento PDF. Las tarifas de mantenimiento anuales (típicamente un porcentaje del costo total de la licencia) se acumulan con el tiempo.

IronOCR Professional cubre el mismo flujo de trabajo en un solo paquete:

IronOCR Professional: $professionalLicense (pago único)
Actualizaciones anuales opcionales: $plusLicense/año

Total a 3 años (perpetuo, sin actualizaciones): $professionalLicense

La diferencia de costos a varios años puede ser significativa dependiendo de las preferencias de actualización. Esa brecha existe porque el modelo de complementos de GdPicture tiene un precio para una plataforma completa de procesamiento de imágenes de documentos, no para cargas de trabajo centradas en el OCR. Se requiere el complemento OCR antes del complemento PDF que lo hace utilizable para el formato de entrada OCR más común.

Los equipos que evalúan GdPicture para OCR pagan por funcionalidades que rara vez aparecen en las listas de tareas pendientes centradas en OCR: integración de escáneres TWAIN/WIA, imágenes médicas DICOM, flujos de trabajo de anotación y redacción, y edición avanzada de PDF más allá de la extracción de texto. Consulte la página de licencias de IronOCR para un modelo de precios donde todas las características están disponibles en cada nivel — sin complementos, sin addons, sin decisiones de licencias por función.

Complejidad de la API y preprocesamiento

GdPicture expone el preprocesamiento a través de GdPictureImaging (contraste, binarización, escalado de resolución) y a través de un complemento GdPictureDocumentImaging separado (deskew, despeckle, eliminación de bordes). Aplicar la corrección de inclinación antes del OCR requiere la licencia del complemento de procesamiento de imágenes de documentos, lo que crea un tercer coste en la pila para cualquier flujo de trabajo que procese documentos escaneados de calidad variable.

Enfoque GdPicture

El flujo de trabajo completo para un PDF escaneado de baja calidad (carga, preprocesamiento, OCR de cada página, publicación) abarca tres clases de componentes y requiere una comprobación de estado minuciosa en cada paso:

using GdPicture14;

public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
    using var pdf = new GdPicturePDF();

    GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
    if (status != GdPictureStatus.OK)
        throw new Exception($"Load failed: {status}");

    int pageCount = pdf.GetPageCount();

    for (int i = 1; i <= pageCount; i++)
    {
        pdf.SelectPage(i);

        // OcrPage adds text layer to each page
        // Requires: OCR plugin + PDF plugin + resource folder path
        GdPictureStatus ocrStatus = pdf.OcrPage(
            "eng",
            @"C:\GdPicture\Resources\OCR",  // Carpeta de recursos externos required
            "",
            200
        );

        if (ocrStatus != GdPictureStatus.OK)
            Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
    }

    pdf.SaveToFile(outputPdf, true);
}
using GdPicture14;

public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
    using var pdf = new GdPicturePDF();

    GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
    if (status != GdPictureStatus.OK)
        throw new Exception($"Load failed: {status}");

    int pageCount = pdf.GetPageCount();

    for (int i = 1; i <= pageCount; i++)
    {
        pdf.SelectPage(i);

        // OcrPage adds text layer to each page
        // Requires: OCR plugin + PDF plugin + resource folder path
        GdPictureStatus ocrStatus = pdf.OcrPage(
            "eng",
            @"C:\GdPicture\Resources\OCR",  // Carpeta de recursos externos required
            "",
            200
        );

        if (ocrStatus != GdPictureStatus.OK)
            Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
    }

    pdf.SaveToFile(outputPdf, true);
}
Imports GdPicture14

Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
    Using pdf As New GdPicturePDF()

        Dim status As GdPictureStatus = pdf.LoadFromFile(inputPdf, False)
        If status <> GdPictureStatus.OK Then
            Throw New Exception($"Load failed: {status}")
        End If

        Dim pageCount As Integer = pdf.GetPageCount()

        For i As Integer = 1 To pageCount
            pdf.SelectPage(i)

            ' OcrPage adds text layer to each page
            ' Requires: OCR plugin + PDF plugin + resource folder path
            Dim ocrStatus As GdPictureStatus = pdf.OcrPage(
                "eng",
                "C:\GdPicture\Resources\OCR",  ' Carpeta de recursos externos required
                "",
                200
            )

            If ocrStatus <> GdPictureStatus.OK Then
                Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}")
            End If
        Next

        pdf.SaveToFile(outputPdf, True)
    End Using
End Sub
$vbLabelText   $csharpLabel

La ruta ResourceFolder no es opcional. Debe resolverse a un directorio que contenga los archivos de idioma .traineddata en tiempo de ejecución. Esa ruta funciona en la máquina de desarrollo, pero falla en producción cuando la cuenta de servicio no puede ver C:\GdPicture\Resources\OCR, o cuando la aplicación se despliega en Linux, o cuando las imágenes de Dockerno incluyen esa estructura de directorio. Depurar estos fallos a menudo significa perseguir códigos de error genéricos GdPictureStatus que dicen poco sobre la causa raíz.

Enfoque de IronOCR

El flujo de trabajo equivalente en IronOCR, que incluye el preprocesamiento para la corrección de inclinación y la eliminación de ruido, consta de cinco líneas:

using IronOcr;

public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadPdf(inputPdf);
    input.Deskew();   // No separate plugin required
    input.DeNoise();

    var result = ocr.Read(input);
    result.SaveAsSearchablePdf(outputPdf);
}
using IronOcr;

public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadPdf(inputPdf);
    input.Deskew();   // No separate plugin required
    input.DeNoise();

    var result = ocr.Read(input);
    result.SaveAsSearchablePdf(outputPdf);
}
Imports IronOcr

Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
    Dim ocr As New IronTesseract()

    Using input As New OcrInput()
        input.LoadPdf(inputPdf)
        input.Deskew()   ' No separate plugin required
        input.DeNoise()

        Dim result = ocr.Read(input)
        result.SaveAsSearchablePdf(outputPdf)
    End Using
End Sub
$vbLabelText   $csharpLabel

El soporte para el idioma inglés está integrado en el paquete NuGet . Los idiomas adicionales se instalan como paquetes de NuGet (IronOcr.Languages.French) en lugar de archivos .traineddata en una ruta del sistema de archivos. La guía de corrección de calidad de imagen y la guía de corrección de orientación de imagen cubren el conjunto completo de opciones de preprocesamiento disponibles en OcrInput.

Para el procesamiento que tiene en cuenta la confianza —por ejemplo, filtrar los resultados por debajo de un umbral antes de escribirlos en una base de datos— el objeto de resultado expone la confianza directamente:

var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");

// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
    .Where(w => w.Confidence > 85)
    .Select(w => w.Text);
var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");

// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
    .Where(w => w.Confidence > 85)
    .Select(w => w.Text);
Imports System
Imports System.Linq

Dim result = (New IronTesseract()).Read("scanned.jpg")
Console.WriteLine($"Confidence: {result.Confidence}%")

' Per-word confidence for fine-grained filtering
Dim highConfidenceWords = result.Words _
    .Where(Function(w) w.Confidence > 85) _
    .Select(Function(w) w.Text)
$vbLabelText   $csharpLabel

GdPicture requiere tres bucles anidados — bloques, líneas, palabras — para alcanzar los mismos datos, con llamadas a métodos basadas en índice en cada nivel (GetOCRResultBlockLineWordConfidence(resultId, b, l, w)). La guía práctica sobre puntuaciones de confianza demuestra el modelo de acceso estructurado para casos de uso comunes.

Acceso a datos estructurados y resultados

La extracción de coordenadas por palabra y valores de confianza es un requisito común para los flujos de trabajo de comprensión de documentos: la extracción de campos de facturas, el procesamiento de formularios y el análisis de diseño lo necesitan.

Enfoque GdPicture

GdPicture devuelve una cadena resultId desde RunOCR(), y todos los datos de resultado se consultan a través de ese ID mediante llamadas a métodos en la instancia GdPictureOCR. Para alcanzar el nivel de confianza por palabra, es necesario iterar a través de tres niveles anidados:

using GdPicture14;

public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
    var words = new List<(string, float)>();

    _ocr.SetImage(imageId);
    _ocr.Language = "eng";
    string resultId = _ocr.RunOCR();

    int blockCount = _ocr.GetOCRResultBlockCount(resultId);

    for (int b = 0; b < blockCount; b++)
    {
        int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);

        for (int l = 0; l < lineCount; l++)
        {
            int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);

            for (int w = 0; w < wordCount; w++)
            {
                string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
                float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
                words.Add((word, conf));
            }
        }
    }

    return words;
}
using GdPicture14;

public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
    var words = new List<(string, float)>();

    _ocr.SetImage(imageId);
    _ocr.Language = "eng";
    string resultId = _ocr.RunOCR();

    int blockCount = _ocr.GetOCRResultBlockCount(resultId);

    for (int b = 0; b < blockCount; b++)
    {
        int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);

        for (int l = 0; l < lineCount; l++)
        {
            int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);

            for (int w = 0; w < wordCount; w++)
            {
                string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
                float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
                words.Add((word, conf));
            }
        }
    }

    return words;
}
Imports GdPicture14

Public Function GetWordConfidences(imageId As Integer) As List(Of (word As String, confidence As Single))
    Dim words As New List(Of (String, Single))()

    _ocr.SetImage(imageId)
    _ocr.Language = "eng"
    Dim resultId As String = _ocr.RunOCR()

    Dim blockCount As Integer = _ocr.GetOCRResultBlockCount(resultId)

    For b As Integer = 0 To blockCount - 1
        Dim lineCount As Integer = _ocr.GetOCRResultBlockLineCount(resultId, b)

        For l As Integer = 0 To lineCount - 1
            Dim wordCount As Integer = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l)

            For w As Integer = 0 To wordCount - 1
                Dim word As String = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w)
                Dim conf As Single = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w)
                words.Add((word, conf))
            Next
        Next
    Next

    Return words
End Function
$vbLabelText   $csharpLabel

Esto no es incorrecto; los datos son accesibles. Pero requiere comprender y mantener un índice tridimensional de la estructura de resultados para cada proyecto que necesite datos a nivel de palabra.

Enfoque de IronOCR

OcrResult expone .Words como una colección tipada. LINQ funciona directamente en contra de ello:

using IronOcr;

var result = new IronTesseract().Read("invoice.jpg");

// All words with position and confidence
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}

// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
    Console.WriteLine(line.Text);

foreach (var page in result.Pages)
    Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
using IronOcr;

var result = new IronTesseract().Read("invoice.jpg");

// All words with position and confidence
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}

// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
    Console.WriteLine(line.Text);

foreach (var page in result.Pages)
    Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
Imports IronOcr

Dim result = New IronTesseract().Read("invoice.jpg")

' All words with position and confidence
For Each word In result.Words
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}")
Next

' Lines, paragraphs, and pages follow the same pattern
For Each line In result.Lines
    Console.WriteLine(line.Text)
Next

For Each page In result.Pages
    Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters")
Next
$vbLabelText   $csharpLabel

El OCR basado en regiones —que extrae texto de un rectángulo definido de un documento— es igualmente directo:

var region = new CropRectangle(0, 0, 600, 100); // header area

using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);

var headerText = new IronTesseract().Read(input).Text;
var region = new CropRectangle(0, 0, 600, 100); // header area

using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);

var headerText = new IronTesseract().Read(input).Text;
Imports IronOcr

Dim region As New CropRectangle(0, 0, 600, 100) ' header area

Using input As New OcrInput()
    input.LoadImage("invoice.jpg", region)

    Dim headerText As String = New IronTesseract().Read(input).Text
End Using
$vbLabelText   $csharpLabel

La guía de resultados de lectura y la guía de OCR basada en regiones muestran cómo estos patrones se extienden a documentos de varias páginas y a flujos de trabajo de extracción de campos estructurados.

Referencia de mapeo de API

GdPicture.NET Equivalente a IronOCR
LicenseManager.RegisterKEY("key") IronOcr.License.LicenseKey = "key"
new GdPictureImaging() No es necesario; se gestiona internamente.
new GdPictureOCR() new IronTesseract()
new GdPicturePDF() No requerido — OcrInput.LoadPdf() maneja esto
ocr.ResourceFolder = path No es necesario: los recursos están incluidos en NuGet.
imaging.CreateGdPictureImageFromFile(path) input.LoadImage(path) en OcrInput
imaging.ReleaseGdPictureImage(imageId) using var input = new OcrInput() — automático
ocr.SetImage(imageId) No requerido — OcrInput sostiene la imagen
ocr.Language = "eng" ocr.Language = OcrLanguage.English
ocr.RunOCR()resultId ocr.Read(input)OcrResult
ocr.GetOCRResultText(resultId) result.Text
ocr.GetOCRResultConfidence(resultId) result.Confidence
ocr.GetOCRResultBlockLineWordText(resultId, b, l, w) result.Words[i].Text
ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w) result.Words[i].Confidence
pdf.LoadFromFile(path, false)GdPictureStatus input.LoadPdf(path) — lanza en caso de fallo
pdf.LoadFromFile(path, password) input.LoadPdf(path, Password: password)
pdf.RenderPageToGdPictureImage(200, false) No es necesario:IronOCR realiza el renderizado internamente.
pdf.SelectPage(i) No es necesario: todas las páginas se procesan por defecto.
pdf.GetPageCount() No requerido — o result.Pages.Count
pdf.OcrPage("eng", resourcePath, "", 200) result.SaveAsSearchablePdf(outputPath)
pdf.SaveToFile(outputPath, true) result.SaveAsSearchablePdf(outputPath)
imaging.GetStat() / ocr.GetStat() Excepciones de .NET Standard
GdPictureStatus.OK verificar después de cada llamada No es necesario: las excepciones se propagan normalmente.
using GdPicture14; using IronOcr;

Cuando los equipos consideran migrar de GdPicture .NET a IronOCR

El OCR es el único requisito.

Los equipos que implementan sistemas de ingesta de documentos (recepción de facturas escaneadas, procesamiento de formularios médicos, extracción de texto de contratos) suelen evaluar GdPicture porque aparece en los directorios de software Enterprise junto con LEADTOOLS y Kofax. Una vez que la tabla de dependencias de los complementos quede clara, la situación cambia. El complemento PDF no es opcional si se requiere la entrada de archivos PDF. El complemento de procesamiento de imágenes de documentos no es opcional si se requiere preprocesamiento. Un equipo que necesita OCR de PDFs escaneados con corrección de deskew termina con tres licencias de complementos a un costo inicial significantemente alto de Professional. Cuando el requisito es extracción de texto y nada más en la lista de características de GdPicture es necesario, ese precio representa puro gasto.IronOCR en $2,999 Professional cubre el flujo de trabajo idéntico: entrada de imagen, entrada de PDF, preprocesamiento, salida de PDF con capacidad de búsqueda, desde un único paquete sin decisiones de complemento que tomar.

Incidentes de fugas de memoria en producción

El ciclo de vida de los identificadores enteros se convierte en un problema potencial en los servicios de procesamiento de documentos de alto rendimiento. Un punto final de API web que procesa archivos PDF cargados bajo presión eventualmente tendrá una ruta de código donde no se alcanza la llamada para liberar la imagen: un retorno prematuro en una rama de error, una excepción no controlada antes del bloque de limpieza o simplemente un nuevo desarrollador que no está familiarizado con el patrón agrega un método auxiliar que toma un identificador de imagen entero como parámetro y olvida liberarlo. La memoria aumenta, el servicio se ralentiza y la causa raíz no es evidente en un volcado de memoria. Los equipos que han depurado uno de estos incidentes suelen preferir un modelo donde el entorno de ejecución se encargue de la limpieza. El patrón de eliminación estándar en IronOCR es precisamente ese modelo: una limpieza estructurada impuesta por el compilador, en lugar de por la disciplina del desarrollador en cada llamada.

Fricción de actualización de versión

GdPicture incorpora el número de versión principal en su espacio de nombres. La actualización de la versión 14 a la versión 15 requiere actualizar esa directiva de espacio de nombres en cada archivo fuente que haga referencia a las clases GdPicture. En una aplicación de gran tamaño con OCR, manejo de PDF y procesamiento de imágenes distribuidos en docenas de servicios y clases de utilidad, esa es una tarea de migración compleja y no proporciona ningún beneficio funcional. Todas las bibliotecas .NET modernas, desde Microsoft.EntityFrameworkCore hasta Newtonsoft.Json, utilizan espacios de nombres independientes de la versión, gestionando el versionado a través del número de versión del paquete NuGet .IronOCR sigue esa convención: la misma importación de espacio de nombres se aplica desde la versión 1 hasta la versión actual.

Implementación de microservicios y contenedores

GdPicture OCR requiere que una carpeta de recursos externa que contenga archivos de datos de idioma esté presente en una ruta específica durante la ejecución. En una implementación en contenedores, esto implica integrar esos archivos en la imagen de Docker, montar un volumen o configurar un script de inicio para descargarlos. El resultado típico es una imagen de Dockerque es varios cientos de megabytes más grande de lo necesario, un elemento de la lista de verificación de implementación que se omite y fallos en producción al reiniciar contenedores limpios donde el volumen no está montado.IronOCR incluye soporte para inglés en el propio paquete; Los idiomas adicionales se instalan como paquetes NuGet que forman parte del resultado de la compilación. El contenedor obtiene lo que necesita del paso de restauración y no hay rutas que configurar. La guía de implementación de Docker y la guía de implementación de Linux cubren la configuración específica para cada entorno de destino.

Equipos de desarrollo sin experiencia en digitalización de documentos

La superficie de GdPicture es grande por necesidad, ya que abarca una plataforma completa de procesamiento de imágenes de documentos. Para un desarrollador que se incorpora a un equipo para mantener un microservicio de OCR, comprender el componente de procesamiento de imágenes, el componente de OCR, el componente de PDF, el ciclo de vida del ID entero, el manejo del código de retorno de estado y la configuración de la carpeta de recursos supone una importante inversión inicial. La interfaz de IronOCR para el reconocimiento óptico de caracteres (OCR) se compone de tres clases: el motor, el contenedor de entrada y el objeto de resultado. Ese es el modelo mental completo para el 90% de los casos de uso. La incorporación de un nuevo desarrollador implica orientarlo sobre la configuración de IronTesseract en lugar de sobre una guía del SDK con múltiples módulos.

Consideraciones comunes sobre la migración

Reemplazo de la inicialización de componentes

GdPicture requiere una secuencia de inicialización de cuatro pasos: registrar la clave de licencia a través de LicenseManager, inicializar GdPictureImaging, inicializar GdPictureOCR, y establecer la ruta de la carpeta de recursos.IronOCR reduce esto a una sola asignación de propiedad que pertenece a Program.cs o Startup.cs:

// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";

// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";

// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
' Remove
Dim lm As New LicenseManager()
lm.RegisterKEY("GDPICTURE-LICENSE-KEY")
_imaging = New GdPictureImaging()
_ocr = New GdPictureOCR()
_ocr.ResourceFolder = "C:\GdPicture\Resources\OCR"

' Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY"
' IronTesseract instances are instantiated per-use or as a singleton
$vbLabelText   $csharpLabel

Eliminación del seguimiento mediante ID de imagen

Cada llamada CreateGdPictureImageFromFile y cada llamada RenderPageToGdPictureImage tiene una llamada ReleaseGdPictureImage correspondiente en algún lugar de la base de código existente. Esas llamadas de limpieza se eliminan por completo en IronOCR— OcrInput maneja la limpieza. La migración es mecánica: encuentra cada int imageId = ..., encuentra su ReleaseGdPictureImage(imageId) emparejada, envuelve el código de carga en using var input = new OcrInput(), y reemplaza las llamadas de método de GdPicture con sus equivalentes en IronOCR.

// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);

// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);

// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
Imports System

' Remove
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(path)
If imageId = 0 Then Throw New Exception(_imaging.GetStat().ToString())
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If String.IsNullOrEmpty(resultId) Then Throw New Exception(_ocr.GetStat().ToString())
Dim text As String = _ocr.GetOCRResultText(resultId)
_imaging.ReleaseGdPictureImage(imageId)

' Replace with
Using input As New OcrInput()
    input.LoadImage(path)
    Dim result = New IronTesseract().Read(input)
    Dim text As String = result.Text
End Using
$vbLabelText   $csharpLabel

Adaptación del manejo de errores

GdPicture utiliza códigos de retorno GdPictureStatus verificados después de cada operación significativa.IronOCR genera excepciones estándar de .NET . La migración reemplaza guardias if (status != GdPictureStatus.OK) con bloques try/catch que manejan IronOcr.Exceptions.OcrException para fallos específicos de OCR y estándares IOException y FileNotFoundException para fallos de entrada. El tutorial sobre lectura de texto a partir de imágenes abarca patrones de manejo de errores para escenarios comunes.

Implementación del paquete de idioma

Los archivos de idioma de GdPicture son archivos .traineddata en una carpeta de sistema de archivos. Los paquetes de idioma de IronOCR son paquetes NuGet . La migración elimina la carpeta de recursos del manifiesto de implementación y agrega referencias de paquetes NuGet para cada idioma requerido:

# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
SHELL

La guía de múltiples idiomas cubre la configuración para documentos multilingües donde se especifican tanto los idiomas primarios como secundarios en la instancia IronTesseract.

Funcionalidades adicionales de IronOCR

Más allá de las áreas cubiertas en esta comparación,IronOCR incluye características que no tienen equivalentes directos en GdPicture en un contexto de OCR puro:

  • OCR asíncronoReadAsync para operación no bloqueante en manejadores de solicitudes de ASP.NET Core y servicios en segundo plano
  • Detección de rotación de página : detección y corrección automáticas de páginas rotadas sin procesamiento previo manual.
  • Seguimiento del progreso : eventos de progreso basados ​​en devoluciones de llamada para trabajos por lotes de larga duración expuestos a barras de progreso de la interfaz de usuario.
  • Entrada de flujoinput.LoadImage(stream) acepta System.IO.Stream directamente, evitando escrituras de archivos temporales en arquitecturas de tubería
  • Lectura especializada de documentos — manejo diseñado específicamente para pasaportes, matrículas, cheques MICR y texto manuscrito a través de la misma interfaz IronTesseract

Compatibilidad con .NET y preparación para el futuro

IronOCR está diseñado para .NET 8, .NET 9, .NET Standard 2.0 y .NET Framework 4.6.2 y versiones posteriores. El único paquete NuGet se implementa de forma idéntica en Windows x64, Windows x86, Linuxx64 y macOS. GdPicture .NET también admite destinos multiplataforma, pero su arquitectura de complementos implica que las implementaciones en Linuxy contenedores deben tener en cuenta las dependencias nativas de cada complemento individualmente. El espacio de nombres de IronOCR ha permanecido IronOcr a través de todos los cambios de versión principales, lo que significa que las rutas de actualización no requieren operaciones de búsqueda y reemplazo en toda la base de código. Con la llegada de .NET 10 a finales de 2026, el historial de IronOCR de mantener la compatibilidad entre sucesivas versiones de .NET sin que se produzcan cambios incompatibles en la API proporciona una base estable para aplicaciones con ciclos de mantenimiento prolongados.

Conclusión

GdPicture .NET es una opción legítima para equipos que necesitan una plataforma consolidada de procesamiento de imágenes de documentos: integración de escáneres, edición de PDF, anotaciones, compatibilidad con DICOM y OCR en un único SDK de un solo proveedor. Ese caso de uso existe. El modelo de complementos tiene sentido cuando la mayoría de esas capacidades están realmente dentro del alcance.

La discrepancia se produce cuando el requisito es OCR y la respuesta es GdPicture. El complemento PDF no es separable del caso de uso de OCR a partir de PDF. El complemento de procesamiento de imágenes de documentos no se puede separar del preprocesamiento. El ciclo de vida del ID entero no es opcional; es el modelo fundamental de gestión de recursos para todo el SDK. Un equipo que necesita extraer texto de archivos PDF escaneados asume toda esa complejidad y todo ese coste, y ninguna de las funcionalidades adicionales lo justifica para su carga de trabajo.

La diferencia de precios a lo largo de varios años puede ser sustancial para un flujo de trabajo Professional de un solo desarrollador. La diferencia en la complejidad del código es cuantificable: más de 25 líneas para un OCR básico con limpieza, frente a una sola. La brecha operativa —carpetas de recursos externos, espacios de nombres específicos de la versión, inicialización de múltiples componentes— se manifiesta como fricción en la implementación y tiempo de incorporación, más que como un número de líneas de código, pero es real.

IronOCR en $2,999 perpetuo ofrece los mismos resultados fundamentales de OCR: extracción de texto de imagen, procesamiento de PDF escaneados, salida de PDF con capacidad de búsqueda, 125+ idiomas, puntuación de confianza, acceso a datos estructurados, a través de patrones estándar de .NET que no requieren conocimientos especializados de SDK para mantener. Para los equipos cuyo objetivo es el reconocimiento óptico de caracteres (OCR) y no un componente de una plataforma de gestión documental más amplia, esta es la opción más adecuada.

Por favor notaGdPicture.NET, Kofax OmniPage, LEADTOOLS, y Tesseract son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Apryse, Google, Kofax, LEAD Technologies, Nutrient, o ORPALIS. 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

¿Qué es GdPicture.NET OCR?

GdPicture.NET OCR es una solución de OCR utilizada por desarrolladores y empresas para extraer texto de imágenes y documentos. Es una de las diversas opciones de OCR evaluadas junto con IronOCR para el desarrollo de aplicaciones .NET.

¿Cómo se compara IronOCR con GdPicture.NET OCR para desarrolladores .NET?

IronOCR es una biblioteca de OCR .NET nativa de NuGet que utiliza IronTesseract como motor principal. En comparación con GdPicture.NET OCR, ofrece una implementación más sencilla (sin instaladores SDK), precios fijos y una API de C# limpia sin interoperabilidad COM ni dependencias de la nube.

¿Es IronOCR más fácil de configurar que GdPicture.NET OCR?

IronOCR se instala mediante un único paquete NuGet. No hay instaladores de SDK, archivos de licencia que copiar, componentes COM que registrar ni binarios de ejecución independientes que gestionar. Todo el motor de OCR está incluido en el paquete.

¿Qué diferencias de precisión existen entre GdPicture.NET OCR y IronOCR?

IronOCR logra una alta precisión de reconocimiento para documentos comerciales estándar, facturas, recibos y formularios escaneados. Para documentos muy degradados o escrituras poco comunes, la precisión varía en función de la calidad de la fuente. IronOCR incluye filtros de preprocesamiento de imágenes para mejorar el reconocimiento en entradas de baja calidad.

¿Es IronOCR compatible con la extracción de texto en PDF?

Sí. IronOCR extrae texto tanto de PDF nativos como de imágenes PDF escaneadas en una sola llamada. También admite archivos TIFF de varias páginas, imágenes y secuencias. En el caso de los PDF escaneados, el OCR se aplica página a página con objetos de resultado por página.

¿Qué diferencia hay entre las licencias de GdPicture.NET OCR y las de IronOCR?

IronOCR utiliza una licencia perpetua de tarifa plana sin cargos por página o por escaneo. Las organizaciones que procesan grandes volúmenes de documentos pagan el mismo coste de licencia independientemente del volumen. Encontrará más información y precios por volumen en la página de licencias de IronOCR.

¿Qué idiomas admite IronOCR?

IronOCR es compatible con 127 idiomas a través de paquetes de idiomas NuGet independientes. Para añadir un idioma, basta con ejecutar el comando 'dotnet add package IronOcr.Languages.{Language}'. No es necesaria la colocación manual de archivos ni la configuración de rutas.

¿Cómo instalo IronOCR en un proyecto .NET ?

Instalación a través de NuGet: install-Package IronOcr' en la consola del gestor de paquetes o 'dotnet add package IronOcr' en la CLI. Los paquetes de idiomas adicionales se instalan del mismo modo. No se requiere ningún instalador nativo del SDK.

¿A diferencia de GdPicture.NET, IronOCR es adecuado para Docker y las implementaciones en contenedores?

Sí. IronOCR funciona en contenedores Docker a través de su paquete NuGet. La clave de licencia se establece mediante una variable de entorno. No se requieren archivos de licencia, rutas de SDK ni montajes de volumen para el propio motor de OCR.

¿Puedo probar IronOCR antes de comprarlo, en comparación con GdPicture.NET?

Sí. El modo de prueba de IronOCR procesa documentos y devuelve resultados de OCR con una marca de agua superpuesta en la salida. Puede verificar la precisión en sus propios documentos antes de adquirir una licencia.

¿Admite IronOCR la lectura de códigos de barras junto con la extracción de texto?

IronOCR se centra en la extracción de texto y el reconocimiento óptico de caracteres. Para la lectura de códigos de barras, Iron Software ofrece IronBarcode como biblioteca complementaria. Ambas están disponibles por separado o como parte del paquete Iron Suite.

¿Es fácil migrar de GdPicture.NET OCR a IronOCR?

La migración de GdPicture.NET OCR a IronOCR suele implicar la sustitución de las secuencias de inicialización por la instanciación de IronTesseract, la eliminación de la gestión del ciclo de vida de COM y la actualización de las llamadas a la API. La mayoría de las migraciones reducen significativamente la complejidad del código.

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