Veryfi'den IronOCR'ye Geçiş
Bu kılavuz, .NET geliştiricilerini IronOCR, yerel bir OCR kütüphanesi ile Veryfi'nin bulut doküman işleme API'sinin yerine geçiş yapma sürecinden geçirir. Paket değişimi, ad alanı temizliği ve en yaygın olarakVeryfietrafında inşa edilen dört tam kod geçiş örneğini kapsar: istemci başlatma, alan tabanlı alan çıkarımı, yapılandırılmış veri ile gider sınıflandırması ve webhook değişimi. Karşılaştırma makalesinin önceden okunması gerekmez.
Neden Veryfi'den Geçiş Yapılmalı?
Finansal belgeler, Veryfi'nin boru hattından tek bir yönde akar: altyapınızdan çıkıp onlarınkine. Bu mimari gerçek, çoğu geçişi yönlendirir. İşte ekipleri geçiş yapmaya iten belirli acı noktaları.
Her belge çağrısı, hassas finansal verileri üçüncü taraf bir sunucuya aktarır. Makbuzlar, kartın son dört hanesini ve satıcı ilişkilerini taşır. Faturalar, banka hesap numaralarını, yönlendirme numaralarını ve satıcı vergi kimliklerini taşır. Banka ekstreleri, tam işlem geçmişlerini taşır.Veryfiile, her bir ProcessDocumentAsync çağrısı bu baytları api.veryfi.com konumuna yükler, Veryfi'nin altyapısında işler ve JSON olarak geri döner. HTTP isteği gönderildiği anda üzerindeki kontrolünüz sona erer.
Dört kimlik bilgisi gereklidir ve her ortamda senkronize tutulmalıdır. VeryfiClient, clientId, clientSecret, username ve apiKey gerektirir—konfigürasyonda saklanacak, programlı olarak değiştirilecek, CI/CD boru hatlarına enjekte edilecek ve maruz kalmayı denetleyecek dört ayrı gizli bilgi. Tek bir kimlik sızıntısı, tüm uygulama genelinde her işlenen belge için kimlik doğrulamasını bozar.IronOCR bir lisans anahtarı dizisi gerektirir.
Belge başına fiyatlandırma tavan olmadan birikir. Makbuzlar yaklaşık olarak her biri $0.05–$0.15, faturalar $0.10–$0.25, banka ekstreleri $0.15–$0.30 tutar. Ayda 50,000 belge ile, yıl iki veya yıl üçte bir azalma olmadan aylık ölçülen fatura 5,000–15,000 dolar olur.IronOCR Professional lisansı $2,399 değerinde, süresiz olarak sınırsız belgeleri kapsar — aylık $5,000Veryfiharcamasına karşı denge üç haftadan azdır.
API yalnızca asenkron çalışır çünkü alttaki iş uzaktandır. ProcessDocumentAsync asenkron değildir çünkü işlem hesaplamasal olarak uzundur; asenkron çünkü belge bir sunucuya gitmeli, diğer isteklerin arkasında sıraya konmalı, çıkarım tamamlanmalı ve ağ üzerinde bir yanıt döndürülmelidir. Gecikme belirlenemez. HTTP 429 hız sınırlaması yeniden deneme mantığı gerektirir. HTTP 402 ödeme hataları, toplu işlemleri tamamen durdurur. Veryfi'nin altyapısındaki HTTP 500 hataları, iş akışınızı onlarla birlikte çöker.
Veryfi'nin belge kapsama alanı, gider belgesi sınırında sona erer. Eğitilmiş modeller, fişler, faturalar, çekler, banka ekstresi, W-2'ler ve iş kartları için yapılandırılmış alanlar sağlar. O liste dışında — genel iş belgeleri, sözleşmeler, tıbbi kayıtlar, sevkiyat belgeleri, özel dahili formlar — sonuçlar bozulur veya özel model eğitimi ödemek gerektirir. Gider otomasyonu için Veryfi'yi benimseyen kuruluşlar genellikle 6–12 ay içinde başka ekiplerin Veryfi'nin tasarlanmadığı belgeler için OCR gerektirdiğini fark ederler.
Veryfi'nin özel JSON şeması tüm çıkarım mantığını tek bir satıcıyla birleştirir. response.Vendor?.Name, response.BankAccount?.RoutingNumber veya response.LineItems okuyan her bir kod satırı yalnızcaVeryfiile çalışır. Satıcı değiştirmek veya yerel OCR'ye geçmek, tüm çıkarım mantığını sıfırdan yeniden yazmak anlamına gelir.
Temel Sorun
// Veryfi: financial data leaves your infrastructure on every call
var client = new VeryfiClient(clientId, clientSecret, username, apiKey); // 4 secrets
var bytes = File.ReadAllBytes("invoice-with-routing-number.pdf");
var response = await client.ProcessDocumentAsync(bytes); // bank details transmitted
var routingNumber = response.BankAccount?.RoutingNumber; // arrived viaVeryficloud
// IronOCR: routing numbers never leave your server
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; // 1 key
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("invoice-with-routing-number.pdf"); // processed locally
var result = ocr.Read(input);
var routingNumber = Regex.Match(result.Text, @"Routing\s*#?\s*:?\s*(\d{9})").Groups[1].Value;
IronOCR vs Veryfi: Özellik Karşılaştırması
Aşağıdaki tablo, teknik değerlendirmeyi desteklemek için her iki ürünün yeteneklerini eşleştirir.
| Özellik | Veryfi | IronOCR |
|---|---|---|
| İşleme yeri | Veryfibulut sunucuları | Altyapınız |
| Dağıtım modeli | Yalnızca bulut API | Yerel, Docker, Azure, AWS, Linux |
| Çevrimdışı destek | Hayır | Evet |
| İnternet gerekli mi | Evet (her belge) | Hayır |
| Veri, altyapıyı terk ediyor | Evet (her çağrı) | Asla |
| BAA olmadan HIPAA uyumlu | Hayır | Evet |
| İzole ortam desteği | Mümkün değil | Tam destekli |
| Fiyatlandırma modeli | Belge başına ($0.05–$0.30) | Süresiz lisans ($999–$2,399) |
| Kimlik bilgileri gereklidir | 4 (clientId, clientSecret, username, apiKey) | 1 lisans anahtarı |
| Eşzamanlı API | Hayır (sadece asenkron) | Evet |
| Hız sınırlama | Evet (HTTP 429) | None |
| Belge kapsamı | Fişler, faturalar, çekler, banka ekstreleri, W-2'ler, iş kartları | Herhangi bir belge türü |
| Özel belge türleri | Ücretli model eğitimi gereklidir | Herhangi bir düzen, regex/pattern çıkarımı aracılığıyla |
| PDF girişi | Evet (bayt yükleme) | Evet (yerel, yerel) |
| Aranabilir PDF çıktısı | Hayır | Evet (result.SaveAsSearchablePdf()) |
| Bölge tabanlı OCR | Hayır | Evet (CropRectangle) |
| Barkod okuma | Hayır | Evet (aynı OCR geçişi) |
| Yapılandırılmış sonuç erişimi | Ön-analiz JSON alanları | Sayfalar, paragraflar, satırlar, koordinatlı kelimeler |
| Güvenlik puanlaması | Alan başına (özel) | Kelime başına ve genel (result.Confidence) |
| 125+ dil desteği | Sınırlı | Evet (NuGet dil paketleri) |
| İş parçacığı güvenli paralel işleme | HTTP eşzamanlılık sınırları geçerlidir | Tam (her bir thread için bir IronTesseract) |
| Mock'lar olmadan birim testi | HTTP mocking gerektirir | Doğrudan yerel test |
Hızlı Başlangıç: Veryfi'den IronOCR'ye Geçiş
Adım 1: NuGet Paketini Değiştirin
Veryfi SDK'sını kaldırın:
dotnet remove package Veryfi
NuGet kullanarak IronOCR'u yükleyin:
Adım 2: Ad Alanlarını Güncelleyin
Veryfi ad alanlarınıIronOCR ad alanı ile değiştirin:
// Before (Veryfi)
using Veryfi;
using Veryfi.Models;
// After (IronOCR)
using IronOcr;
using System.Text.RegularExpressions;
Adım 3: Lisansa İzin Verin
Bu satırı uygulamanın başlangıcında, herhangi bir OCR çağrısından önce ekleyin:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Kod Göç Örnekleri
Belge İşleme İstemcisi Değişimi
Veryfi hizmetleri VeryfiClient enjeksiyonu etrafında inşa edilmiştir. Dört kredili yapıcı, bağımlılık enjeksiyonu için doğal bir dikiştir, ancak yönetilmesi ve döndürülmesi gereken dört sır oluşturur. Bunu IronOCR ile değiştirmek, kimlik bilgilerini tek bir lisans anahtarına konsolide eder ve işleme motorunun başlatılmasını hizmet sınıfının kendisine taşır.
Veryfi Yaklaşımı:
using Veryfi;
using Microsoft.Extensions.Configuration;
public class ExpenseDocumentService
{
private readonly VeryfiClient _client;
// Four credentials injected — four secrets to manage, store, rotate
public ExpenseDocumentService(IConfiguration config)
{
_client = new VeryfiClient(
config["Veryfi:ClientId"], // secret 1
config["Veryfi:ClientSecret"], // secret 2
config["Veryfi:Username"], // secret 3
config["Veryfi:ApiKey"] // secret 4
);
}
public async Task<string> GetVendorNameAsync(string documentPath)
{
var bytes = File.ReadAllBytes(documentPath);
// Document uploaded toVeryfion this call
var response = await _client.ProcessDocumentAsync(bytes);
return response.Vendor?.Name;
}
public async Task<decimal?> GetTotalAsync(string documentPath)
{
var bytes = File.ReadAllBytes(documentPath);
var response = await _client.ProcessDocumentAsync(bytes);
return response.Total;
}
}
IronOCR Yaklaşımı:
using IronOcr;
using System.Text.RegularExpressions;
public class ExpenseDocumentService
{
private readonly IronTesseract _ocr;
// One license key — set once at startup, not per-instance
public ExpenseDocumentService()
{
_ocr = new IronTesseract();
}
public string GetVendorName(string documentPath)
{
// All processing local — document bytes never leave this server
var result = _ocr.Read(documentPath);
// Vendor is typically the first non-whitespace line on a receipt
return result.Pages[0].Paragraphs
.OrderBy(p => p.Y)
.Select(p => p.Text.Trim())
.FirstOrDefault(t => t.Length > 3);
}
public decimal? GetTotal(string documentPath)
{
var result = _ocr.Read(documentPath);
var match = Regex.Match(result.Text,
@"(?:Total|Grand Total|Amount Due):?\s*\$?\s*([\d,]+\.\d{2})",
RegexOptions.IgnoreCase);
return match.Success
? decimal.Parse(match.Groups[1].Value.Replace(",", ""))
: (decimal?)null;
}
}
Yapıcı değişikliği her ortamdaki dört konfigürasyon kaydını ortadan kaldırır: appsettings.json, Docker secrets, Azure Key Vault referansları ve CI/CD pipeline değişkenleri. IronTesseract örneği aynı thread üzerinde birden fazla çağrıda yeniden kullanılabilir. ASP.NET Core bağımlılık enjeksiyon konteynırlarında singleton kayıt desenleri için IronTesseract kurulum kılavuzu'na bakın.
Bölge Tabanlı OCR ile Fiş Alan Çıkarımı
Veryfi, fiş alanlarını, eğitilmiş ML modellerini tüm belge görüntüsünde çalıştırarak ve önceden yapılandırılmış bir JSON yanıtını döndürerek çıkarır. IronOCR'nin eşdeğeri CropRectangle kullanarak bölge bazlı OCR'dir, bu işlem makbuz resminin spesifik alanlarını hedefler—satıcı için başlık bölgesi, toplamlar için alt bilgi bölgesi—tüm sayfa geçişi yapmak ve çıktıda desenler aramak yerine. Bu, bilinen düzenler için daha hızlı ve ilgili alan iyi tanımlandığında daha doğrudur.
Veryfi Yaklaşımı:
using Veryfi;
public class ReceiptFieldExtractor
{
private readonly VeryfiClient _client;
public ReceiptFieldExtractor(VeryfiClient client)
{
_client = client;
}
public async Task<(string Vendor, decimal? Total, decimal? Tax)>
ExtractReceiptFieldsAsync(string imagePath)
{
var bytes = File.ReadAllBytes(imagePath);
// Full document uploaded — Veryfi's ML returns structured fields
var response = await _client.ProcessDocumentAsync(bytes);
return (
Vendor: response.Vendor?.Name,
Total: response.Total,
Tax: response.Tax
);
}
}
IronOCR Yaklaşımı:
using IronOcr;
using System.Text.RegularExpressions;
public class ReceiptFieldExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
public (string Vendor, decimal? Total, decimal? Tax)
ExtractReceiptFields(string imagePath)
{
// Region 1: Header zone — vendor name typically in top 15% of receipt
var headerRegion = new CropRectangle(0, 0, 800, 150);
using var headerInput = new OcrInput();
headerInput.LoadImage(imagePath, headerRegion);
headerInput.Deskew();
var headerResult = _ocr.Read(headerInput);
// Region 2: Footer zone — totals typically in bottom 20% of receipt
var footerRegion = new CropRectangle(0, 650, 800, 200);
using var footerInput = new OcrInput();
footerInput.LoadImage(imagePath, footerRegion);
footerInput.DeNoise();
var footerResult = _ocr.Read(footerInput);
var vendor = headerResult.Pages[0].Paragraphs
.OrderBy(p => p.Y)
.Select(p => p.Text.Trim())
.FirstOrDefault(t => t.Length > 3);
var footerText = footerResult.Text;
var totalMatch = Regex.Match(footerText,
@"(?:Total|Grand Total):?\s*\$?\s*([\d,]+\.\d{2})",
RegexOptions.IgnoreCase);
var taxMatch = Regex.Match(footerText,
@"(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.\d{2})",
RegexOptions.IgnoreCase);
return (
Vendor: vendor,
Total: totalMatch.Success
? decimal.Parse(totalMatch.Groups[1].Value.Replace(",", ""))
: (decimal?)null,
Tax: taxMatch.Success
? decimal.Parse(taxMatch.Groups[1].Value.Replace(",", ""))
: (decimal?)null
);
}
}
CropRectangle piksel cinsinden (x, y, width, height) alır. Sadece başlık ve alt bilgi bölgelerini işlemek, tam sayfa okumaktan daha hızlıdır ve fişin gövdesindeki satır maddesi miktarlarından yanlış eşleşmeleri önler. bölge tabanlı OCR kılavuzu, değişken boyutlu belgeler için koordinat ölçme stratejilerini kapsar ve bölge kırpma örneği, tam deseni gösterir.
Yapılandırılmış Paragraf Verisiyle Gider Sınıflandırması
Veryfi, response.LineItems'yı önceden yapılandırılmış bir nesneler dizisi şeklinde geri döner ve Description, Quantity, UnitPrice ve Total zaten ayrıştırılmıştır. IronOCR, her bir metin bloğunu X/Y koordinatları ile açığa çıkaran result.Pages[0].Paragraphs ve result.Lines aracılığıyla eşdeğerini sunar. Gider sınıflandırma mantığı — bir satır öğesinin yemek, seyahat, malzeme veya yazılım ücreti olup olmadığını belirlemek — her iki şekilde de aynı metin üzerinde çalışır. Fark,IronOCR ile, sınıflandırma mantığına sahip, ayarlayabilir ve uzatabilir olmanızdır, ücretli ML yeniden eğitim döngüsü olmadan.
Veryfi Yaklaşımı:
using Veryfi;
public class ExpenseCategorizer
{
private readonly VeryfiClient _client;
public ExpenseCategorizer(VeryfiClient client)
{
_client = client;
}
public async Task<Dictionary<string, decimal>> CategorizeExpensesAsync(string receiptPath)
{
var bytes = File.ReadAllBytes(receiptPath);
var response = await _client.ProcessDocumentAsync(bytes);
var categories = new Dictionary<string, decimal>();
// Line items arrive pre-parsed from Veryfi's ML pipeline
foreach (var item in response.LineItems ?? Enumerable.Empty<dynamic>())
{
var category = response.Category ?? "Uncategorized";
var amount = (decimal)(item.Total ?? 0m);
if (!categories.ContainsKey(category))
categories[category] = 0m;
categories[category] += amount;
}
return categories;
}
}
IronOCR Yaklaşımı:
using IronOcr;
using System.Text.RegularExpressions;
public class ExpenseCategorizer
{
private readonly IronTesseract _ocr = new IronTesseract();
// Keyword-based categorization — tune these for your expense policy
private static readonly Dictionary<string, string[]> CategoryKeywords = new()
{
["Meals & Entertainment"] = new[] { "restaurant", "cafe", "coffee", "lunch", "dinner", "food", "bar" },
["Travel"] = new[] { "airline", "hotel", "uber", "lyft", "taxi", "parking", "gas", "fuel" },
["Office Supplies"] = new[] { "staples", "office depot", "paper", "ink", "toner", "supplies" },
["Software & Subscriptions"] = new[] { "adobe", "microsoft", "github", "aws", "azure", "slack" }
};
public Dictionary<string, decimal> CategorizeExpenses(string receiptPath)
{
var result = _ocr.Read(receiptPath);
// Use paragraph coordinates to isolate line items
// Line items typically appear in the middle vertical band of the receipt
var lineItemParagraphs = result.Pages[0].Paragraphs
.Where(p => p.Y > 150 && p.Y < 650) // skip header/footer regions
.OrderBy(p => p.Y)
.ToList();
var categories = new Dictionary<string, decimal>();
var pricePattern = new Regex(@"\$?([\d,]+\.\d{2})$");
var vendorText = result.Text.ToLower();
// Determine top-level category from vendor name
var topCategory = "Uncategorized";
foreach (var (cat, keywords) in CategoryKeywords)
{
if (keywords.Any(kw => vendorText.Contains(kw)))
{
topCategory = cat;
break;
}
}
// Extract individual line item amounts
foreach (var para in lineItemParagraphs)
{
var priceMatch = pricePattern.Match(para.Text.Trim());
if (!priceMatch.Success)
continue;
if (!decimal.TryParse(priceMatch.Groups[1].Value.Replace(",", ""), out var amount))
continue;
// Classify individual items where keywords appear in the description
var itemCategory = topCategory;
var descriptionText = para.Text.ToLower();
foreach (var (cat, keywords) in CategoryKeywords)
{
if (keywords.Any(kw => descriptionText.Contains(kw)))
{
itemCategory = cat;
break;
}
}
if (!categories.ContainsKey(itemCategory))
categories[itemCategory] = 0m;
categories[itemCategory] += amount;
}
return categories;
}
}
Paragraphs koleksiyonu her bir metin bloğunun Y koordinatını sağlar, bu da standart bir makbuz düzeninde satır öğelerinin göründüğü dikey bölgeyi izole etmeyi kolaylaştırır. Koordinat özellikleriyle Pages, Paragraphs, Lines, Words ve Characters'nin tam hiyerarşisi yapılandırılmış veri erişim kılavuzunda açıklanmıştır. Kötü tarama kalitesine sahip fişler için — buruşmuş kağıt, düşük kontrastlı termal baskı — görüntü kalite düzeltme kılavuzu, sınıflandırma mantığı çalışmadan önce doğruluğu artıran ön işleme filtrelerini kapsar.
Webhook Kaldırılması ve Senkron Batch Değiştirme
Yüksek belge hacimlerinde,Veryfipolling üzerine webhook tabanlı bildirim önerir. Kalıp, genel erişilebilir bir HTTPS uç noktası, imza doğrulaması için bir webhook sırrı, webhook ateşlenene kadar sonuçları tutmak için bir kuyruk ve kaçırılan teslimatlar için yeniden deneme mantığı gerektirir. Bu, sonunda bulut OCR'nin yerel işleme göre yavaş olduğu gerçeğine yönelik bir geçici çözüm olan önemli bir altyapıdır.IronOCR senkron olarak işler. Bir webhook ile köprü kuracak bir asenkron boşluk yoktur.
Veryfi Yaklaşımı:
using Veryfi;
using Microsoft.AspNetCore.Mvc;
//Veryfiwebhook receiver — required for high-volume reliable processing
[ApiController]
[Route("webhooks")]
public class VeryfiWebhookController : ControllerBase
{
private readonly IDocumentResultQueue _queue;
public VeryfiWebhookController(IDocumentResultQueue queue)
{
_queue = queue;
}
[HttpPost("veryfi")]
public IActionResult ReceiveWebhook([FromBody] VeryfiWebhookPayload payload,
[FromHeader(Name = "X-Veryfi-Token")] string token)
{
// Validate webhook signature — prevents spoofed payloads
if (!IsValidSignature(token, payload))
return Unauthorized();
// Enqueue result for async downstream consumption
_queue.Enqueue(new DocumentResult
{
DocumentId = payload.Id,
Vendor = payload.Data?.Vendor?.Name,
Total = payload.Data?.Total
});
return Ok();
}
private bool IsValidSignature(string token, VeryfiWebhookPayload payload) =>
// HMAC validation against webhook secret — infrastructure requirement
token == ComputeHmac(payload, Environment.GetEnvironmentVariable("VERYFI_WEBHOOK_SECRET"));
}
// Document batch submission — fire and forget, results arrive via webhook
public class VeryfiDocumentBatchSubmitter
{
private readonly VeryfiClient _client;
public async Task SubmitBatchAsync(string[] documentPaths)
{
foreach (var path in documentPaths)
{
var bytes = File.ReadAllBytes(path);
// Submit — result arrives asynchronously via webhook, not here
await _client.ProcessDocumentAsync(bytes);
}
}
}
IronOCR Yaklaşımı:
using IronOcr;
using System.Text.RegularExpressions;
using System.Collections.Concurrent;
// No webhook controller needed — results are synchronous and local
public class DocumentBatchProcessor
{
// IronTesseract is thread-safe when one instance is created per thread
public List<DocumentResult> ProcessBatch(string[] documentPaths)
{
var results = new ConcurrentBag<DocumentResult>();
Parallel.ForEach(documentPaths, documentPath =>
{
// One IronTesseract per thread — thread-safe pattern
var ocr = new IronTesseract();
var result = ocr.Read(documentPath);
results.Add(new DocumentResult
{
FilePath = documentPath,
Vendor = ExtractVendor(result),
Total = ExtractTotal(result.Text),
Confidence = result.Confidence,
// Result is available immediately — no queue, no webhook
ProcessedAt = DateTime.UtcNow
});
});
return results.OrderBy(r => r.FilePath).ToList();
}
private string ExtractVendor(OcrResult result)
{
// Vendor: first substantive paragraph ordered by vertical position
return result.Pages[0].Paragraphs
.OrderBy(p => p.Y)
.Select(p => p.Text.Trim())
.FirstOrDefault(t => !string.IsNullOrWhiteSpace(t) && t.Length > 3);
}
private decimal? ExtractTotal(string text)
{
var match = Regex.Match(text,
@"(?:Total|Grand Total|Amount Due):?\s*\$?\s*([\d,]+\.\d{2})",
RegexOptions.IgnoreCase);
return match.Success
? decimal.Parse(match.Groups[1].Value.Replace(",", ""))
: (decimal?)null;
}
}
public class DocumentResult
{
public string FilePath { get; set; }
public string Vendor { get; set; }
public decimal? Total { get; set; }
public double Confidence { get; set; }
public DateTime ProcessedAt { get; set; }
}
Webhook katmanını kaldırmak, HTTPS uç noktası, webhook sırrı döndürme gereksinimi, sonuç kuyruğu, HMAC doğrulama mantığı ve yeniden deneme yapılandırmasını ortadan kaldırır. Çok aşamalı borulama yalnızca Veryfi'nin sonuçlarının uzak bir sunucudan eşzamansız olarak gelmesi nedeniyle vardır.IronOCR ile, tümünü Parallel.ForEach değiştirir. Çoklu iş parçacığı örneği ayrıntılı olarak thread başına IronTesseract modelini gösterir ve asenkron OCR kılavuzu UI tepki hızı için Task.Run entegrasyonunu kapsar. Hız optimizasyon kılavuzu, toplu iş yükleri için maksimum verimle örnek yapılandırmasını kapsar.
Veryfi API'den IronOCR'a Haritalama Referansı
| Veryfi | IronOCR Karşılığı |
|---|---|
new VeryfiClient(clientId, clientSecret, username, apiKey) | new IronTesseract() + IronOcr.License.LicenseKey = "key" |
_client.ProcessDocumentAsync(bytes) | ocr.Read(filePath) veya ocr.Read(ocrInput) |
_client.ProcessDocumentAsync(bytes, categories: new[] { "invoices" }) | input.LoadPdf(path); ocr.Read(input) |
_client.ProcessDocumentAsync(bytes, categories: new[] { "bank_statements" }) | input.LoadPdf(path); ocr.Read(input) |
response.Vendor?.Name | İlk paragraf p.Y tarafından result.Pages[0].Paragraphs içinde sıralanmıştır |
response.Total | Regex.Match(result.Text, @"Total:?\s*\$?([\d,]+\.\d{2})") |
response.Tax | Regex.Match(result.Text, @"Tax:?\s*\$?([\d,]+\.\d{2})") |
response.Date | Regex.Match(result.Text, @"\d{1,2}/\d{1,2}/\d{4}") |
response.LineItems | Y koordinat aralığı ile filtrelenmiş result.Pages[0].Paragraphs |
response.InvoiceNumber | Regex.Match(result.Text, @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)") |
response.BankAccount?.AccountNumber | Regex.Match(result.Text, @"Account\s*#?\s*:?\s*(\d{4,})") |
response.BankAccount?.RoutingNumber | Regex.Match(result.Text, @"Routing\s*#?\s*:?\s*(\d{9})") |
response.ConfidenceScore | result.Confidence (genel) veya word.Confidence (kelime başına) |
response.Payment?.Last4 | Regex.Match(result.Text, @"\*{4}\s*(\d{4})") |
VeryfiApiException (401/402/429/500) | Standart .NET istisnaları — yerel işlem için HTTP hata kodları yok |
| Yükleme öncesi Base64 kodlaması | Gerekli değil — ocr.Read(filePath) dosya yollarını doğrudan kabul eder |
response.Category | result.Text karşı özelleştirilmiş anahtar kelime eşleştirme |
| Webhook yükü serileştirmesi | Gerekli değil — ocr.Read() sonucu senkron olarak döndürür |
Tekrar/geri çekilme ile ProcessDocumentAsync | Gerekli değil — yerel işlemde oran sınırları yok |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Önceden Ayrıştırılmış Alanların Eksikliği
Veryfi: response.Vendor?.Name, response.Total ve response.LineItems önceden eğitilmiş bir ML modelinden yapılandırılmış alanlar olarak gelir. İstemci tarafında bir çıkarım mantığı gerekli değil.
Çözüm: Uygulamanızın kullandığı her alan için Regex desenleri yazın. Geçiş çabası, işlediğiniz farklı belge düzenleri sayısına bağlı olarak genellikle 8-24 saat sürer. Yaygın makbuz ve fatura desenleri için, fatura OCR öğreticisi ve makbuz tarama öğreticisi tam çıkarma desen uygulamaları sunar.
// Map eachVeryfifield to a Regex extraction
private static readonly Dictionary<string, string> FieldPatterns = new()
{
["InvoiceNumber"] = @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)",
["PurchaseOrder"] = @"(?:PO|P\.O\.|Purchase Order)\s*#?\s*:?\s*(\w+)",
["DueDate"] = @"Due\s*(?:Date)?:?\s*(\d{1,2}/\d{1,2}/\d{4})",
["PaymentTerms"] = @"(?:Terms|Net)\s*:?\s*(\w+\s*\d+)"
};
public string ExtractField(string text, string fieldName)
{
if (!FieldPatterns.TryGetValue(fieldName, out var pattern))
return null;
var match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
return match.Success ? match.Groups[1].Value.Trim() : null;
}
Sorun 2: Kod Tabanındaki Eşzamansız Metot İmzaları
Veryfi: ProcessDocumentAsync,VeryfiSDK seviyesinde asenkron çalışır. Ekipler genellikle await'ı çağrı yığınına kadar her çağrı metoduna taşırlar, bu da hizmet sınıfları, denetleyiciler ve arka plan görevlerinin tümünün async Task<t> imzalarını taşıdığı anlamına gelir.
Çözüm: IronOCR'nin Read() senkron çalışır. Mevcut async metod imzaları geçiş süresince Task.Run ile sardığında korunabilir. Bu, kod tabanındaki büyük çaplı imza değişikliklerinden kaçınırken bulut bağımlılığını da ortadan kaldırır.
// Preserve async signature during transition — no codebase-wide refactor needed
public async Task<string> GetVendorNameAsync(string documentPath)
{
return await Task.Run(() =>
{
var result = _ocr.Read(documentPath);
return result.Pages[0].Paragraphs
.OrderBy(p => p.Y)
.Select(p => p.Text.Trim())
.FirstOrDefault(t => t.Length > 3);
});
}
Sorun 3: Çevrelerde Dağınık Kimlik Bilgileri Yapılandırması
Veryfi: Dört kimlik bilgisi (Veryfi:ClientId, Veryfi:ClientSecret, Veryfi:Username, Veryfi:ApiKey) appsettings.json, Docker Compose dosyalarındaki ortam değişken blokları, GitHub Actions gizli bilgileri, Azure Key Vault referansları ve CI/CD boru hattı konfigürasyonlarında görünür.
Çözüm: Tüm çevrelerden dört kimlik girişini arayın ve kaldırın. Tek bir IRONOCR_LICENSE_KEY ortam değişkeni ekleyin. Başlangıçta yükleyin.
# Find allVeryficredential references
grep -r "Veryfi:ClientId\|Veryfi:ClientSecret\|Veryfi:Username\|Veryfi:ApiKey" \
--include="*.json" --include="*.yml" --include="*.yaml" --include="*.env" .
// Load from environment at startup
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")
?? throw new InvalidOperationException("IRONOCR_LICENSE_KEY not set");
Sorun 4: Görünmeyen Tarama Kalitesi Sorunları
Veryfi: Bulut işlem, ML çıkarımı çalışmadan önce sunucu tarafı görüntü iyileştirmeyi içerir. Düşük kaliteli makbuz taramaları - kırışık kağıt, solmuş termal baskı, eğik telefon fotoğrafları - alan çıkarımından önce sessizce düzeltilmişti.
Çözüm: IronOCR'un ön işleme hattını açıkça uygulayın. Deskew(), DeNoise() ve Contrast(), gerçek dünya makbuz tarama kalitesi sorunlarının çoğunu kapsar.
using var input = new OcrInput();
input.LoadImage("receipt-phone-photo.jpg");
input.Deskew(); // correct rotation from angled phone capture
input.DeNoise(); // remove compression artifacts
input.Contrast(); // improve faded thermal print
input.Sharpen(); // recover edge detail
var result = _ocr.Read(input);
Görüntü kalitesi düzeltme kılavuzu ve görüntü filtreleri öğreticisi, belirli tarama bozulma desenleri için hangi filtrelerin uygulanacağını açıklar.
Sorun 5: Yüksek Hacimli Toplu İşleme Verimliliği
Veryfi: Oran sınırları belge gönderim hızını yavaşlatır. HTTP 429 yanıtları, üstel durdurma mantığı gerektirir. Verimlilik, cihazınızın donanımından ziyade Veryfi'nin plan başına oran sınırı ile sınırlıdır.
**Çözüm:**IronOCR yalnızca CPU çekirdekleriyle sınırlıdır. Her thread için bir IronTesseract örneği ile Parallel.ForEach kullanın. 8 çekirdekli bir sunucuda, verimlilik çekirdek sayısına göre yaklaşık olarak doğrusal olarak ölçeklenir.
// One IronTesseract per thread — do not share instances across threads
Parallel.ForEach(
documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
path =>
{
var ocr = new IronTesseract();
var result = ocr.Read(path);
SaveResult(path, result.Text, result.Confidence);
});
Sorun 6: Çok Özel JSON Şeması Veryfi'ye Kilitli
Veryfi: Tüm çıkarım kodları Veryfi'nin yanıt şemasından okur: response.Vendor?.Name, response.LineItems, response.BankAccount?.RoutingNumber. Bu kod yalnızca Veryfi'nin SDK'sı ile çalışır.VeryfiAPI güncellemesinde bir alan adı değişikliği uygulama kodunu bozar.
**Çözüm:**IronOCR çıkartımı düz metne karşı standart .NET System.Text.RegularExpressions.Regex kullanır. Desenler taşınabilirdir, herhangi bir SDK taklit etmeden test edilebilir ve kontrolünüz altındadır. Birim testler, herhangi bir ağ bağlantısı olmadan çalışır.
// Extraction logic that is fully portable and unit-testable
[Fact]
public void ExtractsRoutingNumberFromInvoiceText()
{
const string sampleText = "Routing Number: 021000021\nAccount: 1234567890";
var match = Regex.Match(sampleText, @"Routing\s*(?:Number)?:?\s*(\d{9})",
RegexOptions.IgnoreCase);
Assert.True(match.Success);
Assert.Equal("021000021", match.Groups[1].Value);
}
Veryfi Göç Kontrol Listesi
Öncesi-Geçiş
Herhangi bir koda dokunmadan önce, tümVeryfikullanımının envanterini almak için kod tabanını denetleyin:
# Find allVeryfiusing statements
grep -rn "using Veryfi" --include="*.cs" .
# Find all VeryfiClient instantiations
grep -rn "VeryfiClient\|ProcessDocumentAsync" --include="*.cs" .
# Find allVeryfiresponse field accesses
grep -rn "response\.Vendor\|response\.Total\|response\.LineItems\|response\.BankAccount" --include="*.cs" .
# Find all credential configuration references
grep -r "Veryfi:ClientId\|Veryfi:ClientSecret\|Veryfi:Username\|Veryfi:ApiKey" \
--include="*.json" --include="*.yml" --include="*.yaml" --include="*.env" .
# Find all webhook-related code
grep -rn "VeryfiWebhook\|X-Veryfi-Token\|webhook" --include="*.cs" .
Toplam ProcessDocumentAsync çağrı sitesi sayısını, her çağrı sitesinde erişilen yanıt alanlarını veVeryfikimlik bilgilerini içeren ortamların listesini kaydedin.
Kod Geçişi
- Çözümdeki tüm projelerden
VeryfiNuGet paketini kaldırın. - Daha önce
Veryfireferans veren tüm projelereIronOcrNuGet paketini yükleyin. - Uygulamanın başlangıcına (herhangi bir OCR çağrısından önce)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin. - Tüm
using Veryfi;veusing Veryfi.Models;ifadeleriniusing IronOcr;ile değiştirin. VeryfiClientyapılandırıcı enjeksiyonunuIronTesseractalan başlatımı ile değiştirin.- Her
appsettings.json,appsettings.*.jsonve gizli yapılandırma dosyasından tüm dörtVeryfikimlik bilgisi girişini kaldırın. ProcessDocumentAsync(bytes)çağrılarınıocr.Read(filePath)veyaocr.Read(ocrInput)'e dönüştürün.response.Vendor?.Nameerişimleriniresult.Pages[0].Paragraphs'dan paragraf sıralı metin çıkartma ile değiştirin.response.Total,response.Tax,response.InvoiceNumberve diğer yapılandırılmış alan erişimleriniresult.Text'e karşı Regex desenleri ile değiştirin.response.LineItemsyinelemesini Y koordinatına göre filtrelenmişresult.Pages[0].Paragraphsyinelemesi ile değiştirin.- Webhook denetleyici sınıflarını silin ve webhook uç nokta kayıtlarını kaldırın.
- Tüm ortamlardan webhook gizli ortam değişkenlerini kaldırın.
- Tarama görüntü girdileri için ön işleme ile (
Deskew(),DeNoise(),Contrast())OcrInputekleyin. - Tek iş parçacıklı ardışık döngüleri bir thread başına bir
IronTesseractkullanarakParallel.ForEachile değiştirin. - Tüm ortam değişkeni konfigürasyonlarına ve CI/CD gizli depolarına
IRONOCR_LICENSE_KEYekleyin.
Geçiş Sonrası
- Taşıma dağıtımından sonra HTTP trafik günlüklerindeVeryfiağ çağrılarının görünmediğini doğrulayın.
- Çıkarılan satıcı isimlerinin 20-50 makbuzluk örnek bir sete karşı beklenen değerlere uyduğunu doğrulayın.
- Çıkarılan toplamların, aynı örnek set için $0.01 toleransı içinde beklenen değerlere uyduğunu doğrulayın.
- Belge korpusundaki her fatura formatı için fatura numarası çıkarımının başarıyla gerçekleştiğini doğrulayın.
- Oran sınırı kaldırılmasını doğrulamak için temelVeryfiverimliliğine karşı toplu işlem hızını test edin.
- Tam test süitini herhangi bir ağ bağlantısı olmadan çalıştırarak sıfır bulut bağımlılığını doğrulayın.
- Temiz belge taramaları için
result.Confidencepuanlarının %80'i aştığını doğrulayın; %80'in altı bir ön işleme adımının eklenmesi gerektiğini gösterir. - Her ortamdan (geliştirme, hazırlık, üretim) dörtVeryfikimlik bilgisinin kaldırıldığını doğrulayın.
- Webhook uç noktalarının 404 döndürdüğünü veya yönlendirme tablosundan kaldırıldığını doğrulayın.
- Ön işleme hattı aktifken düşük kaliteli makbuz taramaları (kırışık, soluk, eğik) üzerindeki davranışı test edin.
IronOCR'a Geçişin Ana Faydaları
Yerel olarak işlenen finansal belgeler, üçüncü şahıslarda ihlal edilemeyecek belgelerdir. Göçten sonra, faturalardan çıkarılan banka hesap numaraları, çeklerden ayrıştırılan yönlendirme numaraları ve banka hesap özetlerinden okunan işlem geçmişleri donanımınızda işlenir. Hiçbir üçüncü taraf güvenlik olayı, alt yüklenici veri erişimi veyaVeryfialtyapı ihlali belgeleri ortaya çıkaramaz, çünkü belgeler sunucularınızı asla terk etmez.
Doküman başına maliyet, taşıma dağıtıldığı gün sıfıra düşer. Ayda 50.000 belge ile, $5.000-15.000 arasındaki aylıkVeryfimaliyeti kaybolur. $2,399 değerindeki tek seferlik IronOCR Professional lisansı, ilk ayın ilk haftasında geri kazanılır. Daha yüksek hacimlerde, tasarruflar her yıl hacim indirimi müzakereleri veya sözleşme yenileme olmadan birikimli hale gelir.
İşleme verimliliği donanımla ölçeklenir, bir tedarikçinin oran sınırlarıyla değil. HTTP 429 yanıtları, plan seviyesinde verimlilik sınırları ve mevsimsel fazlalık ücretleri bulut API'lerinin mimari eserleridir.IronOCR ile CPU çekirdekleri eklemek, verimliliği orantılı olarak artırır. 10.000 makbuzluk bir toplu, Veryfi'nin oran sınırı programında değil, sizin zaman çizelgenizde işlenir.
Herhangi bir belge türü aynı API ile işlenir. Kuruluş artık, İK ekibinin işe alım formu işlemesi istediğinde, hukuk sözleşme metni çıkarımı gerektiğinde veya operasyonlar gönderim belgesi verilerine ihtiyaç duyduğunda, ikinci bir OCR aracı gerekmez. ocr.Read() hepsini ele alır. resimlerden metin okuma öğreticisi ve özel belge kılavuzları, IronOCR'un işlediği belge türlerinin tam yelpazesini kapsar.
Çıkarım mantığı kod tabanının birinci sınıf bir parçası haline gelir. Regex desenleri kaynak kontrolünde mevcuttur, çekme isteklerinde gözden geçirilebilir, herhangi bir SDK taklit etmeden birim testlerinde test edilebilir ve üretim geri bildirimine göre ayarlanabilir. Veryfi'nin önceden eğitilmiş modeli yanlış bir satıcı adı döndürdüğünde, ayarlayacak bir şey yoktur. IronOCR'un çıkarım deseni yanlış bir satıcı adı döndürdüğünde, çözüm, birim testi ile bir satırlık regex değişikliğidir. IronOCR lisanslama sayfası, yıllık faturalamayı sürekli satın almaya tercih eden ekipler için SaaS abonelik yolunu da içeren katman seçeneklerini kapsar.
Dağıtım alanı, her yerde çalışan tek bir NuGet paketine küçülür. IronOCR, harici bağımlılıklar, yerel ikili yönetimi ve tessdata klasörü yapılandırması olmadan tek bir paket olarak kurulur. Aynı paket referansı, platforma özel kod olmadan Windows, Linux, macOS, Docker, Azure App Service ve AWS Lambda'da çözülür. Docker dağıtım kılavuzu ve Linux dağıtım kılavuzu, Veryfi'nin ağ çıkış gereksiniminin bir dağıtım engelleyici olduğu konteyner ortamlarda kullanılabilir.

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.