Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

¿Qué biblioteca de Tesseract OCR deberías elegir? Una comparación de desarrolladores entre las tres mejores opciones

Veryfi envía sus números de cuenta bancaria, números de ruta, montos de transacciones y relaciones con proveedores a un servidor de nube de terceros cada vez que llama a _client.ProcessDocumentAsync(bytes). Esa es la realidad arquitectónica que define toda la evaluación de Veryfi: antes de que se reciba una sola línea de JSON estructurado, sus documentos de gastos, que contienen algunos de los datos financieros más sensibles de su organización, ya han salido de su infraestructura. Para muchos equipos, ahí termina la evaluación.

Entendiendo Veryfi

Veryfi es una API de inteligencia documental basada en la nube, diseñada exclusivamente para documentos financieros y de gastos. La principal ventaja del producto es su salida estructurada: en lugar de texto OCR sin procesar que requiere análisis posterior, una llamada a la API de Muy fi devuelve campos preextraídos: nombre del proveedor, total, partidas, impuestos, los últimos cuatro dígitos de la tarjeta de pago y, en el caso de las facturas, números de cuenta bancaria y de ruta. Los modelos están preentrenados con grandes volúmenes de documentos financieros y afirman tener una precisión superior al 99 % en las categorías de documentos que admiten.

La arquitectura es puramente en la nube. Cada documento sale de tu aplicación, a través de HTTPS, llega a los servidores de Veryfi, pasa por su sistema de IA/aprendizaje automático y regresa en formato JSON. No existe opción de implementación local, ni modo aislado de la red, ni forma de procesar un documento sin transmitirlo externamente.

Características arquitectónicas clave:

  • Procesamiento solo en la nube: cada documento se sube a api.veryfi.com sin ruta de procesamiento local
  • Autenticación de cuatro credenciales: VeryfiClient requiere clientId, clientSecret, username y apiKey, cuatro secretos para gestionar, almacenar de manera segura y rotar
  • Precios por documento: Contacta a Muy fi para conocer las tarifas actuales por tipo de documento y nivel de volumen
  • API exclusivamente asíncrona: ProcessDocumentAsync es el método principal; no hay ruta sincrónica
  • Alcance de la documentación especializada: recibos, facturas, cheques, extractos bancarios, formularios W-2 y tarjetas de visita; Los documentos generales, los historiales médicos, los contratos y los dibujos técnicos quedan fuera de la cobertura confiable.
  • Esquema JSON propietario: el formato de respuesta de Muy fi es específico de Veryfi; cambiar de proveedor requiere reescribir la lógica de extracción
  • Limitación de velocidad: El procesamiento de alto volumen requiere lógica de retroceso y reintento para manejar las respuestas HTTP 429.

Procesamiento de recibos Veryfi

El SDK de Muy fi expone un único método principal para el procesamiento de documentos:

using Veryfi;

public class VeryfiReceiptService
{
    private readonly VeryfiClient _client;

    public VeryfiReceiptService(string clientId, string clientSecret,
                                string username, string apiKey)
    {
        // Four credentials required — four secrets to manage
        _client = new VeryfiClient(clientId, clientSecret, username, apiKey);
    }

    public async Task<ReceiptData> ProcessReceiptAsync(string imagePath)
    {
        // Receipt image leaves your infrastructure here

        var imageBytes = File.ReadAllBytes(imagePath);
        var base64Image = Convert.ToBase64String(imageBytes);

        var response = await _client.ProcessDocumentAsync(
            fileData: base64Image,
            fileName: Path.GetFileName(imagePath)
        );

        return new ReceiptData
        {
            VendorName   = response.Vendor?.Name,
            Total        = response.Total,
            Date         = response.Date,
            Tax          = response.Tax,
            PaymentType  = response.Payment?.Type,
            CardLastFour = response.Payment?.Last4,
            LineItems    = response.LineItems?.Select(li => new LineItem
            {
                Description = li.Description,
                Quantity    = li.Quantity,
                UnitPrice   = li.UnitPrice,
                Total       = li.Total
            }).ToList()
        };
    }
}
using Veryfi;

public class VeryfiReceiptService
{
    private readonly VeryfiClient _client;

    public VeryfiReceiptService(string clientId, string clientSecret,
                                string username, string apiKey)
    {
        // Four credentials required — four secrets to manage
        _client = new VeryfiClient(clientId, clientSecret, username, apiKey);
    }

    public async Task<ReceiptData> ProcessReceiptAsync(string imagePath)
    {
        // Receipt image leaves your infrastructure here

        var imageBytes = File.ReadAllBytes(imagePath);
        var base64Image = Convert.ToBase64String(imageBytes);

        var response = await _client.ProcessDocumentAsync(
            fileData: base64Image,
            fileName: Path.GetFileName(imagePath)
        );

        return new ReceiptData
        {
            VendorName   = response.Vendor?.Name,
            Total        = response.Total,
            Date         = response.Date,
            Tax          = response.Tax,
            PaymentType  = response.Payment?.Type,
            CardLastFour = response.Payment?.Last4,
            LineItems    = response.LineItems?.Select(li => new LineItem
            {
                Description = li.Description,
                Quantity    = li.Quantity,
                UnitPrice   = li.UnitPrice,
                Total       = li.Total
            }).ToList()
        };
    }
}
Imports Veryfi
Imports System.IO
Imports System.Threading.Tasks

Public Class VeryfiReceiptService
    Private ReadOnly _client As VeryfiClient

    Public Sub New(clientId As String, clientSecret As String, username As String, apiKey As String)
        ' Four credentials required — four secrets to manage
        _client = New VeryfiClient(clientId, clientSecret, username, apiKey)
    End Sub

    Public Async Function ProcessReceiptAsync(imagePath As String) As Task(Of ReceiptData)
        ' Receipt image leaves your infrastructure here

        Dim imageBytes = File.ReadAllBytes(imagePath)
        Dim base64Image = Convert.ToBase64String(imageBytes)

        Dim response = Await _client.ProcessDocumentAsync(
            fileData:=base64Image,
            fileName:=Path.GetFileName(imagePath)
        )

        Return New ReceiptData With {
            .VendorName = response.Vendor?.Name,
            .Total = response.Total,
            .Date = response.Date,
            .Tax = response.Tax,
            .PaymentType = response.Payment?.Type,
            .CardLastFour = response.Payment?.Last4,
            .LineItems = response.LineItems?.Select(Function(li) New LineItem With {
                .Description = li.Description,
                .Quantity = li.Quantity,
                .UnitPrice = li.UnitPrice,
                .Total = li.Total
            }).ToList()
        }
    End Function
End Class
$vbLabelText   $csharpLabel

Las facturas aumentan la sensibilidad. El mismo patrón de ProcessDocumentAsync transmite documentos que con frecuencia contienen números de cuenta bancaria, números de ruta, identificaciones tributarias de proveedores y términos de pago:

