Quelle bibliothèque OCR Tesseract devriez-vous choisir ? Une comparaison développeur des trois principales options
Veryfi envoie vos numéros de compte bancaire, numéros de routage, montants des transactions et relations avec les fournisseurs à un serveur cloud tiers à chaque fois que vous appelez _client.ProcessDocumentAsync(bytes). C'est cette réalité architecturale qui définit l'ensemble de l'évaluation Veryfi : avant même qu'une seule ligne de JSON structuré ne soit renvoyée, vos documents de dépenses — contenant certaines des données financières les plus sensibles de votre organisation — ont déjà quitté votre infrastructure. Pour de nombreuses équipes, l'évaluation s'arrête là.
Comprendre Veryfi
Veryfi est une API cloud d'analyse documentaire conçue exclusivement pour les documents financiers et de dépenses. Son principal atout réside dans la structuration des données : au lieu d'un texte brut issu de la reconnaissance optique de caractères (OCR) nécessitant un traitement ultérieur, un appel à l'API Veryfirenvoie des champs pré-extraits : nom du fournisseur, total, lignes de commande, taxe, quatre derniers chiffres de la carte bancaire et, pour les factures, numéro de compte bancaire et code IBAN. Les modèles sont pré-entraînés sur de grands volumes de documents financiers et revendiquent une précision supérieure à 99 % sur les catégories de documents prises en charge.
L'architecture est entièrement basée sur le cloud. Chaque document sort de votre application, via HTTPS, vers les serveurs de Veryfi, passe par leur pipeline d'IA/ML, puis est renvoyé au format JSON. Il n'existe aucune option de déploiement sur site, aucun mode isolé et aucun moyen de traiter un document sans le transmettre en externe.
Principales caractéristiques architecturales :
- Traitement uniquement dans le cloud : Chaque document est téléchargé vers
api.veryfi.comsans chemin de traitement local - Authentification à quatre identifiants :
VeryfiClientnécessiteclientId,clientSecret,usernameetapiKey—quatre secrets à gérer, stocker en toute sécurité, et faire tourner - Tarification par document : Contactez Veryfipour connaître les tarifs actuels par type de document et niveau de volume
- API uniquement asynchrone :
ProcessDocumentAsyncest la méthode principale ; il n'y a pas de voie synchrone - Domaine d'application des documents spécialisés : reçus, factures, chèques, relevés bancaires, W-2 et cartes de visite ; Les documents généraux, les dossiers médicaux, les contrats et les dessins techniques ne sont pas couverts par une assurance fiable.
- Schéma JSON propriétaire : le format de réponse de Veryfiest spécifique à Veryfi ; le changement de fournisseur nécessite la réécriture de la logique d'extraction
- Limitation du débit : le traitement de volumes importants nécessite une logique de temporisation et de nouvelle tentative pour gérer les réponses HTTP 429.
Traitement des reçus Veryfi
Le SDK Veryfiexpose une seule méthode principale pour le traitement des documents :
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
Les factures accentuent la sensibilité du sujet. Le même modèle ProcessDocumentAsync transmet des documents contenant souvent des numéros de compte bancaire, des numéros de routage, des identifiants fiscaux des fournisseurs et des conditions de paiement :
public async Task<InvoiceData> ProcessInvoiceAsync(string pdfPath)
{
var pdfBytes = File.ReadAllBytes(pdfPath);
// Invoice uploaded to Veryfi— 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 Veryfi— 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 Veryfi— 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
Le point de terminaison du relevé bancaire est le plus sensible. Appeler ProcessDocumentAsync avec categories: new[] { "bank_statements" } transmet les numéros de compte complets, les numéros de routage, l'historique complet des transactions, les soldes d'ouverture et de clôture, et les détails de transfert bancaire à l'infrastructure de Veryfi.
Comprendre IronOCR
IronOCR est une bibliothèque OCR commerciale sur site pour .NET qui traite chaque document localement. Aucun octet de document ne quitte votre infrastructure. La bibliothèque intègre un moteur Tesseract 5 optimisé avec prétraitement automatique, prise en charge native du format PDF et plus de 125 modules linguistiques, le tout fourni dans un seul package NuGet avec une licence perpétuelle.
Caractéristiques principales :
- Conçu pour une utilisation sur site : tout le traitement s'effectue sur votre matériel ; Aucun réseau n'appelle pour la reconnaissance optique de caractères (OCR).
- Prétraitement automatique : redressement, réduction du bruit, contraste, binarisation et amélioration de la résolution appliqués automatiquement sans configuration explicite
- Entrée PDF native : Lisez directement les PDFs numérisés et numériques via
LoadPdf()—aucune bibliothèque PDF séparée requise - Licence perpétuelle : $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited—payez une fois, traitez un nombre illimité de documents
- Accès structuré aux résultats : mots, lignes, paragraphes et pages avec coordonnées X/Y et scores de confiance par mot
- Sécurisé pour les threads et parallélisable : Les instances
IronTesseractpeuvent être utilisées à travers les threads sans synchronisation supplémentaire - Plus de 125 langues : installées sous forme de packages NuGet , aucune gestion de dossier tessdata requise
- Multiplateforme : Windows, Linux, macOS, Docker, AWS, Azure — un seul package couvre toutes les cibles
Comparaison des fonctionnalités
| Fonction | Veryfi | IronOCR |
|---|---|---|
| Emplacement des données | Serveurs cloud Veryfi | Votre infrastructure |
| Modèle de déploiement | API cloud uniquement | Sur place |
| Modèle de tarification | Par document (contactez Veryfipour les prix) | Licence perpétuelle ($5,999) |
| Assistance hors ligne | Non | Oui |
| Portée du document | Documents de dépenses uniquement | Tout type de document |
| Configuration | 4 identifiants API | 1 clé de licence |
Comparaison détaillée des fonctionnalités
| Fonction | Veryfi | IronOCR |
|---|---|---|
| Confidentialité des données | ||
| Les documents quittent l'infrastructure | Oui (à chaque appel) | Jamais |
| Déploiement en mode air-gapped | Pas possible | Entièrement pris en charge |
| Traitement sur site | Pas possible | Comportement par défaut |
| Conforme à la loi HIPAA (aucun accord de partenariat commercial requis) | Non (BAA requis) | Oui |
| Compatible ITAR/CMMC | Complexe | Oui |
| Documentation de soutien | ||
| Traitement des reçus | Oui (spécialisé) | Oui (via OCR + extraction) |
| Traitement des factures | Oui (spécialisé) | Oui (via OCR + extraction) |
| Traitement des relevés bancaires | Oui (spécialisé) | Oui (via OCR + extraction) |
| Documents commerciaux généraux | Résultats médiocres | Oui |
| dossiers médicaux | Non pris en charge | Oui |
| contrats légaux | Limité | Oui |
| Types de documents personnalisés/arbitraires | Formation rémunérée requise | Tout type |
| PDF multipages | Oui | Oui |
| Technique | ||
| Nécessite une connexion internet | Oui (chaque document) | Non |
| API synchrone disponible | Non | Oui |
| prétraitement d'images | Automatique (cloud) | Automatique (local) |
| Entrée PDF (native) | Oui | Oui |
| Sortie PDF consultable | Non | Oui |
| Lecture de codes-barres | Non | Oui |
| OCR basé sur la région | Non | Oui |
| scores de confiance | Par champ | Par mot et globalement |
| Développement | ||
| Identifiants pour gérer | 4 (clientId, clientSecret, nom d'utilisateur, clé API) | 1 (clé de licence) |
| complexité des tests unitaires | Nécessite la simulation HTTP | Tests locaux directs |
| Gestion des erreurs | Codes d'état HTTP + VeryfiApiException | Exceptions .NET locales |
| Soutien linguistique | Limité | plus de 125 langues |
| Coût | ||
| plafond des coûts | Aucun sans plafond contractuel | Prix de la licence |
| Coût à volume élevé | Échelles linéaires | Plat |
Protection des données pour les documents financiers
Les documents financiers traités par Veryficomprennent les catégories de données les plus sensibles de toute organisation. Il ne s'agit pas d'une préoccupation théorique, mais d'un fait architectural concret relatif au fonctionnement du produit.
Approche Veryfi
Chaque appel d'API Veryfitransmet des octets de document via HTTPS vers api.veryfi.com. Les données extraites de ces documents (numéros de compte, numéros de routage, historiques de transactions, numéros d'identification fiscale des fournisseurs, détails des cartes de paiement et habitudes de dépenses) sont traitées par l'infrastructure de Veryfi. La résidence des données, les politiques de conservation, les chaînes de sous-traitants et les procédures de réponse aux violations de données sont toutes régies par les conditions de Veryfi, et non par les vôtres.
// Traitement des relevés bancaires — 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()
};
}
// Traitement des relevés bancaires — 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
' Traitement des relevés bancaires — 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
Veryfi détient les certifications SOC 2 Type II, RGPD et HIPAA (avec accord de partenariat commercial). Ces certifications confirment que Veryfirespecte les pratiques de sécurité qu'elle a déclarées. Cela ne signifie pas que vos données restent sous votre contrôle, que vous contrôlez la résidence des données, ou que les sous-traitants de Veryfin'y ont aucun accès. Pour les organisations relevant des normes CMMC niveau 2+, ITAR, SOX ou GLBA, l'ajout de Veryfien tant que sous-traitant de données introduit un périmètre de conformité qui nécessite un examen juridique et une surveillance continue.
Approche d'IronOCR
IronOCR traite les documents sans aucune transmission réseau. Le moteur OCR s'exécute sur votre matériel. Les relevés bancaires, les factures avec numéros de routage et les chèques avec numéros de compte ne quittent jamais votre serveur :
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
// Non 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
// Non 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
' Non 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
Dans les environnements soumis à de fortes exigences de conformité, le traitement local élimine totalement le périmètre des audits tiers. Pas de BAA avec IronOCR. Aucune divulgation concernant les sous-traitants. Aucune question relative à la résidence des données. Consultez le guide d'installation d'IronTesseract pour la configuration du déploiement sur Windows, Linux, Docker et les environnements isolés.
OCR spécialisé vs. généraliste
La spécialisation de Veryfidans le domaine des documents est à la fois sa plus grande force et sa plus importante limite. Les modèles pré-entraînés offrent des résultats véritablement rapides et structurés pour les types de documents spécifiques pour lesquels ils ont été conçus. Le problème se pose dès lors que votre organisation a besoin de la reconnaissance optique de caractères (OCR) en dehors de cette liste.
Approche Veryfi
Veryfi fonctionne bien dans son domaine. Envoyez une image du reçu et la réponse contiendra le fournisseur, le total, la taxe, le mode de paiement et les lignes de paiement ; aucune expression régulière n'est requise de votre côté. Mais son champ d'application s'arrête à la frontière des dépenses et des documents financiers. Le fichier README le précise clairement : les documents commerciaux généraux, les dossiers médicaux, les dessins techniques, les documents multilingues et les types de formulaires personnalisés en dehors de l'ensemble d'entraînement produisent de mauvais résultats ou nécessitent une formation payante sur un modèle personnalisé.
Les organisations réelles traitent rarement une seule catégorie de documents. Les services des ressources humaines traitent les formulaires d'intégration des employés. Les équipes juridiques ont besoin du texte du contrat. Les équipes opérationnelles gèrent les documents d'expédition et les formulaires logistiques. Chaque catégorie hors du champ d'application de Veryfiimpose l'ajout d'une seconde solution à la pile :
// 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
Approche d'IronOCR
IronOCR traite tout type de document. C'est vous qui écrivez la logique d'extraction, ce qui signifie qu'elle traite exactement les champs contenus dans vos documents, et non pas les suppositions d'un modèle pré-entraîné sur les champs communs à tous les documents de dépenses. La même instance IronTesseract traite les reçus, contrats, formulaires médicaux, documents d'expédition et formulaires internes personnalisés :
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+)")
Pour les champs de facture et de reçu suivant des modèles cohérents, l'extraction de données structurées d'IronOCR fournit un positionnement au niveau des mots qui rend la logique d'extraction précise. La collection result.Lines, ordonnée par position Y, fait remonter de manière fiable les noms des fournisseurs à partir des en-têtes des reçus. Les filtres de correction de la qualité d'image traitent les reçus froissés, décolorés ou photographiés que produisent les flux de travail réels de gestion des dépenses.
Coût par document pour le cloud vs. licence perpétuelle
La différence de coût entre Veryfiet IronOCR s'accroît pour chaque document traité. Le modèle de facturation par document de Veryfiimplique que les coûts augmentent proportionnellement au volume, sans plafond sauf si vous en négociez un contractuellement.
Approche Veryfi
Veryfi facture par document. Le tarif dépend du type de document et du niveau de volume—contactez Veryfipour connaître les tarifs actuels. Les coûts augmentent en proportion directe du volume sans plafond, sauf si vous en négociez un contractuellement, et il n'y a aucune réduction les années suivantes, quel que soit le temps que vous ayez été client.
// 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)
Les coûts cachés alourdissent le total : la limitation du débit au niveau du code HTTP 429 impose une logique de nouvelle tentative ; Les modifications de la version de l'API nécessitent des mises à jour du SDK ; L'examen de sécurité de l'accord de traitement des données ajoute du temps légal ; et des frais de dépassement apparaissent lorsque le volume saisonnier dépasse les estimations du plan.
Approche d'IronOCR
La licence IronOCR est un achat unique. La licence Professional à $2,999 couvre 10 développeurs, traite un nombre illimité de documents par mois, et ne nécessite pas de renouvellement pour continuer à traiter. La deuxième année ne coûte rien en frais de traitement. La cinquième année ne coûte rien en frais de traitement.
// 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
La comparaison sur 3 ans à des volumes élevés de documents : IronOCR totalise $2,999 plus un temps de développement estimé entre 8 et 16 heures pour construire des modèles d'extraction, tandis que les coûts Veryfis'accumulent avec chaque document traité. Le seuil de rentabilité se produit généralement au cours des premiers mois d'utilisation en fonction du volume.
Pour les équipes qui investissent actuellement dans la reconnaissance optique de caractères (OCR) dans le cloud, la page de licences IronOCR détaille les différents niveaux de service et l'option d'abonnement SaaS disponible pour les équipes qui préfèrent une facturation annuelle.
Webhook et traitement asynchrone vs. résultats locaux synchrones
L'architecture cloud de Veryfiimpose un modèle de traitement exclusivement asynchrone. Le document est transféré vers un serveur distant, traité par un pipeline distant, et la réponse est reçue après un aller-retour réseau. Pour le traitement par lots de volumes importants, Veryfirecommande l'utilisation de notifications par webhook plutôt que l'interrogation régulière. Par défaut, IronOCR traite les données de manière synchrone, sans dépendance réseau dans la boucle.
Approche Veryfi
Tout le traitement Veryfiest asynchrone car il est basé sur le cloud. La méthode ProcessDocumentAsync initie un appel HTTP, attend que la chaîne de traitement Veryfise termine, et renvoie le résultat. La latence totale comprend la transmission réseau, le temps d'attente sur l'infrastructure de Veryfi, l'inférence du modèle et la transmission de la réponse.
// Veryfierror 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)
{
// Veryfiinfrastructure failure — your processing is down
throw new Exception("Veryfi server error. Processing unavailable.", ex);
}
}
// Veryfierror 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)
{
// Veryfiinfrastructure failure — your processing is down
throw new Exception("Veryfi server error. Processing unavailable.", ex);
}
}
Imports System.IO
Imports System.Threading.Tasks
' Veryfierror categories reflect cloud dependencies
Public Class Processor
Private _client As VeryfiClient
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
' Veryfiinfrastructure failure — your processing is down
Throw New Exception("Veryfi server error. Processing unavailable.", ex)
End Try
End Function
Private Function MapToReceiptData(response As Object) As ReceiptData
' Implementation of mapping logic
End Function
End Class
Public Class VeryfiClient
Public Function ProcessDocumentAsync(bytes As Byte()) As Task(Of Object)
' Implementation of processing logic
End Function
End Class
Public Class ReceiptData
' Implementation of ReceiptData class
End Class
Public Class VeryfiApiException
Inherits Exception
Public Property StatusCode As Integer
End Class
Les pannes de réseau interrompent le traitement. Les incidents d'infrastructure de Veryfiinterrompent le traitement. Les limites de débit interrompent le traitement. Chacune de ces dépendances est externe et votre application ne peut pas la contrôler.
Approche d'IronOCR
IronOCR traite les données de manière synchrone, sans aucune dépendance au réseau. Le résultat est disponible immédiatement après que Read() ne retourne, sans sondage, sans configuration de webhook et sans logique de réessayage pour les échecs de réseau.
using IronOcr;
var ocr = new IronTesseract();
// Synchronous — result immediately available
// Non 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
// Non 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
' Non 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
Pour les applications nécessitant un comportement asynchrone pour la réactivité de l'interface utilisateur, IronOCR prend également en charge l'OCR asynchrone via le wrapping Task.Run ou l'API asynchrone. La différence réside dans le fait que, dans IronOCR, l'asynchronisme est un modèle de concurrence, et non une exigence imposée par un appel distant. Une panne de réseau à 2 heures du matin n'interrompt pas votre traitement par lots.
Pour les flux de travail de numérisation de reçus, le tutoriel sur la numérisation de reçus et le guide OCR sur les factures couvrent l'implémentation complète des modèles d'extraction. Les scores de confiance fournissent des signaux de fiabilité par mot qui permettent de repérer les analyses de faible qualité avant de transmettre les données extraites à un système en aval.
Référence de mappage d'API
| Veryfi | Équivalent d'IronOCR |
|---|---|
new VeryfiClient(clientId, clientSecret, username, apiKey) |
new IronTesseract() + IronOcr.License.LicenseKey = "key" |
_client.ProcessDocumentAsync(bytes) |
ocr.Read(filePath) ou ocr.Read(ocrInput) |
_client.ProcessDocumentAsync(bytes, categories: new[] { "invoices" }) |
input.LoadPdf(pdfPath) ; ocr.Read(input) |
response.Vendor?.Name |
result.Lines.FirstOrDefault()?.Text |
response.Total |
ExtractTotal(result.Text) via Regex |
response.Date |
ExtractDate(result.Text) via Regex |
response.LineItems |
result.Lines avec extraction positionnelle |
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) |
Exceptions .NET standard (locales, sans code réseau) |
| Encodage Base64 avant le téléchargement | Non requis — ocr.Read(filePath) accepte directement les chemins de fichiers |
| Quatre identifiants dans la configuration | Clé de licence unique |
Quand les équipes envisagent de passer de Veryfià IronOCR
La souveraineté des données devient non négociable
Le déclencheur le plus courant de l'évaluation IronOCR est un audit de conformité ou un examen juridique qui révèle que Veryfiest un sous-traitant de données pour des documents financiers sensibles. Une évaluation HIPAA révèle que les documents de dépenses contenant des informations de santé protégées nécessitent un accord de partenariat commercial avec Veryfiet un contrôle d'audit continu. Une évaluation CMMC de niveau 2 identifie la transmission de documents financiers via le cloud comme une faille potentielle. Une équipe juridique déconseille l'envoi de données relatives aux dépenses des clients à un tiers. Dans chaque scénario, la voie de la conformité consiste à éliminer la transmission de données externes, ce qui implique de remplacer Veryfipar une solution OCR sur site. Le modèle de traitement local d'IronOCR satisfait ces exigences par défaut : pas de BAA, pas de chaîne de sous-traitants, pas de périmètre d'audit tiers.
Les types de documents s'étendent au-delà des dépenses
Les organisations qui adoptent Veryfipour l'automatisation des dépenses découvrent souvent dans les 6 à 12 mois que les équipes adjacentes ont besoin de la reconnaissance optique de caractères (OCR) pour les documents qui ne font pas partie de l'ensemble de formation de Veryfi. Le service des ressources humaines a besoin que les formulaires d'intégration soient traités. Le texte du contrat a besoin d'être extrait. Les opérations nécessitent la saisie des données du connaissement. Chaque nouvelle catégorie de documents produit soit de mauvais résultats avec le terminal à usage général de Veryfi, soit nécessite une formation de modèle personnalisée payante, soit impose l'intégration d'une deuxième solution OCR dans l'infrastructure. Une seule licence IronOCR permet de gérer tout cela avec la même API. Le tutoriel sur la lecture de documents spécifiques aborde les stratégies d'extraction pour les mises en page de formulaires structurés.
Les coûts par document dépassent le seuil de rentabilité.
Les équipes traitant 25 000 documents ou plus par mois constatent généralement que la période de retour sur investissement IronOCR est inférieure à trois mois. À des volumes élevés de documents, la licence IronOCR Professional à $2,999 est généralement rentabilisée dès le premier mois d'une dépense équivalente chez Veryfi. Les équipes financières qui effectuent une analyse du coût total de possession en fonction de la tarification du cloud par document arrivent inévitablement à cette comparaison. L'effort de migration — la création de modèles d'extraction d'expressions régulières pour les champs spécifiques dont l'équipe a besoin — prend généralement de 8 à 24 heures en fonction de la complexité du document et du nombre de types de documents distincts dans le flux de travail.
Environnements hors ligne et déconnectés
Les organisations de services sur le terrain, les sites de travail à distance, les applications mobiles de saisie des dépenses et les environnements gouvernementaux isolés partagent une exigence commune : la reconnaissance optique de caractères (OCR) doit fonctionner sans Internet. De par son architecture, Veryfiest incapable de satisfaire cette exigence : chaque appel de traitement de document échoue sans connexion réseau. IronOCR fonctionne hors ligne par conception. Un technicien de terrain utilisant une application mobile de gestion des dépenses, une usine de fabrication dotée d'un réseau protégé par un pare-feu et un entrepreneur de la défense dans une zone SCIF peuvent tous exécuter IronOCR sans modification. Le guide de déploiement Docker et le guide de déploiement Linux couvrent les environnements conteneurisés où la sortie réseau est restreinte.
Dépendance vis-à-vis du fournisseur et dépendance au schéma
Le schéma de réponse JSON de Veryfiest propriétaire. Chaque ligne de code d'extraction qui lit le nom du fournisseur, le total, le numéro de routage ou les champs de ligne de commande est un code qui ne fonctionne qu'avec Veryfi. Passer à une API cloud concurrente ou à une solution sur site nécessite de réécrire toute la logique d'extraction. Les organisations qui négocient des contrats pluriannuels avec Veryfidécouvrent cette dépendance lorsque les prix changent ou que la feuille de route du produit évolue. La logique d'extraction IronOCR lit le texte brut à l'aide d'expressions régulières .NET standard — portable et non liée au schéma d'un fournisseur.
Considérations courantes en matière de migration
Remplacement de la sortie structurée par l'extraction de modèles
Veryfi renvoie des champs pré-analysés ; IronOCR renvoie le texte brut issu de la reconnaissance optique de caractères (OCR). Le travail de migration consiste à rédiger les modèles d'extraction que Veryfieffectuait dans son cloud. Pour les reçus et les factures ayant une mise en page uniforme, c'est simple :
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)
Pour les reçus présentant une mise en page inhabituelle ou une impression délavée, les filtres de prétraitement d'IronOCR améliorent la précision brute avant les opérations d'extraction. Consultez le guide de correction de la qualité d'image et le guide de correction des couleurs d'image pour obtenir des informations sur la qualité réelle des numérisations de reçus.
Gestion de la transition asynchrone-synchrone
L'intégralité de l'API de Veryfiest asynchrone. Le chemin principal d'IronOCR est synchrone. Les signatures des méthodes asynchrones existantes dans le code de l'application peuvent être préservées en les encapsulant :
// 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
Pour les scénarios à haut débit, IronOCR est sécurisé pour les threads et plusieurs instances IronTesseract peuvent traiter des documents en parallèle sans synchronisation. Le guide d'optimisation de la vitesse aborde les modèles de réutilisation des instances et les stratégies de chargement par lots qui minimisent le temps de traitement à grande échelle.
Nettoyage des identifiants
Veryfi requiert quatre identifiants : ClientId, ClientSecret, Username et ApiKey. Les quatre éléments doivent être supprimés des fichiers de configuration, des variables d'environnement, des coffres de clés et des pipelines CI/CD après la migration. IronOCR nécessite une seule chaîne de clé de licence. La liste de vérification de la migration : retirez tous les quatre secrets Veryfide chaque environnement, ajoutez une seule variable d'environnement IRONOCR_LICENSE, et mettez à jour les pipelines de déploiement pour supprimer l'injection de crédentiels Veryfi.
Traitement PDF des factures
Veryfi accepte des octets PDF via ProcessDocumentAsync. IronOCR traite les PDFs nativement via 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
Pour les workflows de facturation qui produisent des archives PDF interrogeables, la méthode SaveAsSearchablePdf() d'IronOCR génère une sortie compatible PDF/A à partir d'une entrée numérisée—une capacité que l'API cloud de Veryfine fournit pas. Consultez le guide des PDFs interrogeables pour les détails de mise en œuvre.
Fonctionnalités supplémentaires d'IronOCR
Au-delà des principaux domaines de comparaison, IronOCR offre des fonctionnalités qui ne relèvent absolument pas du champ d'application de Veryfi :
- Extraction de tableaux : Lecture structurée de tableaux à partir de documents à mise en page en grille, applicable aux relevés bancaires et aux factures détaillées.
- Reconnaissance de l'écriture manuscrite : Traitement des notes manuscrites, des signatures et des champs de formulaire manuscrits que les modèles pré-entraînés de Veryfine sont pas conçus pour gérer.
- Lecture MICR/chèques : Extraction dédiée des lignes MICR pour les flux de traitement des chèques, avec extraction sur site des numéros de routage et de compte
- Exportation hOCR : Exporter les résultats OCR au format hOCR (HTML avec données de position) pour les pipelines d'analyse de documents en aval
- Suivi de la progression : Surveillez la progression du traitement des tâches par lots de longue durée sans interroger une API distante.
- Lecture des passeports et des cartes d'identité : Extraction des données de la zone lisible par machine des passeports et des documents d'identité pour les processus d'intégration et de connaissance du client (KYC).
- Déploiement sur AWS et Azure : Déployez sur une infrastructure cloud tout en conservant le traitement des documents au sein de votre propre compte cloud ; aucun processeur de données SaaS externe n'est ajouté à votre périmètre de conformité.
Compatibilité .NET et préparation à l'avenir
IronOCR cible .NET 8, .NET 9 et la future version .NET 10, ainsi que .NET Standard 2.0+ pour la compatibilité avec les versions antérieures. Il fonctionne sous Windows x64/x86, Linux x64, macOS et ARM64, couvrant ainsi toutes les cibles de déploiement .NET modernes, y compris les conteneurs Docker, Azure App Service, AWS Lambda et les serveurs Linux sur site. Le modèle de déploiement à package unique implique l'absence de gestion binaire native dans tous les environnements ; La même référence NuGet est correctement résolue sur toutes les plateformes prises en charge. Le kit de développement logiciel (SDK) C# de Veryficible .NET Standard et fonctionne comme un wrapper client HTTP, ce qui signifie que sa " compatibilité " dépend principalement de la pile HTTP plutôt que de la profondeur du moteur OCR — une distinction qui devient importante lorsque des contraintes de plateforme ou des restrictions réseau entrent en jeu.
Conclusion
Veryfi résout rapidement un problème précis : soumettre une note de frais et recevoir des champs JSON structurés sans avoir à écrire de logique d'analyse. Pour l'automatisation des dépenses à petite échelle dans les environnements où la transmission de données vers le cloud est acceptable, cette proposition a une réelle valeur. Les difficultés apparaissent lorsque le volume dépasse le point où les coûts par document excèdent le prix d'une licence perpétuelle en quelques semaines, lorsque les types de documents s'étendent au-delà des catégories prises en charge par Veryfi, lorsque les exigences de conformité rendent le traitement des documents financiers par des tiers impraticable, ou lorsque l'application doit simplement fonctionner sans accès à Internet.
Le modèle d'authentification à quatre identifiants, l'API exclusivement asynchrone, la limitation du débit, les échecs de paiement HTTP 402 qui interrompent le traitement par lots et le schéma JSON propriétaire qui lie toute la logique d'extraction à un seul fournisseur — il ne s'agit pas de problèmes marginaux. Ce sont des réalités opérationnelles quotidiennes pour les équipes qui exploitent Veryfien production à grande échelle.
IronOCR nécessite l'écriture de modèles d'extraction que Veryfigère automatiquement. Cela représente un coût de développement réel : prévoyez 8 à 24 heures pour la mise en place de l'extraction par expression régulière des reçus et des factures, en fonction de la variété des documents. Mais cet investissement n'est réalisé qu'une seule fois. Le code résultant s'exécute sur votre infrastructure, traite tout type de document, fonctionne hors ligne et ne coûte rien par document. Les relevés bancaires, les numéros de routage, les numéros de compte et l'historique des transactions ne quittent jamais votre serveur.
Pour les équipes des secteurs des services financiers, de la santé, de la défense ou des services juridiques – tout domaine où l'envoi de documents de dépenses à un cloud tiers est un sujet de discussion en matière de conformité – la solution IronOCR élimine complètement cette discussion. Pour les équipes qui dépensent actuellement entre 5 000 et 20 000 dollars par mois sur Veryfi, le calcul est simple. Pour les équipes qui ont besoin d'une solution OCR à usage général au-delà des documents de dépenses, le choix est clair : un spécialiste du cloud ou une bibliothèque locale à usage général ne sont pas des outils équivalents, et le coût unique de la licence de cette dernière offre une flexibilité illimitée que le premier ne peut fournir, quel que soit le prix par document.
Questions Fréquemment Posées
Qu'est-ce que Veryfi OCR API ?
Veryfi OCR API est une solution OCR utilisée par les développeurs et les entreprises pour extraire du texte à partir d'images et de documents. Il s'agit de l'une des nombreuses options d'OCR évaluées aux côtés d'IronOCR pour le développement d'applications .NET.
Comment IronOCR se compare-t-il à Veryfi OCR API for .NET developers ?
IronOCR est une bibliothèque OCR .NET native de NuGet qui utilise IronTesseract comme moteur principal. Comparée à l'API OCR de Veryfi, elle offre un déploiement plus simple (pas d'installateurs SDK), un prix forfaitaire et une API C# propre sans interopérabilité COM ou dépendances cloud.
IronOcr est-il plus facile à configurer que Veryfi OCR API ?
IronOCR s'installe via un seul package NuGet. Il n'y a pas d'installateur SDK, de fichiers de licence à copier, de composants COM à enregistrer ou de binaires d'exécution séparés à gérer. L'ensemble du moteur d'OCR est inclus dans le package.
Quelles sont les différences de précision entre Veryfi OCR API et IronOCR ?
IronOcr atteint une grande précision de reconnaissance pour les documents commerciaux standard, les factures, les reçus et les formulaires numérisés. Pour les documents très dégradés ou les scripts peu courants, la précision varie en fonction de la qualité de la source. IronOCR comprend des filtres de prétraitement d'image pour améliorer la reconnaissance sur des entrées de faible qualité.
IronOCR prend-il en charge l'extraction de texte au format PDF ?
Oui. IronOCR extrait le texte des PDF natifs et des images PDF numérisées en un seul appel. Il prend également en charge les fichiers TIFF multipages, les images et les flux. Pour les PDF numérisés, l'OCR est appliquée page par page avec des objets de résultat par page.
Comment la licence de l'API Veryfi OCR se compare-t-elle à celle d'IronOCR ?
IronOCR utilise une licence perpétuelle forfaitaire sans frais par page ou par scan. Les organisations qui traitent de gros volumes de documents paient le même coût de licence, quel que soit le volume. Les détails et la tarification au volume se trouvent sur la page de licence d'IronOCR.
Quelles langues IronOCR prend-il en charge ?
IronOcr prend en charge 127 langues via des packs linguistiques NuGet distincts. L'ajout d'une langue nécessite une seule commande "dotnet add package IronOcr.Languages.{Language}". Il n'est pas nécessaire de placer manuellement des fichiers ou de configurer des chemins d'accès.
Comment installer IronOCR dans un projet .NET ?
Installation via NuGet : 'Install-Package IronOcr' dans la console du Package Manager ou 'dotnet add package IronOcr' dans le CLI. Les packs de langues supplémentaires sont installés de la même manière. Aucun programme d'installation du SDK n'est nécessaire.
IronOCR est-il adapté à Docker et aux déploiements conteneurisés, contrairement à Veryfi ?
Oui. IronOCR fonctionne dans les conteneurs Docker via son package NuGet. La clé de licence est définie via une variable d'environnement. Aucun fichier de licence, chemin d'accès au SDK ou montage de volume n'est nécessaire pour le moteur OCR lui-même.
Puis-je essayer IronOCR avant de l'acheter, par rapport à Veryfi ?
Oui. Le mode d'essai d'IronOcr traite les documents et renvoie les résultats de l'OCR avec un filigrane en surimpression sur la sortie. Vous pouvez vérifier la précision sur vos propres documents avant d'acheter une licence.
IronOCR prend-il en charge la lecture de codes-barres parallèlement à l'extraction de texte ?
IronOCR se concentre sur l'extraction de texte et l'OCR. Pour la lecture de codes-barres, Iron Software propose IronBarcode comme bibliothèque d'accompagnement. Les deux sont disponibles individuellement ou dans le cadre de l'offre groupée Iron Suite.
Est-il facile de migrer de Veryfi OCR API à IronOCR ?
La migration de l'API OCR Veryfi vers IronOCR implique généralement le remplacement des séquences d'initialisation par l'instanciation IronTesseract, la suppression de la gestion du cycle de vie COM et la mise à jour des appels d'API. La plupart des migrations réduisent considérablement la complexité du code.

