C#'da Plaka Üzerinde OCR Nasıl Yapılır?
Bu rehber,Kofax OmniPageCapture SDK'sını (şu an Tungsten Automation olarak pazarlanan) ve IronOCR'a OCR iş yüklerini uzaklaştıran .NET geliştiricilerine yöneliktir. Bu, SDK yükleyici bağımlılığını kaldırma, motor yaşam döngüsü törenini ortadan kaldırma, bölge tabanlı tanıma kalıplarını değiştirme ve hata yönetimini modernize etme tam geçiş yolunu kapsar. Karşılaştırma makalesinin önceden okunması gerekmez.
NedenKofax OmniPage(Tungsten)dan Geçmelisiniz
OmniPage Capture SDK, NuGet, Docker ve CI/CD boru hatlarında önceki bir dönemde kurumsal belge yönetim altyapısı için tasarlandı. 2005 yılında mantıklı olan mimari seçimlerin her biri, 2026'da sürtünme yaratır.
SDK yükleyici, bir NuGet dünyasında yeri yoktur. OmniPage kodunu çalıştıran her geliştirme makinesi, yapı aracı ve üretim sunucusu, derleme öncesi Tungsten SDK yükleyicisini çalıştırmalıdır. Geri yüklemek için hiçbir .csproj paket referansı yok. SDK sürümünü yükseltmek, tüm filo genelinde yükleyiciyi yeniden çalıştırmayı gerektirir. Yeni bir geliştirici, SDK lisansını kim yönetiyorsa onu temas kurmadan ve yükleyici erişimini beklemeden projeyi çalıştıramaz.
Lisans dosyası operasyonel bir sorumluluktur. Her makinede belirtilen bir yolda bir .lic dosyası bulunmalıdır ve engine.Initialize() çağrısında bulunulmalıdır. Yeni bir sunucuya dağıtın ve dosyayı unutun; her OCR çağrısı bir lisans istisnası — bir OCR hatası değil — ile başarısız olur. Uçucu lisansları ve uygulama sunucunuz ile lisans sunucusu arasında bir ağ bölümlendirmesi kullanmak, o makine lisansını dün başarıyla doğrulasa bile, her Initialize() çağrısının bağlantı sağlanana kadar başarısız olmasına yol açar.
Motor yaşam döngüsü yönetimi hata yollarında kaynakları sızdırır. OmniPageEngine.Shutdown() her olası kod yolunda çağrılmalıdır — istisna işleyicileri, erken dönüşler ve zaman aşımı dahil — aksi halde uçucu bir lisans koltuğu kilitli kalır ve lisans sunucusunun çıkış zaman aşımı süresinin dolmasını bekler. Bu kısıtlamaya karşı koruyucu kod yazmak, motor kapatma adımının atlanmasına karşı korumak için yalnızca IDisposable desenlerinin tüm entegrasyon noktalarını sarmak anlamına gelir.
Donanım parmak izi, modern dağıtımla çakışıyor. OmniPage aktivasyonu donanıma bağlıdır. Konteyner yeniden başlatmaları, VM taşınmaları, ve bulut otomatik ölçeklendirmeleri, yeniden aktivasyon taleplerini tetikleyen donanım kimliği değişikliklerini içerir. Otomatik ölçeklendirmeyle uyumsuz bir dağıtım modeli, bulut altyapısıyla uyumsuz bir dağıtım modelidir.
Sayfa başı fiyatlandırma, ölçeklenirken öngörülemez. Bir belge işlem artışı — yeni bir müşteri yerleşik, birikmiş bir toplu iş teslim edilmiş — kimsenin bütçelendirmediği bir kota karşı aşırı ödeme faturası oluşturur. IronOCR, lisanslı katman içinde süresiz ve sınırsızdır: sayfa başına sayaç yok, kota yok, aşırılık faturası yok.
Satın alma süreci gönderim engelleri. OmniPage SDK satış ağına yönlendirilir. Değerlendirme erişimi, fiyatlandırma ve sözleşme koşulları, 4-12 haftayı bulan bir satış görüşmesini gerektirir. Ürün teslim süresinin baskısı altındaki OCR özellikleri oluşturan takımlar, bir kurumsal satın alma döngüsünü bekleyemez. 30 saniye içinde dotnet add package IronOcr çözümlenir. IronOCR lisanslama sayfası'nı yayınlanmış, kendi kendine hizmet fiyatlandırması için inceleyin — $999 Lite ile $2,999 Enterprise arasındadır, hepsi süresiz.
Temel Sorun
OmniPage, ilk bayt okunmadan önce tam bir başlatma töreni ve son bayt okuduktan sonra bir kapatma töreni gerektirir — her çağrı noktası her ikisini de yönetmelidir:
// OmniPage: Ceremony required on EVERY entry point — init, process, shutdown
using var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic"); // File must exist here
engine.Initialize(); // Network call to license server — can fail for license reasons, not OCR reasons
var document = engine.CreateDocument();
document.AddPage("invoice.jpg");
document.Recognize(new RecognitionSettings { Language = "English" });
string text = document.GetText();
document.Dispose(); // Must not be skipped
engine.Shutdown(); // Must not be skipped — omitting this locks a floating seat
// OmniPage: Ceremony required on EVERY entry point — init, process, shutdown
using var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic"); // File must exist here
engine.Initialize(); // Network call to license server — can fail for license reasons, not OCR reasons
var document = engine.CreateDocument();
document.AddPage("invoice.jpg");
document.Recognize(new RecognitionSettings { Language = "English" });
string text = document.GetText();
document.Dispose(); // Must not be skipped
engine.Shutdown(); // Must not be skipped — omitting this locks a floating seat
Imports OmniPage
' OmniPage: Ceremony required on EVERY entry point — init, process, shutdown
Using engine As New OmniPageEngine()
engine.SetLicenseFile("C:\Program Files\OmniPage\license.lic") ' File must exist here
engine.Initialize() ' Network call to license server — can fail for license reasons, not OCR reasons
Dim document = engine.CreateDocument()
document.AddPage("invoice.jpg")
document.Recognize(New RecognitionSettings With {.Language = "English"})
Dim text As String = document.GetText()
document.Dispose() ' Must not be skipped
engine.Shutdown() ' Must not be skipped — omitting this locks a floating seat
End Using
// IronOCR: One NuGet package, one line at startup, one call to read
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; // At app startup — once, ever
var text = new IronTesseract().Read("invoice.jpg").Text;
// IronOCR: One NuGet package, one line at startup, one call to read
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; // At app startup — once, ever
var text = new IronTesseract().Read("invoice.jpg").Text;
Imports IronOcr
' IronOCR: One NuGet package, one line at startup, one call to read
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY" ' At app startup — once, ever
Dim text = New IronTesseract().Read("invoice.jpg").Text
OmniPage sürümünün sekiz farklı adımı vardır, iki zorunlu temizlik çağrısı, bir ağ bağımlılığı ve dosya sistemi bağımlılığı.IronOCR sürümü iki adıma sahiptir.
IronOCR vsKofax OmniPage(Tungsten): Özellik Karşılaştırması
Aşağıdaki tablo, bu geçişi değerlendiren ekipler için en alakalı yetenekleri kapsamaktadır.
| Özellik | Kofax OmniPage SDK | IronOCR |
|---|---|---|
| Kurulum yöntemi | Özel SDK yükleyici (NuGet yok) | dotnet add package IronOcr |
| İlk OCR çağrısına kadar geçen süre | 4–12 hafta (tedarik) + saatler (kurulum) | 30 saniye |
| Lisans mekanizması | Diskteki .lic dosyası + isteğe bağlı lisans sunucusu |
Uygulama başlangıcında dize anahtarı |
| Donanım parmak izi belirleme | Evet (VM taşıması sırasında yeniden aktivasyon) | Hayır |
| Lisans sunucusu gerekli | Evet (yüzer lisanslar için) | Hayır |
| Sayfa başına çalışma süresi faturalandırma | Mevcut (değişken) | Hayır |
| Yayınlanmış fiyatlar | Hayır (satış birimiyle iletişime geçin) | Evet ($999 / $1,499 / $2,999 süresiz) |
| Yıllık bakım ücretleri | Lisans maliyetinin %18-25'i | Opsiyonel |
| Motor yaşam döngüsü yönetimi | Gerekli (Initialize / Shutdown) |
Gerekli değil |
| Windows x64 | Evet | Evet |
| Linux | Evet (Ocak 2026'da eklendi) | Evet (tüm versiyonlar) |
| macOS | Hayır | Evet |
| Docker / Kubernetes | Zor (kurulum + imajda lisans dosyası) | Basit (sadece NuGet paketi) |
| Azure / AWS Lambda | Karmaşık (lisans sunucusunun erişilebilirliği) | Kolay |
| Görüntü girdi formatları | Evet | JPG, PNG, BMP, TIFF, GIF ve daha fazlası |
| Yerel PDF girişi | Evet (modül lisansı gerektirebilir) | Evet (yerleşik, ek lisans gerekmez) |
| Çok sayfalı TIFF | Evet | Evet |
| Aranabilir PDF çıktısı | Evet | Evet (result.SaveAsSearchablePdf()) |
| Otomatik ön işleme | Ayarlar-nesne yapılandırması | Yerleşik + açık hat API |
| Desteklenen diller | 120+ | 125+ (ayrı NuGet paketleri) |
| Yapılandırılmış veri çıkışı | Evet (kelime koordinatları) | Sayfalar, Paragraflar, Satırlar, Kelimeler, Koordinatlı Karakterler |
| Güvenlik puanlaması | Evet | Evet (result.Confidence, kelime başına) |
| Barkod okuma | Ek modül (ayrı lisans) | Yerleşik (ocr.Configuration.ReadBarCodes = true) |
| Thread güvenliği | Karmaşık (motor paylaşım kısıtlamaları) | Tam (her iş parçacığı için bir IronTesseract) |
| CI/CD boru hattı desteği | Her ajana yükleyici gerekiyor | Standart dotnet restore |
Hızlı Başlangıç: Kofax OmniPage'ten IronOCR'a Geçiş
Adım 1: SDK'yı NuGet Paketiyle Değiştirin
OmniPage kaldırılacak bir NuGet paketine sahip değil. Taşıma tamamlandığında geliştirme makinelerinden .csproj dosyasından manuel DLL referanslarını kaldırın ve SDK'yı kaldırın. Sonra IronOCR'u yükleyin:
dotnet add package IronOcr
IronOCR NuGet paketi OCR motorunu, ön işleme filtrelerini ve çalışma zamanı bileşenlerini paketler. Ayrı bir yükleyici yok, yerli DLL yönetimi yok, bileşen kaydı yok.
Adım 2: Ad Alanlarını Güncelleyin
// Before (Kofax OmniPage)
using Kofax.OmniPage.CSDK;
using Kofax.OmniPageCSDK;
using CSDK;
// After (IronOCR)
using IronOcr;
// Before (Kofax OmniPage)
using Kofax.OmniPage.CSDK;
using Kofax.OmniPageCSDK;
using CSDK;
// After (IronOCR)
using IronOcr;
Imports IronOcr
Adım 3: Lisansa İzin Verin
Uygulama başlatıldığında tek satır ekleyin. Bu, .lic dosya yolunu, lisans sunucu yapılandırmasını ve engine.Initialize() çağrısını değiştirir:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Anahtarı, kaynak kodu yerine bir ortam değişkeninde (IRONOCR_LICENSE_KEY) veya appsettings.json şeklinde saklayın. Anahtar çevrimdışı okunur — çalışma zamanında ağ çağrısı gerçekleşmez.
Kod Göç Örnekleri
Motor Başlatma Hata Yolu Değiştirme
OmniPage'in yaşam döngüsü modelinin en tehlikeli yönü iyi yol değil — hata yoludur. Aralarında engine.Initialize() ve engine.Shutdown() olan bir istisna atıldığında, Shutdown() ulaşılmazsa uçucu bir lisans koltuğu kilitli kalabilir. Üretim kodu, her belge işleme çağrısı etrafında try/finally blokları gerektirir:
Kofax OmniPage Yaklaşımı:
// OmniPage: try/finally required everywhere to protect license seat release
public string ProcessInvoice(string imagePath)
{
var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic");
try
{
engine.Initialize(); // Contacts license server — failure here locks nothing
var document = engine.CreateDocument();
try
{
document.AddPage(imagePath);
document.Recognize(new RecognitionSettings { Language = "English" });
return document.GetText();
}
catch (RecognitionException ex)
{
// Log, rethrow — but Shutdown must still be called
throw new OcrProcessingException("Recognition failed", ex);
}
finally
{
document.Dispose(); // Inner finally: release document
}
}
catch (LicenseValidationException ex)
{
throw new OcrProcessingException("License validation failed", ex);
}
finally
{
engine.Shutdown(); // Outer finally: release license seat — MUST execute
}
}
// OmniPage: try/finally required everywhere to protect license seat release
public string ProcessInvoice(string imagePath)
{
var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic");
try
{
engine.Initialize(); // Contacts license server — failure here locks nothing
var document = engine.CreateDocument();
try
{
document.AddPage(imagePath);
document.Recognize(new RecognitionSettings { Language = "English" });
return document.GetText();
}
catch (RecognitionException ex)
{
// Log, rethrow — but Shutdown must still be called
throw new OcrProcessingException("Recognition failed", ex);
}
finally
{
document.Dispose(); // Inner finally: release document
}
}
catch (LicenseValidationException ex)
{
throw new OcrProcessingException("License validation failed", ex);
}
finally
{
engine.Shutdown(); // Outer finally: release license seat — MUST execute
}
}
Imports System
' OmniPage: try/finally required everywhere to protect license seat release
Public Function ProcessInvoice(imagePath As String) As String
Dim engine As New OmniPageEngine()
engine.SetLicenseFile("C:\Program Files\OmniPage\license.lic")
Try
engine.Initialize() ' Contacts license server — failure here locks nothing
Dim document = engine.CreateDocument()
Try
document.AddPage(imagePath)
document.Recognize(New RecognitionSettings With {.Language = "English"})
Return document.GetText()
Catch ex As RecognitionException
' Log, rethrow — but Shutdown must still be called
Throw New OcrProcessingException("Recognition failed", ex)
Finally
document.Dispose() ' Inner finally: release document
End Try
Catch ex As LicenseValidationException
Throw New OcrProcessingException("License validation failed", ex)
Finally
engine.Shutdown() ' Outer finally: release license seat — MUST execute
End Try
End Function
IronOCR Yaklaşımı:
// IronOCR:Hayırlicense seat to release, no engine to shut down
public string ProcessInvoice(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
var ocr = new IronTesseract();
var result = ocr.Read(input);
return result.Text;
// OcrInput disposal is automatic — no license implications on any code path
}
// IronOCR:Hayırlicense seat to release, no engine to shut down
public string ProcessInvoice(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
var ocr = new IronTesseract();
var result = ocr.Read(input);
return result.Text;
// OcrInput disposal is automatic — no license implications on any code path
}
Imports IronOcr
Public Function ProcessInvoice(imagePath As String) As String
Using input As New OcrInput()
input.LoadImage(imagePath)
Dim ocr As New IronTesseract()
Dim result = ocr.Read(input)
Return result.Text
End Using
End Function
using üzerindeki blok, yüklenen görüntü verileri için bellek temizleme işlemlerini gerçekleştirir. Bir lisans koltuğunu koruyacak try/finally yok. Bu yöntemde herhangi bir yerdeki bir istisna, yöntemin kendi kapsamının dışında hiçbir yan etkiye sahip değildir. Konuya ilişkin yapılandırma seçenekleri için IronTesseract kurulum kılavuzuna bakın, iş parçacığı-yerel örnekler dahil.
Bölge Tabanlı Tanıma Geçişi
OmniPage'in birincil yapılandırılmış çıkarım mekanizması bölge tanımıdır: belge bölgeleri koordinat sınırlarıyla beyan edilir ve her bölgeye (OCR, ICR, OMR, barkod) göre tanıma türü belirlenir. Geliştiriciler FormZone nesnelerini her belge şablonuna göre tanımlar ve tanıma motoruna iletir. IronOCR, şablon yönetimi veya bölge türü bildirimleri olmadan aynı hedeflenen çıkarmayı elde etmek için CropRectangle kullanır:
Kofax OmniPage Yaklaşımı:
// OmniPage: Zone-based form extraction with template management
public Dictionary<string, string> ExtractInvoiceFields(string invoicePath)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
// Define zones per document template
var zones = new List<FormZone>
{
new FormZone { Name = "InvoiceNumber", Type = "OCR",
X = 520, Y = 80, Width = 200, Height = 30 },
new FormZone { Name = "InvoiceDate", Type = "OCR",
X = 520, Y = 120, Width = 200, Height = 30 },
new FormZone { Name = "TotalAmount", Type = "OCR",
X = 520, Y = 580, Width = 200, Height = 30 },
new FormZone { Name = "VendorName", Type = "OCR",
X = 50, Y = 80, Width = 300, Height = 40 }
};
var template = new FormTemplate { Name = "StandardInvoice", Zones = zones };
var settings = new RecognitionSettings { Language = "English" };
var document = engine.CreateDocument();
document.AddPage(invoicePath);
document.ApplyTemplate(template);
document.Recognize(settings);
var fields = new Dictionary<string, string>();
foreach (var zone in zones)
fields[zone.Name] = document.GetZoneText(zone.Name);
document.Dispose();
engine.Shutdown();
return fields;
}
// OmniPage: Zone-based form extraction with template management
public Dictionary<string, string> ExtractInvoiceFields(string invoicePath)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
// Define zones per document template
var zones = new List<FormZone>
{
new FormZone { Name = "InvoiceNumber", Type = "OCR",
X = 520, Y = 80, Width = 200, Height = 30 },
new FormZone { Name = "InvoiceDate", Type = "OCR",
X = 520, Y = 120, Width = 200, Height = 30 },
new FormZone { Name = "TotalAmount", Type = "OCR",
X = 520, Y = 580, Width = 200, Height = 30 },
new FormZone { Name = "VendorName", Type = "OCR",
X = 50, Y = 80, Width = 300, Height = 40 }
};
var template = new FormTemplate { Name = "StandardInvoice", Zones = zones };
var settings = new RecognitionSettings { Language = "English" };
var document = engine.CreateDocument();
document.AddPage(invoicePath);
document.ApplyTemplate(template);
document.Recognize(settings);
var fields = new Dictionary<string, string>();
foreach (var zone in zones)
fields[zone.Name] = document.GetZoneText(zone.Name);
document.Dispose();
engine.Shutdown();
return fields;
}
Imports System
Imports System.Collections.Generic
' OmniPage: Zone-based form extraction with template management
Public Function ExtractInvoiceFields(invoicePath As String) As Dictionary(Of String, String)
Using engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
engine.Initialize()
' Define zones per document template
Dim zones As New List(Of FormZone) From {
New FormZone With {.Name = "InvoiceNumber", .Type = "OCR", .X = 520, .Y = 80, .Width = 200, .Height = 30},
New FormZone With {.Name = "InvoiceDate", .Type = "OCR", .X = 520, .Y = 120, .Width = 200, .Height = 30},
New FormZone With {.Name = "TotalAmount", .Type = "OCR", .X = 520, .Y = 580, .Width = 200, .Height = 30},
New FormZone With {.Name = "VendorName", .Type = "OCR", .X = 50, .Y = 80, .Width = 300, .Height = 40}
}
Dim template As New FormTemplate With {.Name = "StandardInvoice", .Zones = zones}
Dim settings As New RecognitionSettings With {.Language = "English"}
Dim document = engine.CreateDocument()
document.AddPage(invoicePath)
document.ApplyTemplate(template)
document.Recognize(settings)
Dim fields As New Dictionary(Of String, String)()
For Each zone In zones
fields(zone.Name) = document.GetZoneText(zone.Name)
Next
document.Dispose()
engine.Shutdown()
Return fields
End Using
End Function
IronOCR Yaklaşımı:
// IronOCR: CropRectangle targets specific regions — no template management
public Dictionary<string, string> ExtractInvoiceFields(string invoicePath)
{
var fields = new Dictionary<string, string>();
var ocr = new IronTesseract();
// Extract each field by reading only the target region
var fieldRegions = new Dictionary<string, CropRectangle>
{
["InvoiceNumber"] = new CropRectangle(520, 80, 200, 30),
["InvoiceDate"] = new CropRectangle(520, 120, 200, 30),
["TotalAmount"] = new CropRectangle(520, 580, 200, 30),
["VendorName"] = new CropRectangle(50, 80, 300, 40)
};
foreach (var (fieldName, region) in fieldRegions)
{
using var input = new OcrInput();
input.LoadImage(invoicePath, region);
fields[fieldName] = ocr.Read(input).Text.Trim();
}
return fields;
}
// IronOCR: CropRectangle targets specific regions — no template management
public Dictionary<string, string> ExtractInvoiceFields(string invoicePath)
{
var fields = new Dictionary<string, string>();
var ocr = new IronTesseract();
// Extract each field by reading only the target region
var fieldRegions = new Dictionary<string, CropRectangle>
{
["InvoiceNumber"] = new CropRectangle(520, 80, 200, 30),
["InvoiceDate"] = new CropRectangle(520, 120, 200, 30),
["TotalAmount"] = new CropRectangle(520, 580, 200, 30),
["VendorName"] = new CropRectangle(50, 80, 300, 40)
};
foreach (var (fieldName, region) in fieldRegions)
{
using var input = new OcrInput();
input.LoadImage(invoicePath, region);
fields[fieldName] = ocr.Read(input).Text.Trim();
}
return fields;
}
Imports System.Collections.Generic
' IronOCR: CropRectangle targets specific regions — no template management
Public Function ExtractInvoiceFields(invoicePath As String) As Dictionary(Of String, String)
Dim fields As New Dictionary(Of String, String)()
Dim ocr As New IronTesseract()
' Extract each field by reading only the target region
Dim fieldRegions As New Dictionary(Of String, CropRectangle) From {
{"InvoiceNumber", New CropRectangle(520, 80, 200, 30)},
{"InvoiceDate", New CropRectangle(520, 120, 200, 30)},
{"TotalAmount", New CropRectangle(520, 580, 200, 30)},
{"VendorName", New CropRectangle(50, 80, 300, 40)}
}
For Each kvp In fieldRegions
Dim fieldName = kvp.Key
Dim region = kvp.Value
Using input As New OcrInput()
input.LoadImage(invoicePath, region)
fields(fieldName) = ocr.Read(input).Text.Trim()
End Using
Next
Return fields
End Function
Her CropRectangle piksel cinsinden (x, y, width, height) belirtir. OCR motoru yalnızca seçilen bölgeyi işler, tüm sayfayı değil — bu, OmniPage'de bölge tabanlı işleme ile sağlanan aynı verimlilik avantajıdır. bölge tabanlı OCR kılavuzu, OcrInput'ın çoklu bölge API'sini kullanarak tek bir görüntü yükünden birden fazla bölgeyi çıkarmayı içeren koordinat seçimi kalıplarını kapsar.
Yapılandırılmış Veri Çıkışı Göçü
OmniPage, belge yapısını tescilli bir dışa aktarım hattı aracılığıyla ortaya çıkartır: biçim ayarları tanınan bir belgeye uygulanır ve çıktı, belirtilen bir biçimde (RTF, XML, CSV, aranabilir PDF) bir dosyaya yazılır. Kelime düzeyinde koordinatlara erişmek, açık pozisyon sorgularıyla bir sonuç yineleme aracını döndürmeyi gerektirir. IronOCR, aynı yapılandırılmış veriyi doğrudan sonuç nesnesinde ikincil bir dışa aktarma adımı olmadan ortaya çıkarır:
Kofax OmniPage Yaklaşımı:
// OmniPage: Structured output requires format configuration and file export
public void ExtractStructuredContent(string imagePath, string outputDir)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var settings = new RecognitionSettings { Language = "English" };
var document = engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(settings);
// Word-level coordinates through result iterator
var iterator = document.GetResultIterator(ResultIteratorLevel.Word);
while (iterator.MoveNext())
{
string word = iterator.GetText();
var bounds = iterator.GetBoundingBox();
double confidence = iterator.GetConfidence();
Console.WriteLine($"Word: {word} at ({bounds.X},{bounds.Y}) conf:{confidence:F1}%");
}
// Structured export requires separate output format configuration
var outputSettings = new OutputSettings
{
Format = OutputFormat.XML,
IncludeCoordinates = true,
IncludeConfidence = true
};
document.SaveAs(Path.Combine(outputDir, "output.xml"), outputSettings);
document.Dispose();
engine.Shutdown();
}
// OmniPage: Structured output requires format configuration and file export
public void ExtractStructuredContent(string imagePath, string outputDir)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var settings = new RecognitionSettings { Language = "English" };
var document = engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(settings);
// Word-level coordinates through result iterator
var iterator = document.GetResultIterator(ResultIteratorLevel.Word);
while (iterator.MoveNext())
{
string word = iterator.GetText();
var bounds = iterator.GetBoundingBox();
double confidence = iterator.GetConfidence();
Console.WriteLine($"Word: {word} at ({bounds.X},{bounds.Y}) conf:{confidence:F1}%");
}
// Structured export requires separate output format configuration
var outputSettings = new OutputSettings
{
Format = OutputFormat.XML,
IncludeCoordinates = true,
IncludeConfidence = true
};
document.SaveAs(Path.Combine(outputDir, "output.xml"), outputSettings);
document.Dispose();
engine.Shutdown();
}
Imports System
Imports System.IO
Public Sub ExtractStructuredContent(imagePath As String, outputDir As String)
Using engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
engine.Initialize()
Dim settings As New RecognitionSettings With {.Language = "English"}
Dim document = engine.CreateDocument()
document.AddPage(imagePath)
document.Recognize(settings)
' Word-level coordinates through result iterator
Dim iterator = document.GetResultIterator(ResultIteratorLevel.Word)
While iterator.MoveNext()
Dim word As String = iterator.GetText()
Dim bounds = iterator.GetBoundingBox()
Dim confidence As Double = iterator.GetConfidence()
Console.WriteLine($"Word: {word} at ({bounds.X},{bounds.Y}) conf:{confidence:F1}%")
End While
' Structured export requires separate output format configuration
Dim outputSettings As New OutputSettings With {
.Format = OutputFormat.XML,
.IncludeCoordinates = True,
.IncludeConfidence = True
}
document.SaveAs(Path.Combine(outputDir, "output.xml"), outputSettings)
document.Dispose()
engine.Shutdown()
End Using
End Sub
IronOCR Yaklaşımı:
// IronOCR: Structured data directly on OcrResult — no export step
public void ExtractStructuredContent(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
Console.WriteLine($"Confidence: {result.Confidence:F1}%");
Console.WriteLine($"Pages: {result.Pages.Length}");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"[Paragraph at ({paragraph.X},{paragraph.Y})]");
Console.WriteLine(paragraph.Text);
foreach (var word in paragraph.Words)
{
// Per-word confidence and coordinates — no iterator needed
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"conf: {word.Confidence:F1}%");
}
}
}
}
// IronOCR: Structured data directly on OcrResult — no export step
public void ExtractStructuredContent(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
Console.WriteLine($"Confidence: {result.Confidence:F1}%");
Console.WriteLine($"Pages: {result.Pages.Length}");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"[Paragraph at ({paragraph.X},{paragraph.Y})]");
Console.WriteLine(paragraph.Text);
foreach (var word in paragraph.Words)
{
// Per-word confidence and coordinates — no iterator needed
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"conf: {word.Confidence:F1}%");
}
}
}
}
Public Sub ExtractStructuredContent(imagePath As String)
Dim result = New IronTesseract().Read(imagePath)
Console.WriteLine($"Confidence: {result.Confidence:F1}%")
Console.WriteLine($"Pages: {result.Pages.Length}")
For Each page In result.Pages
For Each paragraph In page.Paragraphs
Console.WriteLine($"[Paragraph at ({paragraph.X},{paragraph.Y})]")
Console.WriteLine(paragraph.Text)
For Each word In paragraph.Words
' Per-word confidence and coordinates — no iterator needed
Console.WriteLine(
$" Word: '{word.Text}' " &
$"at ({word.X},{word.Y}) " &
$"conf: {word.Confidence:F1}%")
Next
Next
Next
End Sub
OcrResult nesnesinin hiyerarşisi — Sayfalar, Paragraflar, Satırlar, Kelimeler, Karakterler — OmniPage'in sonuç iteraörünün sağladığı aynı konumsal veriyi sağlar, ancak sırayla bir imleç yerine gezilebilir bir nesne grafiği olarak. Güven puanları, sonuç, sayfa, paragraf ve kelime düzeyinde ek yapılandırma gerektirmeden mevcuttur. sonuçları okuma kılavuzu tüm yapılandırılmış veri özelliklerini kapsar ve güven puanları kılavuzu kelime başına doğrulama kalıplarını kapsar.
Çok Sayfalı TIFF İşleme Göçü
OmniPage'in çok sayfalı TIFF iş akışı, TIFF kapsayıcısından her sayfanın belirgin bir tanıma çağrısı ve belgenin imha edilmesiyle ayrı ayrı çıkarılması gerektirir. Bu, hem geçici kod ve sayfa sayısına orantılı bir kaynak yönetim yüzeyi yaratır. IronOCR, çok çerçeveli TIFF dosyalarını tek bir çağrıda yükler:
Kofax OmniPage Yaklaşımı:
// OmniPage: Page-by-page TIFF extraction with per-page lifecycle
public List<string> ExtractFromMultiPageTiff(string tiffPath)
{
var pageTexts = new List<string>();
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
// Open TIFF and iterate frames
var tiffContainer = engine.OpenTiff(tiffPath);
int pageCount = tiffContainer.GetPageCount();
var settings = new RecognitionSettings { Language = "English" };
for (int i = 0; i < pageCount; i++)
{
var page = tiffContainer.GetPage(i); // Extract frame
var document = engine.CreateDocument();
try
{
document.AddPage(page);
document.Recognize(settings);
pageTexts.Add(document.GetText());
}
finally
{
document.Dispose(); // Dispose per page to manage memory
}
}
tiffContainer.Dispose();
engine.Shutdown();
return pageTexts;
}
// OmniPage: Page-by-page TIFF extraction with per-page lifecycle
public List<string> ExtractFromMultiPageTiff(string tiffPath)
{
var pageTexts = new List<string>();
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
// Open TIFF and iterate frames
var tiffContainer = engine.OpenTiff(tiffPath);
int pageCount = tiffContainer.GetPageCount();
var settings = new RecognitionSettings { Language = "English" };
for (int i = 0; i < pageCount; i++)
{
var page = tiffContainer.GetPage(i); // Extract frame
var document = engine.CreateDocument();
try
{
document.AddPage(page);
document.Recognize(settings);
pageTexts.Add(document.GetText());
}
finally
{
document.Dispose(); // Dispose per page to manage memory
}
}
tiffContainer.Dispose();
engine.Shutdown();
return pageTexts;
}
Imports System.Collections.Generic
' OmniPage: Page-by-page TIFF extraction with per-page lifecycle
Public Function ExtractFromMultiPageTiff(tiffPath As String) As List(Of String)
Dim pageTexts As New List(Of String)()
Using engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
engine.Initialize()
' Open TIFF and iterate frames
Dim tiffContainer = engine.OpenTiff(tiffPath)
Dim pageCount As Integer = tiffContainer.GetPageCount()
Dim settings As New RecognitionSettings With {.Language = "English"}
For i As Integer = 0 To pageCount - 1
Dim page = tiffContainer.GetPage(i) ' Extract frame
Dim document = engine.CreateDocument()
Try
document.AddPage(page)
document.Recognize(settings)
pageTexts.Add(document.GetText())
Finally
document.Dispose() ' Dispose per page to manage memory
End Try
Next
tiffContainer.Dispose()
engine.Shutdown()
End Using
Return pageTexts
End Function
IronOCR Yaklaşımı:
// IronOCR: Multi-frame TIFF loaded in one call — all pages in one result
public List<string> ExtractFromMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // All frames loaded automatically
var result = new IronTesseract().Read(input);
// Each TIFF frame becomes a page in the result
return result.Pages.Select(page => page.Text).ToList();
}
// IronOCR: Multi-frame TIFF loaded in one call — all pages in one result
public List<string> ExtractFromMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // All frames loaded automatically
var result = new IronTesseract().Read(input);
// Each TIFF frame becomes a page in the result
return result.Pages.Select(page => page.Text).ToList();
}
Imports System.Collections.Generic
Imports IronOcr
' IronOCR: Multi-frame TIFF loaded in one call — all pages in one result
Public Function ExtractFromMultiPageTiff(tiffPath As String) As List(Of String)
Using input As New OcrInput()
input.LoadImageFrames(tiffPath) ' All frames loaded automatically
Dim result = New IronTesseract().Read(input)
' Each TIFF frame becomes a page in the result
Return result.Pages.Select(Function(page) page.Text).ToList()
End Using
End Function
LoadImageFrames, TIFF konteynerından her bir kareyi tek bir çağrıda okur. Sonuç, bir OcrResult.Page her kare başına olacak şekilde sayfa bazında yapıyı koruyarak, manuel bir yineleme döngüsü veya sayfa bazında temizleme gerektirmez. Üretim TIFF toplu iş akışları için https://ironsoftware.com/csharp/ocr/how-to/input-tiff-gif/ linkindeki TIFF ve GIF giriş kılavuzuna bakın.
İşlem Güvenli Paralel İşleme Geçişi
OmniPage'in motoru paylaşılan, durumlu bir kaynaktır. İş parçacıkları arasında bir OmniPageEngine örneğini paylaşmak, eş zamanlı olarak CreateDocument() çağıran birden çok iş parçacığının iç içe geçmiş durumda olabilmesi nedeniyle dış senkronizasyon gerektirir. Güvenli desen — iş parçacığı başına bir motor örneği — motorun ağır başlatma maliyeti ile çelişir.IronOCR örnekleri paylaşılmayan bir durumu taşır: iş parçacığı başına bir IronTesseract, sıfır koordinasyon maliyeti ile oluşturun:
Kofax OmniPage Yaklaşımı:
// OmniPage: Shared engine with locking to serialize document operations
public ConcurrentDictionary<string, string> ProcessBatchWithEngine(
string[] imagePaths, string licensePath)
{
var results = new ConcurrentDictionary<string, string>();
var engineLock = new object();
// One engine — document operations must be serialized
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var settings = new RecognitionSettings { Language = "English" };
Parallel.ForEach(imagePaths, imagePath =>
{
lock (engineLock) // Serialize: one recognition at a time
{
var document = engine.CreateDocument();
try
{
document.AddPage(imagePath);
document.Recognize(settings);
results[imagePath] = document.GetText();
}
finally
{
document.Dispose();
}
}
});
engine.Shutdown();
return results;
}
// OmniPage: Shared engine with locking to serialize document operations
public ConcurrentDictionary<string, string> ProcessBatchWithEngine(
string[] imagePaths, string licensePath)
{
var results = new ConcurrentDictionary<string, string>();
var engineLock = new object();
// One engine — document operations must be serialized
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var settings = new RecognitionSettings { Language = "English" };
Parallel.ForEach(imagePaths, imagePath =>
{
lock (engineLock) // Serialize: one recognition at a time
{
var document = engine.CreateDocument();
try
{
document.AddPage(imagePath);
document.Recognize(settings);
results[imagePath] = document.GetText();
}
finally
{
document.Dispose();
}
}
});
engine.Shutdown();
return results;
}
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' OmniPage: Shared engine with locking to serialize document operations
Public Function ProcessBatchWithEngine(imagePaths As String(), licensePath As String) As ConcurrentDictionary(Of String, String)
Dim results As New ConcurrentDictionary(Of String, String)()
Dim engineLock As New Object()
' One engine — document operations must be serialized
Using engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
engine.Initialize()
Dim settings As New RecognitionSettings With {.Language = "English"}
Parallel.ForEach(imagePaths, Sub(imagePath)
SyncLock engineLock ' Serialize: one recognition at a time
Dim document = engine.CreateDocument()
Try
document.AddPage(imagePath)
document.Recognize(settings)
results(imagePath) = document.GetText()
Finally
document.Dispose()
End Try
End SyncLock
End Sub)
engine.Shutdown()
End Using
Return results
End Function
IronOCR Yaklaşımı:
// IronOCR: One IronTesseract per thread — no locking, genuine parallelism
public ConcurrentDictionary<string, string> ProcessBatchInParallel(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
// Each thread creates its own instance — no shared state, no locks
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
results[imagePath] = result.Text;
});
return results;
}
// IronOCR: One IronTesseract per thread — no locking, genuine parallelism
public ConcurrentDictionary<string, string> ProcessBatchInParallel(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
// Each thread creates its own instance — no shared state, no locks
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
results[imagePath] = result.Text;
});
return results;
}
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Imports IronOcr
' IronOCR: One IronTesseract per thread — no locking, genuine parallelism
Public Function ProcessBatchInParallel(imagePaths As String()) As ConcurrentDictionary(Of String, String)
Dim results As New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(imagePath)
' Each thread creates its own instance — no shared state, no locks
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage(imagePath)
Dim result = ocr.Read(input)
results(imagePath) = result.Text
End Using
End Sub)
Return results
End Function
OmniPage sürümü tüm tanımayı bir kilit üzerinden seri hale getirir, böylece paralellik ortadan kalkar.IronOCR sürümü hiç koordine edilmeden belgeleri eşzamanlı olarak işler. Yüksek verimli toplu iş yükleri için bkz. çok iş parçacıklı örnek ve hız optimizasyonu kılavuzu.
Tarama Arşivinden Aranabilir PDF Oluşturma
OmniPage'in aramanabilir PDF çıktısı, kaydetmeden önce açık OutputSettings ve OutputFormat yapılandırması ile bir tanıma hattının monte edilmesini gerektirir. IronOCR, sonuç nesnesinde tek bir yöntem çağrısıyla aranabilir PDF'ler üretir:
Kofax OmniPage Yaklaşımı:
// OmniPage: Searchable PDF requires OutputSettings configuration before save
public void ConvertArchiveToSearchable(string[] scannedPdfPaths, string outputDirectory)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var recognitionSettings = new RecognitionSettings
{
Language = "English",
AccuracyMode = "Maximum",
PreserveLayout = true
};
var outputSettings = new OutputSettings
{
Format = OutputFormat.SearchablePDF,
Compression = PDFCompression.Standard,
ImageQuality = 85,
EmbedFonts = true
};
foreach (var pdfPath in scannedPdfPaths)
{
var document = engine.OpenPDF(pdfPath);
document.RecognizeAll(recognitionSettings);
string outputPath = Path.Combine(
outputDirectory,
Path.GetFileNameWithoutExtension(pdfPath) + "_searchable.pdf");
document.SaveAs(outputPath, outputSettings);
document.Dispose();
}
engine.Shutdown();
}
// OmniPage: Searchable PDF requires OutputSettings configuration before save
public void ConvertArchiveToSearchable(string[] scannedPdfPaths, string outputDirectory)
{
using var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
engine.Initialize();
var recognitionSettings = new RecognitionSettings
{
Language = "English",
AccuracyMode = "Maximum",
PreserveLayout = true
};
var outputSettings = new OutputSettings
{
Format = OutputFormat.SearchablePDF,
Compression = PDFCompression.Standard,
ImageQuality = 85,
EmbedFonts = true
};
foreach (var pdfPath in scannedPdfPaths)
{
var document = engine.OpenPDF(pdfPath);
document.RecognizeAll(recognitionSettings);
string outputPath = Path.Combine(
outputDirectory,
Path.GetFileNameWithoutExtension(pdfPath) + "_searchable.pdf");
document.SaveAs(outputPath, outputSettings);
document.Dispose();
}
engine.Shutdown();
}
Imports System.IO
' OmniPage: Searchable PDF requires OutputSettings configuration before save
Public Sub ConvertArchiveToSearchable(scannedPdfPaths As String(), outputDirectory As String)
Using engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
engine.Initialize()
Dim recognitionSettings As New RecognitionSettings With {
.Language = "English",
.AccuracyMode = "Maximum",
.PreserveLayout = True
}
Dim outputSettings As New OutputSettings With {
.Format = OutputFormat.SearchablePDF,
.Compression = PDFCompression.Standard,
.ImageQuality = 85,
.EmbedFonts = True
}
For Each pdfPath As String In scannedPdfPaths
Dim document = engine.OpenPDF(pdfPath)
document.RecognizeAll(recognitionSettings)
Dim outputPath As String = Path.Combine(outputDirectory, Path.GetFileNameWithoutExtension(pdfPath) & "_searchable.pdf")
document.SaveAs(outputPath, outputSettings)
document.Dispose()
Next
End Using
engine.Shutdown()
End Sub
IronOCR Yaklaşımı:
// IronOCR: Searchable PDF output is one method call on the result
public void ConvertArchiveToSearchable(string[] scannedPdfPaths, string outputDirectory)
{
var ocr = new IronTesseract();
foreach (var pdfPath in scannedPdfPaths)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath); // All pages loaded automatically
var result = ocr.Read(input);
string outputPath = Path.Combine(
outputDirectory,
Path.GetFileNameWithoutExtension(pdfPath) + "_searchable.pdf");
result.SaveAsSearchablePdf(outputPath);
Console.WriteLine($"Processed: {Path.GetFileName(pdfPath)} ({result.Pages.Length} pages)");
}
}
// IronOCR: Searchable PDF output is one method call on the result
public void ConvertArchiveToSearchable(string[] scannedPdfPaths, string outputDirectory)
{
var ocr = new IronTesseract();
foreach (var pdfPath in scannedPdfPaths)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath); // All pages loaded automatically
var result = ocr.Read(input);
string outputPath = Path.Combine(
outputDirectory,
Path.GetFileNameWithoutExtension(pdfPath) + "_searchable.pdf");
result.SaveAsSearchablePdf(outputPath);
Console.WriteLine($"Processed: {Path.GetFileName(pdfPath)} ({result.Pages.Length} pages)");
}
}
Imports System.IO
Imports IronOcr
Public Sub ConvertArchiveToSearchable(scannedPdfPaths As String(), outputDirectory As String)
Dim ocr As New IronTesseract()
For Each pdfPath As String In scannedPdfPaths
Using input As New OcrInput()
input.LoadPdf(pdfPath) ' All pages loaded automatically
Dim result = ocr.Read(input)
Dim outputPath As String = Path.Combine(outputDirectory, Path.GetFileNameWithoutExtension(pdfPath) & "_searchable.pdf")
result.SaveAsSearchablePdf(outputPath)
Console.WriteLine($"Processed: {Path.GetFileName(pdfPath)} ({result.Pages.Length} pages)")
End Using
Next
End Sub
SaveAsSearchablePdf, PDF'ye bir metin katmanı ekleyerek, orijinal taramanın görsel görünümünü değiştirmeksizin, belge yönetimi sistemlerinde indekslenebilir hale getirir. aranabilir PDF kılavuzu metin katmanı seçeneklerini kapsar ve PDF OCR örneği, uçtan-uca taranmış PDF işleme gösterir.
Kofax OmniPageAPI'den IronOCR'e Mapping Referansı
| Kofax OmniPage | IronOCR Karşılığı |
|---|---|
using Kofax.OmniPage.CSDK; |
using IronOcr; |
using Kofax.OmniPageCSDK; |
using IronOcr; |
using CSDK; |
using IronOcr; |
new OmniPageEngine() |
Gerekli değil — motor nesnesi yok |
engine.SetLicenseFile(path) |
IronOcr.License.LicenseKey = "key"; |
engine.Initialize() |
Gerekli değil |
engine.Shutdown() |
Gerekli değil |
engine.CreateDocument() |
new OcrInput() |
document.AddPage(imagePath) |
input.LoadImage(imagePath) |
engine.OpenPDF(pdfPath) |
input.LoadPdf(pdfPath) |
engine.OpenTiff(tiffPath) |
input.LoadImageFrames(tiffPath) |
document.Recognize(settings) |
new IronTesseract().Read(input) |
document.RecognizeAll(settings) |
new IronTesseract().Read(input) (tüm sayfalar aynı anda) |
document.GetText() |
result.Text |
document.GetZoneText(zoneName) |
input.LoadImage(path, cropRectangle) + result.Text |
document.Dispose() |
using var input = new OcrInput() (otomatik) |
iterator.GetText() |
result.Pages[n].Words[m].Text |
iterator.GetBoundingBox() |
result.Pages[n].Words[m].X / Y / Width / Height |
iterator.GetConfidence() |
result.Pages[n].Words[m].Confidence |
engine.LoadLanguageDictionary("German") |
dotnet add package IronOcr.Languages.German |
settings.PrimaryLanguage = "English" |
ocr.Language = OcrLanguage.English; |
settings.SecondaryLanguages = new[] {"German"} |
ocr.Language = OcrLanguage.English + OcrLanguage.German; |
settings.DeskewImage = true |
input.Deskew(); |
settings.DespeckleLevel = 2 |
input.DeNoise(); |
settings.ContrastEnhancement = true |
input.Contrast(); |
settings.AutoRotate = true |
input.Deskew(); (döndürme düzeltmesi içerir) |
document.SaveAs(path, outputSettings) |
result.SaveAsSearchablePdf(path) |
OutputFormat.SearchablePDF |
result.SaveAsSearchablePdf(path) |
OutputFormat.XML (koordinatlarla) |
result.Pages / .Paragraphs / .Words nesne grafiği |
FormZone ile koordinat sınırları |
new CropRectangle(x, y, width, height) |
| Sayfa başı lisans sayımı | Uygulanamaz |
.lic dosya dağıtımı |
Uygulanamaz |
| Lisans sunucusu yapılandırması | Uygulanamaz |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Üretim Ortamında Lisans Dosyası Bulunamadı Hataları
Kofax OmniPage: Her dağıtım, uygulama süreci tarafından erişilebilen belirli bir yolda .lic dosyasının var olmasını gerektirir. Hedef sunucuya lisans dosyasını açıkça kopyalamayan bir dağıtım hattı, motor başlatılması sırasında FileNotFoundException veya LicenseException'a neden olur. Güvenlik ekipleri genellikle .lic dosyalarının konteyner imajlarına gömülmesini veya kaynak kontrolüne tabi olmasını işaretler.
Çözüm:IronOCR lisansını bir dizeden okur. Anahtarı çevresel bir değişken olarak kaydedin ve çalışma zamanında okuyun — dağıtılacak dosya yok, yapılandırılacak yol yok:
// At application startup — reads IRONOCR_LICENSE_KEY from environment
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")
?? throw new InvalidOperationException("IronOCR license key not configured.");
// At application startup — reads IRONOCR_LICENSE_KEY from environment
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")
?? throw new InvalidOperationException("IronOCR license key not configured.");
Imports System
' At application startup — reads IRONOCR_LICENSE_KEY from environment
IronOcr.License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY"), Throw New InvalidOperationException("IronOCR license key not configured."))
Docker'da --env IRONOCR_LICENSE_KEY=YOUR-KEY iletin. Azure App Hizmeti'nde, bunu bir Uygulama Ayarı olarak ayarlayın. Kubernetes'te, bir Gizli aracıyla ekleyin. Dosya montajı yok, yol yapılandırması yok, gömülü lisans dosyaları için güvenlik incelemesi yok.
Sorun 2: İşlem Çökmesinden Sonra Kilitlenen Uçabilir Lisans Koltukları
Kofax OmniPage: Bir uygulama süreci çökme yaşarsa, bir gözetmen tarafından kapatılırsa veya Environment.FailFast ile çıkış yaparsa, engine.Shutdown() çalıştırılmaz. Yüzer lisans koltukları lisans sunucusunun zaman aşımı sona erene kadar çıkışta kalır — tipik olarak 30–60 dakika. Podların sık sık yeniden başlatıldığı kapsayıcılaştırılmış bir ortamda, bu davranış lisans havuzunu tüketir.
Çözüm: IronOCR'un kontrol edilen lisans koltukları kavramı yok. Bir işlem çökmesi kaynakları serbest bırakmaz ve dış sistemi kilitlemez. Bir sonraki işlem oturuma izin almadan başlar:
// IronOCR: Process crash has no license implications whatsoever
// Start processing immediately after any failure
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var result = new IronTesseract().Read("document.jpg"); //Hayırseat to check out
// IronOCR: Process crash has no license implications whatsoever
// Start processing immediately after any failure
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var result = new IronTesseract().Read("document.jpg"); //Hayırseat to check out
' IronOCR: Process crash has no license implications whatsoever
' Start processing immediately after any failure
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim result = New IronTesseract().Read("document.jpg") 'Hayırseat to check out
Dayanıklı ASP.NET Core hizmetleri için bkz. async OCR kılavuzu ana bilgisayar hizmetleri ve zarif kapanışla sorunsuz entegrasyon için kalıplar.
Sorun 3: Docker İmajı Derlemesi Başarısız — Yükleyici Etkileşimsiz Çalışamıyor
Kofax OmniPage: OmniPage SDK yükleyicisi, docker build bağlamında düzgün çalışan bir GUI veya yarı etkileşimli bir yükleyicidir. SDK'yı bir kapsayıcı imajına yerleştirmeye çalışan takımlar, yükleyicinin lisans sözleşmesi veya bileşen seçimi adımlarında başarısızlıklarla karşılaşır. Çalışma çözümleri (sessiz yükleme anahtarları, önceden çıkarılmış DLL kopyaları) belgelenmemiş ve sürüme özgüdür.
Çözüm: IronOCR'ın Dockerfile üç satırdır:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus # Single Linux dependency
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
libgdiplus tek sistem bağımlılığıdır.IronOCR NuGet paketi, yapım aşamasında dotnet restore tarafından diğer paket referansları gibi geri yüklenir. Docker dağıtım kılavuzu, hem Debian hem de Alpine temel imajlarını kapsar ve Linux dağıtım kılavuzu, dağıtım-özel paket adlarını kapsar.
Sorun 4: VM Taşıması veya Bulut Otomatik Ölçeklemelerinden Sonra Yeniden Aktivasyon Gerekiyor
Kofax OmniPage: OmniPage aktivasyonu donanım kimliğine bağlıdır. Fiziksel ana bilgisayarlar arasında VM'leri taşıyan, yeni örteklere otomatik ölçekleyen veya taze imajlarla konteynerleri değiştiren bulut ortamları, yeniden aktivasyon gerektiren donanım kimliği değişikliklerine yol açar. Olay sırasında Tungsten desteğiyle yeniden aktivasyon iletişime geçmek, operasyonel risk ekler.
Çözüm: IronOCR'un lisans anahtarı donanım bağımsızdır. Aynı anahtar, lisanslanan tarife dahilindeki herhangi bir makinede, herhangi bir konteynerde, herhangi bir bulut bölgesinde, otomatik ölçeklenen örneklerin herhangi bir sayısında çalışır. Yeniden aktivasyon yok, destek iletişimi yok, kesinti yok:
// Identical startup code on any hardware topology
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
bool valid = IronOcr.License.IsLicensed; // Verify without a network call
// Identical startup code on any hardware topology
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
bool valid = IronOcr.License.IsLicensed; // Verify without a network call
' Identical startup code on any hardware topology
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim valid As Boolean = IronOcr.License.IsLicensed ' Verify without a network call
Sorun 5: RecognitionSettings Nesnesinin IronOCR Eşdeğeri Yok
Kofax OmniPage: OmniPage, her belge için motor davranışını yapılandırmak için bir RecognitionSettings nesnesi (veya SDK sürümüne bağlı olarak PreprocessingSettings) kullanır. Taşınan takımlar IronOCR'de paralel bir yapılandırma nesnesi bekler.
Çözüm: IronOCR, yapılandırmayı iki yüzeye böler: OcrInput üzerindeki ön işleme işlemleri ve IronTesseract üzerindeki motor ayarları. Oluşturulacak ayarlar nesnesi yok:
// OmniPage settings object →IronOCR method calls on OcrInput
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English; // RecognitionSettings.Language
// ocr.Configuration.TesseractVersion = ... // Engine version already optimized
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // settings.DeskewImage = true
input.DeNoise(); // settings.DespeckleLevel = 2
input.Contrast(); // settings.ContrastEnhancement = true
var result = ocr.Read(input);
// OmniPage settings object →IronOCR method calls on OcrInput
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English; // RecognitionSettings.Language
// ocr.Configuration.TesseractVersion = ... // Engine version already optimized
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // settings.DeskewImage = true
input.DeNoise(); // settings.DespeckleLevel = 2
input.Contrast(); // settings.ContrastEnhancement = true
var result = ocr.Read(input);
Imports IronOcr
' OmniPage settings object → IronOCR method calls on OcrInput
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English ' RecognitionSettings.Language
' ocr.Configuration.TesseractVersion = ... ' Engine version already optimized
Using input As New OcrInput()
input.LoadImage(imagePath)
input.Deskew() ' settings.DeskewImage = true
input.DeNoise() ' settings.DespeckleLevel = 2
input.Contrast() ' settings.ContrastEnhancement = true
Dim result = ocr.Read(input)
End Using
görsel kalite düzeltme kılavuzu, hangi filtrelerin hangi belge kalite profillerine uygulandığını gösteren tüm mevcut ön işleme yöntemlerini listeler.
Sorun 6: Bölge Şablon Dosyaları Doğrudan Aktarılamıyor
Kofax OmniPage: OmniPage form şablonları, belge sınıfı başına alan konumlarını, tanıma tiplerini ve doğrulama kurallarını tanımlayan, özel .fdt veya .fpf şablon dosyalarında bölge tanımlarını saklar. Bu dosyalar IronOCR tarafından içe aktarılamaz.
Çözüm: Şablon dosyalarından (XML tabanlıdır) koordinat verilerini çıkarın ve her bölgeyi bir CropRectangle'e dönüştürün. Alan adları sözlük anahtarları olur; bölge koordinatları (x, y, width, height) parametrelerine doğrudan haritalanır:
// Convert OmniPage zone definition to IronOCR CropRectangle
// OmniPage zone: Name="TotalDue" X="490" Y="612" Width="180" Height="28"
//IronOCR equivalent:
var totalDueRegion = new CropRectangle(490, 612, 180, 28);
using var input = new OcrInput();
input.LoadImage(invoicePath, totalDueRegion);
string totalDue = new IronTesseract().Read(input).Text.Trim();
// Convert OmniPage zone definition to IronOCR CropRectangle
// OmniPage zone: Name="TotalDue" X="490" Y="612" Width="180" Height="28"
//IronOCR equivalent:
var totalDueRegion = new CropRectangle(490, 612, 180, 28);
using var input = new OcrInput();
input.LoadImage(invoicePath, totalDueRegion);
string totalDue = new IronTesseract().Read(input).Text.Trim();
Imports IronOcr
' Convert OmniPage zone definition to IronOCR CropRectangle
' OmniPage zone: Name="TotalDue" X="490" Y="612" Width="180" Height="28"
' IronOCR equivalent:
Dim totalDueRegion As New CropRectangle(490, 612, 180, 28)
Using input As New OcrInput()
input.LoadImage(invoicePath, totalDueRegion)
Dim totalDue As String = New IronTesseract().Read(input).Text.Trim()
End Using
Bölgeler sayfa başına değişiyorsa, aynı görüntüyü farklı CropRectangle değerleri ile yükleyin, dosyayı tekrar yüklemek yerine. bölge kırpma örneği, tek bir görüntü kaynağından birden fazla bölge okuma işlemini göstermektedir.
Kofax OmniPageGöç Kontrol Listesi
Öncesi-Geçiş
Kod tabanında tüm OmniPage entegrasyon noktalarını tanımlayın:
# Find all OmniPage namespace references
grep -r "Kofax\|OmniPage\|CSDK" --include="*.cs" --include="*.csproj" .
# Find engine lifecycle calls
grep -r "Initialize\|Shutdown\|SetLicenseFile" --include="*.cs" .
# Find document and zone creation patterns
grep -r "CreateDocument\|AddPage\|FormZone\|RecognitionSettings\|PreprocessingSettings" --include="*.cs" .
# Find output format configuration
grep -r "OutputSettings\|OutputFormat\|SaveAs\|GetText" --include="*.cs" .
# Find license file path references
grep -r "\.lic\|license\.lic\|licensePath" --include="*.cs" --include="*.config" --include="*.json" .
# Find all OmniPage namespace references
grep -r "Kofax\|OmniPage\|CSDK" --include="*.cs" --include="*.csproj" .
# Find engine lifecycle calls
grep -r "Initialize\|Shutdown\|SetLicenseFile" --include="*.cs" .
# Find document and zone creation patterns
grep -r "CreateDocument\|AddPage\|FormZone\|RecognitionSettings\|PreprocessingSettings" --include="*.cs" .
# Find output format configuration
grep -r "OutputSettings\|OutputFormat\|SaveAs\|GetText" --include="*.cs" .
# Find license file path references
grep -r "\.lic\|license\.lic\|licensePath" --include="*.cs" --include="*.config" --include="*.json" .
Başlangıçtan önce envanter çıkarın:
- OmniPage isim alanı içeri aktarımlarına sahip dosyaları sayın
- Tüm
FormTemplateveFormZonetanımlarını listeleyin ve bunların koordinat verilerini çıkarın - Yüklenmiş olan dil sözlüklerini tanımlayın ve
IronOcr.Languages.*NuGet paketlerine haritalayın - Hangi çıktı formatlarının kullanıldığını not alın (aranabilir PDF, düz metin, XML) ve bunların IronOCR eşdeğerlerini not alın
- Dağıtım betiklerinde ve yapılandırmasındaki tüm
.licdosya referanslarını bulun
Kod Geçişi
- Tüm
.csprojdosyalarından OmniPage DLL referanslarını kaldırın - OCR gerçekleştiren her projede
dotnet add package IronOcrçalıştırın - Kullanılan her dil için dil paketleri ekleyin:
dotnet add package IronOcr.Languages.[Language] - Her uygulama giriş noktasına
IronOcr.License.LicenseKey = ...;ekleyin (Program.cs, Startup.cs veya servis ana bilgisayarı) - Tüm
using Kofax.OmniPage.CSDK;,using CSDK;ve ilgili isim alanı ithalatlarınıusing IronOcr;ile değiştirin - Tüm
OmniPageEngineyapımlarını,SetLicenseFileveInitializeçağrılarını kaldırın - Tüm
engine.Shutdown()çağrılarını ve sadece kapatma sağlamak için var olanIDisposableuygulamalarını kaldırın engine.CreateDocument()+document.AddPage(),new OcrInput()+input.LoadImage()ile değiştirinengine.OpenPDF()+ sayfa başına yinelemeyi,input.LoadPdf()(tüm sayfalar tek bir çağrıda) ile değiştirinengine.OpenTiff()+ çerçeve başına döngüleriinput.LoadImageFrames()ile değiştirindocument.Recognize(settings),new IronTesseract().Read(input)ile değiştirinFormZonekoordinat verileriniCropRectangle(x, y, width, height)örneklerine dönüştüründocument.GetZoneText(), bölge başınainput.LoadImage(path, cropRectangle)+result.Textile değiştirin- Aranabilir PDF için
document.SaveAs(path, outputSettings)'iresult.SaveAsSearchablePdf(path)ile değiştirin - Sonuç yineleyici kalıpları,
result.Pages/.Paragraphs/.Wordsözelliği gezinimi ile değiştirin PreprocessingSettingsnesnelerini kaldırın ve boole bayraklarını açıkinput.Deskew(),input.DeNoise(),input.Contrast()yöntem çağrıları ile değiştirin- Dağıtım betiklerinden, yapılandırma dosyalarından ve altyapı-kod şablonlarından lisans dosyası yollarını kaldırın
Geçiş Sonrası
- Canlı koleksiyondan 100+ belgeyi temsili bir örnek üzerinde OCR doğruluğunu doğrulayın — OmniPage çıktısına karşı fatura, sözleşme ve formlar için satır-satır karşılaştırma yapın
CropRectangletabanlı bölge çıkarmanın, haritalanmış her alan için OmniPageGetZoneText()çıktısına eşleşen metni döndürdüğünü doğrulayın- Çok sayfalı PDF işleme test edin: sayfa sayısını, sayfa sırasını ve metin sürekliliğini doğrulayın
- Çok çerçeveli TIFF işleme test edin: tüm çerçevelerin işlendiğini ve çerçeve dizisinin korunduğunu doğrulayın
- Aranabilir PDF çıktısının kullanılan belge yönetim sisteminde (SharePoint, OpenText vb.) dizine alınabilir olduğunu doğrulayın
- 50+ eşzamanlı belgeyle paralel işlem testi yapın ve iş parçacığı güvenliği sorunlarının olmadığını doğrulayın
- Dil paketi kapsamını test edin:
IronOcr.Languages.*ile daha önce kullanılan her dil sözlüğünü yükleyin ve tanıma kalitesini doğrulayın - İşlem çöküşlerinin ve konteyner yeniden başlatmalarının herhangi bir lisans kurtarma eylemini gerektirmediğinden emin olun
- CI temsilcisinde Docker derlemesini çalıştırın — kurulum adımları olmadan IronOCR'un çözümlendiğini doğrulayın
- Güven puanlarının kelime başına mevcut olduğunu ve her türlü aşağı akış doğrulama iş akışının veri kalitesi beklentilerini karşılayıp karşılamadığını doğrulayın
- Herhangi bir yolda
.licdosyası bulunmadan uygulamanın temiz başlamasını kontrol edin
IronOCR'a Geçişin Ana Faydaları
Dağıtım karmaşıklığı haftalardan dakikalara düşer. Önceden SDK yükleyici erişimi, .lic dosya dağıtımı, lisans sunucusu için güvenlik duvarı yapılandırması ve altyapı ekibi koordinasyonu gerektiren bir proje, şimdi dotnet restore ile dağıtılıyor. Yeni bir geliştirici depo klonlanır ve projeyi çalıştırır. CI/CD hattı tarafından yeni bir üretim sunucusu sağlanır. Konteyner imajları yükleyici adımlar olmadan oluşturulur.
Lisans riski tamamen ortadan kalkar. Tükenmek üzere hiçbir uçucu koltuk yok, beklemek için hiçbir çıkış zaman aşımı yok, yeniden etkinleştirmek için hiçbir donanım parmak izi yok ve dağıtım hatlarında koruyacak hiçbir .lic dosyası yok. Sabah 3'teki bir uygulama çöküşü hiçbir şey serbest bırakmaz ve hiçbir şeyi kilitlemez. Çağrıdaki mühendis işlemi yeniden başlatır; OCR anında devam eder. IronOCR ürün sayfası tüm lisans seviyelerini kapsar.
Çapraz platform dağıtımı standart bir NuGet hedefi haline gelir. macOS geliştirme makineleri, platform istisnası olmadan çalışır. Linux üretim sunucularının Ocak 2026 SDK sürümüne ihtiyacı yoktur. Docker konteynerları, bir sistem bağımlılığı ile standart mcr.microsoft.com/dotnet/aspnet taban imajından inşa edilir. Aynı IronOcr paket referansı, .csproj içinde Windows, Linux ve macOS üzerinde çalışan bir yapı üretir. Azure dağıtım kılavuzu ve AWS dağıtım kılavuzu bulut özel yapılandırması için gözden geçirin.
Paralel işlem hacmi donanım ile ölçeklenir. OmniPage'in paylaşılan motor mimarisi, eşzamanlı tanımayı seri hale getiren kilitlemeye ihtiyaç duyar. IronOCR'un durumsuz IronTesseract örnekleri, mevcut CPU çekirdekleriyle doğrusal olarak ölçeklenir. Bir toplu işleme sunucusunun çekirdek sayısını iki katına çıkarmak, yapılandırma değişiklikleri veya ek lisanslama olmadan iş hacmini iki katına çıkarır.
Yapısal veri erişimi anında sağlanır. OcrResult.Pages, Paragraphs, Lines, Words ve Characters, tam belge yapısını gezilebilir .NET nesne grafiği olarak açıklar. Her kelime nesnesi üzerinde kelime başına güven ve koordinatlar gibi özellikler bulunur. Konum verisine erişim için ikincil bir ihraç hattı, bir format yapılandırması ve bir dosya çıktısı gereklidir.
Maliyet sabit ve öngörülebilir. OmniPage'in SDK lisansı, yıllık bakım ve sayfa başına işlem ücretlerinin kombinasyonu maliyeti kullanımla ölçeklendirir ve yıllık olarak tekrar eder. IronOCR, $999–$2,999 süresiz bir kerelik satın almadır. Sayfa başına masraflar oluşturan 500.000 sayfa/yıl iş akışı birkaç hafta içinde IronOCR lisans maliyetini geri kazanır. IronOCR dokümantasyon merkezi ve eğitimler destek sözleşmesi olmadan da mevcuttur.
Sıkça Sorulan Sorular
Kofax OmniPage'den IronOCR'ye neden geçmeliyim?
Yaygın geçiş nedenleri arasında COM ara bağlamının karmaşıklığını ortadan kaldırmak, dosya tabanlı lisans yönetimini değiştirmek, sayfa başına fatura düzenlemekten kaçınmak, Docker/kapsayıcı dağıtımını etkinleştirmek ve standart .NET araçlarıyla entegre olan bir NuGet doğal iş akışı benimsemek yer almaktadır.
Kofax OmniPage'den IronOCR'ye geçişteki ana kod değişiklikleri nelerdir?
Kofax OmniPage başlangıç dizilerini IronTesseract örneği ile değiştirin, COM yaşam döngüsü yönetimini (açık Create/Load/Close desenleri) kaldırın ve sonuç özellik adlarını güncelleyin. Sonuç, önemli ölçüde daha az boilerplate satırıdır.
Geçişi başlatmak için IronOCR'u nasıl kurarım?
Paket Yöneticisi Konsolunda 'Install-Package IronOcr' veya CLI'da 'dotnet add package IronOcr' çalıştırın. Dil paketleri ayrı paketlerdir: Örneğin, Fransızca için 'dotnet add package IronOcr.Languages.French'.
IronOCR, Kofax OmniPage'in standart iş belgeleri için OCR doğruluğunu karşılıyor mu?
IronOCR, faturalar, sözleşmeler, makbuzlar ve yazılı formlar dahil olmak üzere standart işletme içerikleri için yüksek doğruluğa ulaşır. Görüntü ön işleme filtreleri (dengelemeyi düzeltme, gürültü kaldırma, kontrast artırma) bozulmuş girdiler üzerindeki tanımayı daha da iyileştirir.
IronOCR, Kofax OmniPage'in ayrı kurduğu dil verilerini nasıl yönetiyor?
IronOCR'daki dil verileri, NuGet paketleri olarak dağıtılır. 'dotnet add package IronOcr.Languages.German' komutuyla Almanca desteği yüklenir. Herhangi bir manuel dosya yerleştirme veya dizin yolu gerekmez.
Kofax OmniPage'den IronOCR'ye geçiş, dağıtım altyapısında değişiklik gerektiriyor mu?
IronOCR, Kofax OmniPage'den daha az altyapı değişikliği gerektirir. SDK ikili yolları, lisans dosyası yerleşimleri veya lisans sunucu yapılandırmaları yoktur. NuGet paketi, tam OCR motorunu içerir ve lisans anahtarı uygulama kodunda belirlenmiş bir dizgedir.
Geçişten sonra IronOCR lisanslamasını nasıl yapılandırırım?
Uygulama başlangıç kodunda IronOcr.License.LicenseKey = "SİZİN-ANAHTARINIZ" atayın. Docker veya Kubernetes'te, anahtarı bir ortam değişkeni olarak saklayın ve başlangıçta okuyun. Trafiği kabul etmeden önce doğrulamak için License.IsValidLicense kullanın.
IronOCR, PDF'leri Kofax OmniPage gibi işleyebilir mi?
Evet. IronOCR hem yerel hem de taranmış PDF'leri okur. Bir PDF yolu veya OcrPdfInput olan girdiye ocr.Read(input) çağrısı yapmak için IronTesseract örneği çağırın ve OcrResult sayfalarını yineleyin. Ayrı bir PDF işleme hattı gerekmez.
IronOCR, yüksek hacim işleme sırasında iş parçacığı nasıl ele alır?
IronTesseract, iş parçacığı başına örnek olacak şekilde güvenlidir. Paralel.ForEach veya Görev havuzunda her iş parçacığı için bir örnek oluşturun, OCR'u eşzamanlı olarak çalıştırın ve her örneği iş tamamlandığında bırakın. Küresel durum veya kilitleme gerekmez.
IronOCR metin çıktıktan sonra hangi çıktıları destekler?
IronOCR, metin, kelime koordinatları, güven skorları ve sayfa yapısını içeren yapılandırılmış sonuçlar döndürür. Dışa aktarma seçenekleri düz metin, aranabilir PDF ve aşağı akış işlemesi için yapılandırılmış sonuç nesneleri içerir.
IronOCR'ın fiyatlandırması, ölçeklendirme iş yükleri için Kofax OmniPage'den daha öngörülebilir mi?
IronOCR, sayfa başına veya hacim ücretlendirmesi olmadan düz oranlı sürekli lisanslama kullanır. 10.000 veya 10 milyon sayfa işleseniz de lisans maliyeti sabit kalır. Hacim ve ekip lisanslama seçenekleri IronOCR fiyatlandırma sayfasındadır.
Kofax OmniPage'den IronOCR'ye geçtikten sonra mevcut testlerime ne olacak?
Çıkarılmış metin içeriğini doğrulayan testler, geçişten sonra çalışmaya devam etmelidir. API çağrı şablonlarını veya COM nesne yaşam döngüsünü doğrulayan testler, IronOCR'un daha basit başlatma ve sonuç modelini yansıtacak şekilde güncellenmelidir.