public async Task<InvoiceData> ProcessInvoiceAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // Invoice uploaded to Muy fi — banking details included
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        fileName: Path.GetFileName(pdfPath),
        categories: new[] { "invoices" }
    );

    return new InvoiceData
    {
        InvoiceNumber    = response.InvoiceNumber,
        VendorName       = response.Vendor?.Name,
        VendorTaxId      = response.Vendor?.TaxId,       // transmitted
        Total            = response.Total,
        DueDate          = response.DueDate,
        PaymentTerms     = response.PaymentTerms,
        BankAccountNumber = response.BankAccount?.AccountNumber, // transmitted
        BankRoutingNumber = response.BankAccount?.RoutingNumber  // transmitted
    };
}
public async Task<InvoiceData> ProcessInvoiceAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // Invoice uploaded to Muy fi — banking details included
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        fileName: Path.GetFileName(pdfPath),
        categories: new[] { "invoices" }
    );

    return new InvoiceData
    {
        InvoiceNumber    = response.InvoiceNumber,
        VendorName       = response.Vendor?.Name,
        VendorTaxId      = response.Vendor?.TaxId,       // transmitted
        Total            = response.Total,
        DueDate          = response.DueDate,
        PaymentTerms     = response.PaymentTerms,
        BankAccountNumber = response.BankAccount?.AccountNumber, // transmitted
        BankRoutingNumber = response.BankAccount?.RoutingNumber  // transmitted
    };
}
Imports System.IO
Imports System.Threading.Tasks

Public Async Function ProcessInvoiceAsync(pdfPath As String) As Task(Of InvoiceData)
    Dim pdfBytes = File.ReadAllBytes(pdfPath)

    ' Invoice uploaded to Muy fi — banking details included
    Dim response = Await _client.ProcessDocumentAsync(
        fileData:=pdfBytes,
        fileName:=Path.GetFileName(pdfPath),
        categories:=New String() {"invoices"}
    )

    Return New InvoiceData With {
        .InvoiceNumber = response.InvoiceNumber,
        .VendorName = response.Vendor?.Name,
        .VendorTaxId = response.Vendor?.TaxId,       ' transmitted
        .Total = response.Total,
        .DueDate = response.DueDate,
        .PaymentTerms = response.PaymentTerms,
        .BankAccountNumber = response.BankAccount?.AccountNumber, ' transmitted
        .BankRoutingNumber = response.BankAccount?.RoutingNumber  ' transmitted
    }
End Function
$vbLabelText   $csharpLabel

El punto final del estado de cuenta bancario es el más sensible. Llamar a ProcessDocumentAsync con categories: new[] { "bank_statements" } transmite números de cuenta completos, números de ruta, historial de transacciones completo, saldos iniciales y finales, y detalles de transferencia bancaria a la infraestructura de Veryfi.

Comprender IronOCR

IronOCR es una biblioteca OCR comercial para .NET que se instala localmente y procesa cada documento en la propia plataforma. Ningún byte del documento sale de su infraestructura. La biblioteca integra un motor Tesseract 5 optimizado con preprocesamiento automático, compatibilidad nativa con PDF y más de 125 paquetes de idiomas, todo ello distribuido como un único paquete NuGet con licencia perpetua.

Características clave:

  • Diseñado para su uso en las instalaciones del cliente: todo el procesamiento se realiza en su propio hardware; No se realizan llamadas de red para OCR.
  • Preprocesamiento automático: Corrección de inclinación, reducción de ruido, contraste, binarización y mejora de la resolución se aplican automáticamente sin configuración explícita.
  • Entrada de PDF nativo: lea PDFs escaneados y digitales directamente a través de LoadPdf(), no se requiere biblioteca PDF separada
  • Licenciamiento perpetuo: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited, pague una vez, procese documentos ilimitados
  • Acceso estructurado a los resultados: Palabras, líneas, párrafos y páginas con coordenadas X/Y y puntuaciones de confianza por palabra.
  • Seguro para hilos y paralelizable: Instancias de IronTesseract se pueden usar entre hilos sin sincronización adicional
  • Más de 125 idiomas: Se instalan como paquetes NuGet , no se requiere la gestión de la carpeta tessdata.
  • Multiplataforma: Windows, Linux, macOS, Docker, AWS, Azure: un solo paquete cubre todas las plataformas.

Comparación de características

Característica Muy fi IronOCR
Ubicación de los datos Servidores en la nube Muy fi Su infraestructura
Modelo de despliegue Solo API en la nube Local
Modelo de precios Por documento (contacta a Muy fi para conocer los precios) Licencia perpetua ($5,999)
Soporte sin conexión No
Alcance del documento Solo documentos de gastos Cualquier tipo de documento
Configuración 4 credenciales de API 1 clave de licencia

Comparación detallada de características

Característica Muy fi IronOCR
Privacidad de datos
Los documentos salen de la infraestructura Sí (en cada llamada) Nunca
Implementación en entorno aislado No es posible Totalmente compatible
Procesamiento en las instalaciones No es posible Comportamiento por defecto
Cumple con la normativa HIPAA (no requiere BAA). No (se requiere BAA)
Compatible con ITAR/CMMC Complejo
Soporte de documentos
Procesamiento de recibos Sí (especializado) Sí (mediante OCR + extracción)
Procesamiento de facturas Sí (especializado) Sí (mediante OCR + extracción)
Procesamiento de extractos bancarios Sí (especializado) Sí (mediante OCR + extracción)
Documentos comerciales generales malos resultados
historiales médicos No soportado
Contratos legales Limitado
Tipos de documentos personalizados/arbitrarios Se requiere capacitación remunerada Cualquier tipo
PDF de varias páginas
Técnico
Requiere internet Sí (todos los documentos) No
API síncrona disponible No
Preprocesamiento de imágenes Automático (nube) Automático (local)
Entrada de PDF (nativa)
Salida en PDF con capacidad de búsqueda No
Lectura de códigos de barras No
OCR basado en la región No
Puntuaciones de confianza Por campo Por palabra y en general
Desarrollo
Credenciales para gestionar 4 (clientId, clientSecret, username, apiKey) 1 (clave de licencia)
Complejidad de las pruebas unitarias Requiere simular HTTP Pruebas locales directas
Tratamiento de errores Códigos de estado HTTP + VeryfiApiException Excepciones locales de .NET
Soporte de idiomas Limitado más de 125 idiomas
Coste
Límite de costos Ninguno sin límite contractual Precio de la licencia
Costo a alto volumen Escala linealmente Departamento

Protección de datos en documentos financieros

Los documentos financieros procesados ​​por Muy fi incluyen las categorías de datos más sensibles de cualquier organización. No se trata de una preocupación teórica, sino de un hecho arquitectónico concreto sobre cómo funciona el producto.

Enfoque Veryfi

Cada llamada de API de Muy fi transmite bytes de documento sobre HTTPS a api.veryfi.com. Los datos extraídos de esos documentos (números de cuenta, números de ruta, historiales de transacciones, números de identificación fiscal de proveedores, detalles de tarjetas de pago y patrones de gasto) son procesados ​​por la infraestructura de Veryfi. La residencia de datos, las políticas de retención, las cadenas de subprocesadores y los procedimientos de respuesta ante violaciones de seguridad se rigen por los términos de Veryfi, no por los suyos.

// Procesamiento de extractos bancarios — critical sensitivity
public async Task<BankStatementData> ProcessBankStatementAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // AT THIS POINT: full financial history leaves your infrastructure
    // Account numbers, transaction history, balances — all transmitted
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        categories: new[] { "bank_statements" }
    );

    return new BankStatementData
    {
        AccountNumber  = response.AccountNumber,  // critical — transmitted
        RoutingNumber  = response.RoutingNumber,  // critical — transmitted
        OpeningBalance = response.OpeningBalance,
        ClosingBalance = response.ClosingBalance,
        Transactions   = response.Transactions?.Select(t => new Transaction
        {
            Date        = t.Date,
            Description = t.Description,
            Amount      = t.Amount,
            Balance     = t.RunningBalance
        }).ToList()
    };
}
// Procesamiento de extractos bancarios — critical sensitivity
public async Task<BankStatementData> ProcessBankStatementAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // AT THIS POINT: full financial history leaves your infrastructure
    // Account numbers, transaction history, balances — all transmitted
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        categories: new[] { "bank_statements" }
    );

    return new BankStatementData
    {
        AccountNumber  = response.AccountNumber,  // critical — transmitted
        RoutingNumber  = response.RoutingNumber,  // critical — transmitted
        OpeningBalance = response.OpeningBalance,
        ClosingBalance = response.ClosingBalance,
        Transactions   = response.Transactions?.Select(t => new Transaction
        {
            Date        = t.Date,
            Description = t.Description,
            Amount      = t.Amount,
            Balance     = t.RunningBalance
        }).ToList()
    };
}
Imports System.IO
Imports System.Threading.Tasks

' Procesamiento de extractos bancarios — critical sensitivity
Public Async Function ProcessBankStatementAsync(pdfPath As String) As Task(Of BankStatementData)
    Dim pdfBytes = File.ReadAllBytes(pdfPath)

    ' AT THIS POINT: full financial history leaves your infrastructure
    ' Account numbers, transaction history, balances — all transmitted
    Dim response = Await _client.ProcessDocumentAsync(
        fileData:=pdfBytes,
        categories:=New String() {"bank_statements"}
    )

    Return New BankStatementData With {
        .AccountNumber = response.AccountNumber,  ' critical — transmitted
        .RoutingNumber = response.RoutingNumber,  ' critical — transmitted
        .OpeningBalance = response.OpeningBalance,
        .ClosingBalance = response.ClosingBalance,
        .Transactions = If(response.Transactions?.Select(Function(t) New Transaction With {
            .Date = t.Date,
            .Description = t.Description,
            .Amount = t.Amount,
            .Balance = t.RunningBalance
        }).ToList(), Nothing)
    }
End Function
$vbLabelText   $csharpLabel

Veryfi posee las certificaciones SOC 2 Tipo II, GDPR y HIPAA (con Acuerdo de Asociado Comercial). Estas certificaciones confirman que Muy fi cumple con las prácticas de seguridad que ha declarado. Esto no significa que sus datos permanezcan bajo su control, que usted controle la residencia de los datos o que los subprocesadores de Muy fi no tengan acceso a ellos. Para las organizaciones que cumplen con los niveles 2 o superiores de CMMC, ITAR, SOX o GLBA, la incorporación de Muy fi como procesador de datos introduce un alcance de cumplimiento que requiere una revisión legal y una supervisión continua.

Enfoque de IronOCR

IronOCR procesa documentos sin transmisión de red. El motor OCR se ejecuta en su hardware. Los extractos bancarios, las facturas con números de ruta y los cheques con números de cuenta nunca salen de su servidor:

using IronOcr;
using System.Text.RegularExpressions;

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

public class LocalFinancialDocumentProcessor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public BankStatementResult ProcessBankStatement(string pdfPath)
    {
        // All processing on your infrastructure
        // No network calls — no external access
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);

        var result = _ocr.Read(input);
        var text   = result.Text;

        // Account numbers stay on your server
        return new BankStatementResult
        {
            AccountNumber = ExtractAccountNumber(text),
            Balance       = ExtractBalance(text),
            RawText       = text,
            Confidence    = result.Confidence
        };
    }

    private string ExtractAccountNumber(string text)
    {
        var match = Regex.Match(text,
            @"Account\s*#?\s*:?\s*(\d{4,})",
            RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private decimal? ExtractBalance(string text)
    {
        var match = Regex.Match(text,
            @"Balance:?\s*\$?([\d,]+\.?\d*)",
            RegexOptions.IgnoreCase);
        if (match.Success && decimal.TryParse(
            match.Groups[1].Value.Replace(",", ""), out var bal))
            return bal;
        return null;
    }
}
using IronOcr;
using System.Text.RegularExpressions;

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

public class LocalFinancialDocumentProcessor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public BankStatementResult ProcessBankStatement(string pdfPath)
    {
        // All processing on your infrastructure
        // No network calls — no external access
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);

        var result = _ocr.Read(input);
        var text   = result.Text;

        // Account numbers stay on your server
        return new BankStatementResult
        {
            AccountNumber = ExtractAccountNumber(text),
            Balance       = ExtractBalance(text),
            RawText       = text,
            Confidence    = result.Confidence
        };
    }

    private string ExtractAccountNumber(string text)
    {
        var match = Regex.Match(text,
            @"Account\s*#?\s*:?\s*(\d{4,})",
            RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private decimal? ExtractBalance(string text)
    {
        var match = Regex.Match(text,
            @"Balance:?\s*\$?([\d,]+\.?\d*)",
            RegexOptions.IgnoreCase);
        if (match.Success && decimal.TryParse(
            match.Groups[1].Value.Replace(",", ""), out var bal))
            return bal;
        return null;
    }
}
Imports IronOcr
Imports System.Text.RegularExpressions

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

Public Class LocalFinancialDocumentProcessor
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ProcessBankStatement(pdfPath As String) As BankStatementResult
        ' All processing on your infrastructure
        ' No network calls — no external access
        Using input As New OcrInput()
            input.LoadPdf(pdfPath)

            Dim result = _ocr.Read(input)
            Dim text = result.Text

            ' Account numbers stay on your server
            Return New BankStatementResult With {
                .AccountNumber = ExtractAccountNumber(text),
                .Balance = ExtractBalance(text),
                .RawText = text,
                .Confidence = result.Confidence
            }
        End Using
    End Function

    Private Function ExtractAccountNumber(text As String) As String
        Dim match = Regex.Match(text,
                                "Account\s*#?\s*:?\s*(\d{4,})",
                                RegexOptions.IgnoreCase)
        Return If(match.Success, match.Groups(1).Value, Nothing)
    End Function

    Private Function ExtractBalance(text As String) As Decimal?
        Dim match = Regex.Match(text,
                                "Balance:?\s*\$?([\d,]+\.?\d*)",
                                RegexOptions.IgnoreCase)
        If match.Success AndAlso Decimal.TryParse(
            match.Groups(1).Value.Replace(",", ""), bal) Then
            Return bal
        End If
        Return Nothing
    End Function
End Class
$vbLabelText   $csharpLabel

En entornos con altos requisitos de cumplimiento normativo, el procesamiento local elimina por completo el alcance de las auditorías de terceros. No BAA con IronOCR. No se divulgan datos de subprocesadores. No se plantean preguntas sobre la residencia de los datos. Consulte la guía de configuración de IronTesseract para obtener información sobre la configuración de implementación en entornos Windows, Linux, Docker y entornos aislados de la red.

Alcance especializado frente a alcance generalista OCR

El enfoque limitado de Muy fi en los documentos es a la vez su mayor fortaleza y su limitación más importante. Los modelos preentrenados ofrecen resultados realmente rápidos y estructurados para los tipos de documentos específicos para los que fueron creados. El problema surge en el momento en que su organización necesita OCR fuera de esa lista.

Enfoque Veryfi

Veryfi funciona bien dentro de su nicho. Envíe una imagen del recibo y la respuesta contendrá el proveedor, el total, los impuestos, el método de pago y los detalles de los artículos; no se requiere ninguna expresión regular por su parte. Pero el alcance termina en el límite de los gastos y los documentos financieros. El archivo README lo documenta directamente: los documentos comerciales generales, los historiales médicos, los dibujos técnicos, los documentos multilingües y los tipos de formularios personalizados que no pertenecen al conjunto entrenado producen resultados deficientes o requieren una capacitación de pago sobre modelos personalizados.

Las organizaciones reales rara vez procesan una sola categoría de documentos. Los departamentos de recursos humanos procesan los formularios de incorporación de empleados. Los equipos legales necesitan el texto del contrato. Los equipos de operaciones se encargan de los documentos de envío y los formularios de logística. Cada categoría que queda fuera del alcance de Muy fi obliga a incorporar una segunda solución a la pila:

// Veryfi: works for invoices, fails for shipping manifests
var invoiceResponse = await _client.ProcessDocumentAsync(
    fileData: invoiceBytes,
    categories: new[] { "invoices" }
);

// For anything outside the supported list, you need a second tool
// Contracts: limited support
// Medical forms: not supported
// Shipping documents: not supported
// Custom forms: paid training required
// Veryfi: works for invoices, fails for shipping manifests
var invoiceResponse = await _client.ProcessDocumentAsync(
    fileData: invoiceBytes,
    categories: new[] { "invoices" }
);

// For anything outside the supported list, you need a second tool
// Contracts: limited support
// Medical forms: not supported
// Shipping documents: not supported
// Custom forms: paid training required
Imports System.Threading.Tasks

' Veryfi: works for invoices, fails for shipping manifests
Dim invoiceResponse = Await _client.ProcessDocumentAsync(
    fileData:=invoiceBytes,
    categories:=New String() {"invoices"}
)

' For anything outside the supported list, you need a second tool
' Contracts: limited support
' Medical forms: not supported
' Shipping documents: not supported
' Custom forms: paid training required
$vbLabelText   $csharpLabel

Enfoque de IronOCR

IronOCR procesa cualquier tipo de documento. La lógica de extracción la escribes tú, lo que significa que maneja exactamente los campos que contienen tus documentos, y no la suposición de un modelo preentrenado sobre qué campos son comunes en todos los documentos de gastos. La misma instancia de IronTesseract procesa recibos, contratos, formularios médicos, documentos de envío y formularios internos personalizados:

using IronOcr;

var ocr = new IronTesseract();

// Receipts
var receiptResult = ocr.Read("receipt.jpg");
var receiptTotal  = ExtractTotal(receiptResult.Text);

// Contracts — not in Veryfi's scope
using var contractInput = new OcrInput();
contractInput.LoadPdf("contract.pdf");
var contractResult = ocr.Read(contractInput);
var parties        = ExtractContractParties(contractResult.Text);

// Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
var medicalResult = ocr.Read("patient-intake-form.jpg");
var patientName   = medicalResult.Lines.FirstOrDefault()?.Text;

// Shipping documents
var shipResult    = ocr.Read("bill-of-lading.jpg");
var trackingNum   = ExtractPattern(shipResult.Text, @"Tracking\s*#?\s*:?\s*(\w+)");
using IronOcr;

var ocr = new IronTesseract();

// Receipts
var receiptResult = ocr.Read("receipt.jpg");
var receiptTotal  = ExtractTotal(receiptResult.Text);

// Contracts — not in Veryfi's scope
using var contractInput = new OcrInput();
contractInput.LoadPdf("contract.pdf");
var contractResult = ocr.Read(contractInput);
var parties        = ExtractContractParties(contractResult.Text);

// Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
var medicalResult = ocr.Read("patient-intake-form.jpg");
var patientName   = medicalResult.Lines.FirstOrDefault()?.Text;

// Shipping documents
var shipResult    = ocr.Read("bill-of-lading.jpg");
var trackingNum   = ExtractPattern(shipResult.Text, @"Tracking\s*#?\s*:?\s*(\w+)");
Imports IronOcr

Dim ocr As New IronTesseract()

' Receipts
Dim receiptResult = ocr.Read("receipt.jpg")
Dim receiptTotal = ExtractTotal(receiptResult.Text)

' Contracts — not in Veryfi's scope
Using contractInput As New OcrInput()
    contractInput.LoadPdf("contract.pdf")
    Dim contractResult = ocr.Read(contractInput)
    Dim parties = ExtractContractParties(contractResult.Text)
End Using

' Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
Dim medicalResult = ocr.Read("patient-intake-form.jpg")
Dim patientName = medicalResult.Lines.FirstOrDefault()?.Text

' Shipping documents
Dim shipResult = ocr.Read("bill-of-lading.jpg")
Dim trackingNum = ExtractPattern(shipResult.Text, "Tracking\s*#?\s*:?\s*(\w+)")
$vbLabelText   $csharpLabel

Para los campos de facturas y recibos que siguen patrones consistentes, la extracción de datos estructurados de IronOCR proporciona posicionamiento a nivel de palabra que hace que la lógica de extracción sea precisa. La colección result.Lines, ordenada por posición Y, extrae de manera confiable los nombres de los proveedores de los encabezados de recibos. Los filtros de corrección de calidad de imagen gestionan los recibos arrugados, descoloridos o fotografiados que se generan en los flujos de trabajo de gastos reales.

Costo por documento en la nube frente a licencia perpetua

La diferencia de coste entre los compuestos Muy fi e IronOCR por cada documento procesado. El modelo de Veryfi, basado en el pago por documento, implica que los costes aumentan en proporción exacta al volumen, sin límite máximo a menos que se negocie uno contractualmente.

Enfoque Veryfi

Veryfi cobra por documento. La tarifa depende del tipo de documento y el nivel de volumen — contacta a Muy fi para conocer los precios actuales. Los costos crecen en proporción directa al volumen sin techo a menos que negocies uno contractualmente, y no hay reducción en años posteriores independientemente de cuánto tiempo hayas sido cliente.

// This method call costs money — every time
// Costs accumulate with every document processed
var response = await _client.ProcessDocumentAsync(bytes);
// This method call costs money — every time
// Costs accumulate with every document processed
var response = await _client.ProcessDocumentAsync(bytes);
' This method call costs money — every time
' Costs accumulate with every document processed
Dim response = Await _client.ProcessDocumentAsync(bytes)
$vbLabelText   $csharpLabel

Los costos ocultos aumentan el total: la limitación de velocidad en HTTP 429 obliga a aplicar una lógica de reintento; Los cambios en la versión de la API requieren actualizaciones del SDK; La revisión de seguridad del acuerdo de procesamiento de datos añade tiempo legal; y se aplican cargos adicionales cuando el volumen estacional supera las estimaciones del plan.

Enfoque de IronOCR

La licencia de IronOCR es una compra única. La licencia Professional en $2,999 cubre a 10 desarrolladores, procesa documentos ilimitados por mes y no requiere renovación para continuar procesando. El segundo año no tiene ningún coste de procesamiento. El año 5 no tiene ningún coste de procesamiento.

// Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// This processes 50,000 documents/month at $0 marginal cost
foreach (var documentPath in documentBatch)
{
    var result = ocr.Read(documentPath);
    ProcessExtractedData(result.Text, result.Lines);
}
// Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// This processes 50,000 documents/month at $0 marginal cost
foreach (var documentPath in documentBatch)
{
    var result = ocr.Read(documentPath);
    ProcessExtractedData(result.Text, result.Lines);
}
Imports IronOcr

' Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim ocr As New IronTesseract()

' This processes 50,000 documents/month at $0 marginal cost
For Each documentPath In documentBatch
    Dim result = ocr.Read(documentPath)
    ProcessExtractedData(result.Text, result.Lines)
Next
$vbLabelText   $csharpLabel

La comparación de 3 años a altos volúmenes de documentos:IronOCR totaliza $2,999 más un estimado de 8–16 horas de tiempo de desarrollo para construir patrones de extracción, mientras que los costos de Muy fi se acumulan con cada documento procesado. El punto de equilibrio suele ocurrir dentro de los primeros meses de uso dependiendo del volumen.

Para los equipos que actualmente invierten en OCR en la nube, la página de licencias de IronOCR incluye detalles sobre los niveles y la opción de suscripción SaaS disponible para los equipos que prefieren la facturación anual.

Webhook y procesamiento asíncrono frente a resultados locales síncronos

La arquitectura en la nube de Muy fi impone un modelo de procesamiento exclusivamente asíncrono. El documento se envía a un servidor remoto, se procesa mediante una canalización remota y la respuesta llega tras un viaje de ida y vuelta por la red. Para el procesamiento por lotes de alto volumen, Muy fi recomienda la notificación mediante webhook en lugar del sondeo.IronOCR se procesa de forma síncrona por defecto, sin dependencia de red en el bucle.

Enfoque Veryfi

Todo el procesamiento de Muy fi es asíncrono porque está basado en la nube. El método ProcessDocumentAsync inicia una llamada HTTP, espera a que el pipeline de Muy fi complete y devuelve el resultado. La latencia total incluye la transmisión de red, el tiempo de espera en la infraestructura de Veryfi, la inferencia del modelo y la transmisión de la respuesta.

// Muy fi error categories reflect cloud dependencies
public async Task<ReceiptData> ProcessWithHandlingAsync(string path)
{
    try
    {
        var bytes    = File.ReadAllBytes(path);
        var response = await _client.ProcessDocumentAsync(bytes);
        return MapToReceiptData(response);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 401)
    {
        // Credential failure — check all four credentials
        throw new Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 402)
    {
        // Plan quota exceeded — processing halted until billing resolved
        throw new Exception("Quota exceeded. Check plan limits and billing.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 429)
    {
        // Rate limited — requires exponential backoff implementation
        throw new Exception("Rate limit exceeded. Implement retry with backoff.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 500)
    {
        // Muy fi infrastructure failure — your processing is down
        throw new Exception("Veryfi server error. Processing unavailable.", ex);
    }
}
// Muy fi error categories reflect cloud dependencies
public async Task<ReceiptData> ProcessWithHandlingAsync(string path)
{
    try
    {
        var bytes    = File.ReadAllBytes(path);
        var response = await _client.ProcessDocumentAsync(bytes);
        return MapToReceiptData(response);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 401)
    {
        // Credential failure — check all four credentials
        throw new Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 402)
    {
        // Plan quota exceeded — processing halted until billing resolved
        throw new Exception("Quota exceeded. Check plan limits and billing.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 429)
    {
        // Rate limited — requires exponential backoff implementation
        throw new Exception("Rate limit exceeded. Implement retry with backoff.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 500)
    {
        // Muy fi infrastructure failure — your processing is down
        throw new Exception("Veryfi server error. Processing unavailable.", ex);
    }
}
Imports System.IO
Imports System.Threading.Tasks

Public Class Example
    ' Muy fi error categories reflect cloud dependencies
    Public Async Function ProcessWithHandlingAsync(path As String) As Task(Of ReceiptData)
        Try
            Dim bytes = File.ReadAllBytes(path)
            Dim response = Await _client.ProcessDocumentAsync(bytes)
            Return MapToReceiptData(response)
        Catch ex As VeryfiApiException When ex.StatusCode = 401
            ' Credential failure — check all four credentials
            Throw New Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex)
        Catch ex As VeryfiApiException When ex.StatusCode = 402
            ' Plan quota exceeded — processing halted until billing resolved
            Throw New Exception("Quota exceeded. Check plan limits and billing.", ex)
        Catch ex As VeryfiApiException When ex.StatusCode = 429
            ' Rate limited — requires exponential backoff implementation
            Throw New Exception("Rate limit exceeded. Implement retry with backoff.", ex)
        Catch ex As VeryfiApiException When ex.StatusCode = 500
            ' Muy fi infrastructure failure — your processing is down
            Throw New Exception("Veryfi server error. Processing unavailable.", ex)
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Las interrupciones en la red detienen el procesamiento. Los incidentes en la infraestructura de Muy fi detienen el procesamiento. Los límites de velocidad detienen el procesamiento. Cada una de ellas es una dependencia externa que su aplicación no puede controlar.

Enfoque de IronOCR

IronOCR se procesa de forma síncrona sin depender de la red. El resultado está disponible inmediatamente después de que Read() regresa, sin necesidad de sondeo, configuración de webhook ni lógica de reintento para fallos de red.

using IronOcr;

var ocr = new IronTesseract();

// Synchronous — result immediately available
// No network, no quota, no rate limits
var result = ocr.Read("receipt.jpg");

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

// Word-level positioning for precise field extraction
foreach (var line in result.Lines)
{
    Console.WriteLine($"Y={line.Y}: {line.Text}");
}
using IronOcr;

var ocr = new IronTesseract();

// Synchronous — result immediately available
// No network, no quota, no rate limits
var result = ocr.Read("receipt.jpg");

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

// Word-level positioning for precise field extraction
foreach (var line in result.Lines)
{
    Console.WriteLine($"Y={line.Y}: {line.Text}");
}
Imports IronOcr

Dim ocr As New IronTesseract()

' Synchronous — result immediately available
' No network, no quota, no rate limits
Dim result = ocr.Read("receipt.jpg")

Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")

' Word-level positioning for precise field extraction
For Each line In result.Lines
    Console.WriteLine($"Y={line.Y}: {line.Text}")
Next
$vbLabelText   $csharpLabel

Para aplicaciones que necesitan comportamiento asíncrono por la capacidad de respuesta de la IU,IronOCR también soporta OCR asíncrono a través del envoltorio Task.Run o la superficie del API asíncrono. La diferencia radica en que en IronOCR, la asincronía es un patrón de concurrencia, no un requisito impuesto por una llamada remota. Una interrupción de la red a las 2 de la madrugada no detiene su proceso por lotes.

Para los flujos de trabajo de escaneo de recibos, el tutorial de escaneo de recibos y la guía de OCR de facturas cubren la implementación completa de patrones de extracción. Los índices de confianza proporcionan señales de fiabilidad por palabra que ayudan a detectar escaneos de baja calidad antes de enviar los datos extraídos a un sistema posterior.

Referencia de mapeo de API

Muy fi Equivalente a IronOCR
new VeryfiClient(clientId, clientSecret, username, apiKey) new IronTesseract() + IronOcr.License.LicenseKey = "key"
_client.ProcessDocumentAsync(bytes) ocr.Read(filePath) o ocr.Read(ocrInput)
_client.ProcessDocumentAsync(bytes, categories: new[] { "invoices" }) input.LoadPdf(pdfPath); ocr.Leer(entrada)
response.Vendor?.Name result.Lines.FirstOrDefault()?.Text
response.Total ExtractTotal(result.Text) a través de Regex
response.Date ExtractDate(result.Text) a través de Regex
response.LineItems result.Lines con extracción posicional
response.InvoiceNumber Regex.Match(result.Text, @"Invoice\s*#?\s*:?\s*(\w+)")
response.ConfidenceScore result.Confidence
response.Payment?.Last4 Regex.Match(result.Text, @"\d{4}$")
response.BankAccount?.AccountNumber Regex.Match(result.Text, @"Account\s*#?\s*:?\s*(\d+)")
VeryfiApiException (HTTP 401/402/429/500) Excepciones estándar de .NET (locales, sin códigos de red)
Codificación Base64 antes de la carga No requerido — ocr.Read(filePath) acepta rutas de archivos directamente
Cuatro credenciales en configuración Clave de licencia única

Cuando los equipos consideran migrar de Muy fi a IronOCR

La soberanía de los datos se convierte en algo innegociable.

El motivo más común para evaluar IronOCR es una auditoría de cumplimiento o una revisión legal que revela a Muy fi como procesador de datos para registros financieros confidenciales. Una evaluación de HIPAA determina que los documentos de gastos que contienen información de salud protegida (PHI) requieren un Acuerdo de Asociado Comercial con Muy fi y una supervisión de auditoría continua. Una evaluación CMMC de nivel 2 identifica los documentos financieros transmitidos a través de la nube como una posible deficiencia. Un equipo legal desaconseja enviar datos de gastos de clientes a terceros. En cada caso, el camino hacia el cumplimiento normativo consiste en eliminar la transmisión externa de datos, lo que implica sustituir Muy fi por un sistema OCR local. El modelo de procesamiento local de IronOCR cumple con estos requisitos por defecto: sin BAA, sin cadena de subprocesadores, sin alcance de auditoría de terceros.

Los tipos de documentos van más allá de los gastos.

Las organizaciones que adoptan Muy fi para la automatización de gastos suelen descubrir, en un plazo de 6 a 12 meses, que los equipos adyacentes necesitan OCR para documentos que no forman parte del conjunto de datos de entrenamiento de Veryfi. El departamento de Recursos Humanos necesita que se procesen los formularios de incorporación. Se ha extraído el texto del contrato de necesidades legales. El departamento de operaciones necesita tener registrados los datos del conocimiento de embarque. Cada nueva categoría de documento produce resultados deficientes en el punto final de uso general de Veryfi, requiere un entrenamiento de modelo personalizado de pago o fuerza la incorporación de una segunda solución OCR a la infraestructura. Una única licencia de IronOCR gestiona todas estas funciones con la misma API. El tutorial sobre la lectura de documentos específicos abarca estrategias de extracción para diseños de formularios estructurados.

Los costos por documento superan el umbral del caso de negocio.

Los equipos que procesan 25.000 documentos o más al mes suelen encontrar que el periodo de amortización de IronOCR es inferior a tres meses. A altos volúmenes de documentos, la licencia Professional de IronOCR en $2,999 se paga típicamente dentro del primer mes de gasto equivalente en Veryfi. Los equipos financieros que realizan análisis del coste total de propiedad sobre los precios de la nube por documento inevitablemente llegan a esta comparación. El proceso de migración —que consiste en crear patrones de extracción de expresiones regulares para los campos específicos que necesita el equipo— suele durar entre 8 y 24 horas, dependiendo de la complejidad del documento y del número de tipos de documentos distintos en el flujo de trabajo.

Entornos sin conexión y desconectados

Las organizaciones de servicios de campo, los lugares de trabajo remotos, las aplicaciones móviles de captura de gastos y los entornos gubernamentales aislados de la red comparten un requisito común: el OCR debe funcionar sin conexión a Internet. Muy fi es arquitectónicamente incapaz de satisfacer este requisito: cualquier llamada de procesamiento de documentos falla sin una conexión de red.IronOCR procesa los datos sin conexión a internet por diseño. Un técnico de campo que utiliza una aplicación móvil para el control de gastos, una planta de fabricación con una red protegida por un cortafuegos y un contratista de defensa en una instalación de información clasificada (SCIF) pueden ejecutar IronOCR sin modificaciones. La guía de implementación de Docker y la guía de implementación de Linux cubren entornos de contenedores donde la salida de red está restringida.

Dependencia del proveedor y del esquema

El esquema de respuesta JSON de Muy fi es propietario. Cada línea de código de extracción que lee el nombre del proveedor, el total, el número de ruta o los campos de la línea de artículo es código que solo funciona con Veryfi. Cambiar a una API en la nube de la competencia, o a una solución local, requiere reescribir toda la lógica de extracción. Las organizaciones que negocian contratos plurianuales con Muy fi descubren esta dependencia cuando cambian los precios o se modifica la hoja de ruta del producto. La lógica de extracción de IronOCR lee el texto sin formato utilizando expresiones regulares estándar de .NET : es portátil y no está vinculada al esquema de ningún proveedor.

Consideraciones comunes sobre la migración

Sustitución de la salida estructurada por la extracción de patrones

Veryfi devuelve campos preanalizados;IronOCR devuelve el texto OCR sin procesar. El trabajo de migración consiste en escribir los patrones de extracción que Muy fi utilizaba en su nube. Para recibos y facturas con diseños uniformes, esto es sencillo:

using IronOcr;
using System.Text.RegularExpressions;

var ocr    = new IronTesseract();
var result = ocr.Read("receipt.jpg");
var text   = result.Text;

// Vendor: first non-empty line, ordered by Y position
var vendor = result.Lines
    .OrderBy(l => l.Y)
    .Select(l => l.Text.Trim())
    .FirstOrDefault(t => !string.IsNullOrWhiteSpace(t) && t.Length > 3);

// Total: pattern matching against common receipt labels
decimal? total = null;
foreach (var pattern in new[] {
    @"Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Amount Due:?\s*\$?\s*([\d,]+\.?\d*)" })
{
    var match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    if (match.Success && decimal.TryParse(
        match.Groups[1].Value.Replace(",", ""), out var t))
    {
        total = t;
        break;
    }
}

// Tax
var taxMatch = Regex.Match(text,
    @"(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase);
using IronOcr;
using System.Text.RegularExpressions;

var ocr    = new IronTesseract();
var result = ocr.Read("receipt.jpg");
var text   = result.Text;

// Vendor: first non-empty line, ordered by Y position
var vendor = result.Lines
    .OrderBy(l => l.Y)
    .Select(l => l.Text.Trim())
    .FirstOrDefault(t => !string.IsNullOrWhiteSpace(t) && t.Length > 3);

// Total: pattern matching against common receipt labels
decimal? total = null;
foreach (var pattern in new[] {
    @"Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Amount Due:?\s*\$?\s*([\d,]+\.?\d*)" })
{
    var match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    if (match.Success && decimal.TryParse(
        match.Groups[1].Value.Replace(",", ""), out var t))
    {
        total = t;
        break;
    }
}

// Tax
var taxMatch = Regex.Match(text,
    @"(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase);
Imports IronOcr
Imports System.Text.RegularExpressions

Dim ocr As New IronTesseract()
Dim result = ocr.Read("receipt.jpg")
Dim text = result.Text

' Vendor: first non-empty line, ordered by Y position
Dim vendor = result.Lines _
    .OrderBy(Function(l) l.Y) _
    .Select(Function(l) l.Text.Trim()) _
    .FirstOrDefault(Function(t) Not String.IsNullOrWhiteSpace(t) AndAlso t.Length > 3)

' Total: pattern matching against common receipt labels
Dim total As Decimal? = Nothing
For Each pattern In {
    "Total:?\s*\$?\s*([\d,]+\.?\d*)",
    "Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    "Amount Due:?\s*\$?\s*([\d,]+\.?\d*)"
}
    Dim match = Regex.Match(text, pattern, RegexOptions.IgnoreCase)
    If match.Success AndAlso Decimal.TryParse(match.Groups(1).Value.Replace(",", ""), total) Then
        Exit For
    End If
Next

' Tax
Dim taxMatch = Regex.Match(text,
    "(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase)
$vbLabelText   $csharpLabel

Para recibos con diseños inusuales o impresión borrosa, los filtros de preprocesamiento de IronOCR mejoran la precisión de los datos brutos antes de que se ejecute la extracción. Consulte la guía de corrección de calidad de imagen y la guía de corrección de color de imagen para obtener información sobre cómo gestionar la calidad de escaneo de recibos reales.

Cómo gestionar la transición de asíncrono a síncrono

Toda la interfaz API de Muy fi es asíncrona. La ruta principal de IronOCR es síncrona. Las firmas de métodos asíncronos existentes en el código de la aplicación se pueden conservar mediante el encapsulado:

// Preserve async signature during transition
public async Task<ReceiptResult> ProcessReceiptAsync(string path)
{
    // Run IronOCR on a background thread
    return await Task.Run(() =>
    {
        var result = _ocr.Read(path);
        return new ReceiptResult
        {
            Vendor = result.Lines.FirstOrDefault()?.Text,
            Total  = ExtractTotal(result.Text),
            Date   = ExtractDate(result.Text)
        };
    });
}
// Preserve async signature during transition
public async Task<ReceiptResult> ProcessReceiptAsync(string path)
{
    // Run IronOCR on a background thread
    return await Task.Run(() =>
    {
        var result = _ocr.Read(path);
        return new ReceiptResult
        {
            Vendor = result.Lines.FirstOrDefault()?.Text,
            Total  = ExtractTotal(result.Text),
            Date   = ExtractDate(result.Text)
        };
    });
}
Imports System.Threading.Tasks

Public Async Function ProcessReceiptAsync(path As String) As Task(Of ReceiptResult)
    ' Run IronOCR on a background thread
    Return Await Task.Run(Function()
                              Dim result = _ocr.Read(path)
                              Return New ReceiptResult With {
                                  .Vendor = result.Lines.FirstOrDefault()?.Text,
                                  .Total = ExtractTotal(result.Text),
                                  .Date = ExtractDate(result.Text)
                              }
                          End Function)
End Function
$vbLabelText   $csharpLabel

Para escenarios de alto rendimiento,IronOCR es seguro para hilos y varias instancias de IronTesseract pueden procesar documentos en paralelo sin sincronización. La guía de optimización de velocidad abarca patrones de reutilización de instancias y estrategias de carga por lotes que minimizan el tiempo de procesamiento a gran escala.

Limpieza de credenciales

Veryfi requiere cuatro credenciales: ClientId, ClientSecret, Username y ApiKey. Los cuatro elementos deben eliminarse de los archivos de configuración, las variables de entorno, los almacenes de claves y las canalizaciones de CI/CD después de la migración.IronOCR requiere una única clave de licencia. La lista de verificación de migración: elimine los cuatro secretos de Muy fi de cada entorno, añada una única variable de entorno IRONOCR_LICENSE y actualice las pipelines de despliegue para eliminar la inyección de credenciales de Veryfi.

Procesamiento de PDF para facturas

Veryfi acepta bytes de PDF a través de ProcessDocumentAsync.IronOCR procesa PDFs de manera nativa a través de OcrInput.LoadPdf():

// Multi-page invoice PDF — all pages processed locally
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");

var result       = new IronTesseract().Read(input);
var invoiceText  = result.Text;
var invoiceNumber = Regex.Match(invoiceText,
    @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)",
    RegexOptions.IgnoreCase).Groups[1].Value;
// Multi-page invoice PDF — all pages processed locally
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");

var result       = new IronTesseract().Read(input);
var invoiceText  = result.Text;
var invoiceNumber = Regex.Match(invoiceText,
    @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)",
    RegexOptions.IgnoreCase).Groups[1].Value;
Imports System.Text.RegularExpressions
Imports IronOcr

' Multi-page invoice PDF — all pages processed locally
Dim input As New OcrInput()
input.LoadPdf("invoice.pdf")

Dim result = New IronTesseract().Read(input)
Dim invoiceText As String = result.Text
Dim invoiceNumber As String = Regex.Match(invoiceText, _
    "Invoice\s*#?\s*:?\s*(\w+[-\w]*)", _
    RegexOptions.IgnoreCase).Groups(1).Value
$vbLabelText   $csharpLabel

Para flujos de trabajo de facturación que producen archivos PDF archivables buscables, el método SaveAsSearchablePdf() de IronOCR genera salida compatible con PDF/A a partir de entrada escaneada, una capacidad que la API en la nube de Muy fi no proporciona. Consulte la guía de PDF buscable para detalles de implementación.

Funcionalidades adicionales de IronOCR

Más allá de las áreas de comparación básicas,IronOCR ofrece capacidades que están completamente fuera del alcance de Veryfi:

  • Extracción de tablas : Lectura de tablas estructuradas a partir de documentos con diseños de cuadrícula, aplicable a extractos bancarios y facturas detalladas.
  • Reconocimiento de escritura a mano : Procesar notas manuscritas, firmas y campos de formularios escritos a mano que los modelos preentrenados de Muy fi no están diseñados para manejar
  • Lectura de cheques/MICR : Extracción dedicada de líneas MICR para flujos de trabajo de procesamiento de cheques, manteniendo la extracción de números de enrutamiento y cuenta en las instalaciones.
  • Exportación hOCR : Exporta los resultados de OCR como hOCR (HTML con datos de posición) para su posterior análisis en flujos de trabajo de documentos.
  • Seguimiento del progreso : Supervise el progreso del procesamiento de trabajos por lotes de larga duración sin necesidad de consultar una API remota.
  • Lectura de pasaportes e identificaciones : Extraer datos de zonas legibles por máquina de pasaportes y documentos de identidad para los flujos de trabajo de incorporación y KYC.
  • Implementación en AWS y Azure : Implemente en la infraestructura en la nube manteniendo el procesamiento de documentos dentro de su propia cuenta en la nube; no se agrega ningún procesador de datos SaaS externo a su alcance de cumplimiento.

Compatibilidad con .NET y preparación para el futuro

IronOCR está diseñado para .NET 8, .NET 9 y el próximo .NET 10, así como para .NET Standard 2.0+ para garantizar la compatibilidad con versiones anteriores. Se ejecuta en Windows x64/x86, Linux x64, macOS y ARM64, lo que abarca todos los destinos de implementación modernos de .NET , incluidos los contenedores Docker, Azure App Service, AWS Lambda y los servidores Linux locales. El modelo de implementación de paquete único implica que no hay gestión binaria nativa entre entornos; La misma referencia de NuGet se resuelve correctamente en todas las plataformas compatibles. El SDK de Muy fi para C# está dirigido a .NET Standard y funciona como un envoltorio de cliente HTTP, lo que significa que su "compatibilidad" depende principalmente de la pila HTTP y no de la profundidad del motor OCR; una distinción que cobra importancia cuando entran en juego las limitaciones de la plataforma o las restricciones de red.

Conclusión

Veryfi resuelve rápidamente un problema específico: enviar un documento de gastos y recibir campos JSON estructurados sin necesidad de escribir lógica de análisis. Para la automatización de gastos a pequeña escala en entornos donde la transmisión de datos en la nube es aceptable, esa propuesta tiene un valor real. La fricción surge cuando el volumen crece hasta el punto en que los costes por documento superan el coste de una licencia perpetua en cuestión de semanas, cuando los tipos de documentos se expanden más allá de las categorías predefinidas de Veryfi, cuando los requisitos de cumplimiento hacen que el procesamiento de documentos financieros por parte de terceros resulte poco práctico, o cuando la aplicación simplemente necesita funcionar sin acceso a Internet.

El modelo de autenticación de cuatro credenciales, la API exclusivamente asíncrona, la limitación de velocidad, los fallos de pago HTTP 402 que detienen el procesamiento por lotes y el esquema JSON propietario que vincula toda la lógica de extracción a un único proveedor: estas no son preocupaciones aisladas. Son realidades operativas cotidianas para los equipos que gestionan Muy fi en producción a gran escala.

IronOCR requiere la escritura de patrones de extracción que Muy fi gestiona automáticamente. Ese es un coste de desarrollo real: calcula entre 8 y 24 horas para crear un sistema de extracción de expresiones regulares para recibos y facturas, dependiendo del tipo de documento. Pero esa inversión se realiza una sola vez. El código resultante se ejecuta en su infraestructura, procesa cualquier tipo de documento, funciona sin conexión y no tiene coste alguno por documento. Los extractos bancarios, los números de ruta, los números de cuenta y el historial de transacciones nunca salen de su servidor.

Para los equipos de servicios financieros, atención médica, contratación de defensa o servicios legales, es decir, cualquier ámbito donde el envío de documentos de gastos a una nube de terceros sea un tema de cumplimiento normativo, la solución IronOCR elimina por completo esa conversación. Para los equipos que actualmente gastan entre 5.000 y 20.000 dólares al mes en Veryfi, los cálculos son sencillos. Para los equipos que necesitan OCR de uso general más allá de los documentos de gastos, la elección es clara: un especialista en la nube o una biblioteca local de uso general no son herramientas equivalentes, y el coste de la licencia única de esta última ofrece una flexibilidad ilimitada que el primero no puede proporcionar a ningún precio por documento.

Por favor notaTesseract y Muy fi son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Google o Veryfi. 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 la API Veryfi OCR?

Veryfi OCR API 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 for .NET para el desarrollo de aplicaciones.

¿Cómo se compara IronOCR con la API Veryfi OCR para desarrolladores .NET?

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

¿Es IronOCR más fácil de configurar que Veryfi OCR API?

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 la API Veryfi 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.

¿Cómo se compara la licencia de la API Veryfi OCR con la 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.

¿Es IronOCR adecuado para Docker y las implementaciones en contenedores, a diferencia de Veryfi?

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 Veryfi?

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 Veryfi OCR API a IronOCR?

La migración de Veryfi OCR API 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 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