Altbilgi içeriğine atla
VIDEOLAR

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
$vbLabelText   $csharpLabel
// 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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."))
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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" .
SHELL

Başlangıçtan önce envanter çıkarın:

  • OmniPage isim alanı içeri aktarımlarına sahip dosyaları sayın
  • Tüm FormTemplate ve FormZone tanı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 .lic dosya referanslarını bulun

Kod Geçişi

  1. Tüm .csproj dosyalarından OmniPage DLL referanslarını kaldırın
  2. OCR gerçekleştiren her projede dotnet add package IronOcr çalıştırın
  3. Kullanılan her dil için dil paketleri ekleyin: dotnet add package IronOcr.Languages.[Language]
  4. Her uygulama giriş noktasına IronOcr.License.LicenseKey = ...; ekleyin (Program.cs, Startup.cs veya servis ana bilgisayarı)
  5. Tüm using Kofax.OmniPage.CSDK;, using CSDK; ve ilgili isim alanı ithalatlarını using IronOcr; ile değiştirin
  6. Tüm OmniPageEngine yapımlarını, SetLicenseFile ve Initialize çağrılarını kaldırın
  7. Tüm engine.Shutdown() çağrılarını ve sadece kapatma sağlamak için var olan IDisposable uygulamalarını kaldırın
  8. engine.CreateDocument() + document.AddPage(), new OcrInput() + input.LoadImage() ile değiştirin
  9. engine.OpenPDF() + sayfa başına yinelemeyi, input.LoadPdf() (tüm sayfalar tek bir çağrıda) ile değiştirin
  10. engine.OpenTiff() + çerçeve başına döngüleri input.LoadImageFrames() ile değiştirin
  11. document.Recognize(settings), new IronTesseract().Read(input) ile değiştirin
  12. FormZone koordinat verilerini CropRectangle(x, y, width, height) örneklerine dönüştürün
  13. document.GetZoneText(), bölge başına input.LoadImage(path, cropRectangle) + result.Textile değiştirin
  14. Aranabilir PDF için document.SaveAs(path, outputSettings)'i result.SaveAsSearchablePdf(path) ile değiştirin
  15. Sonuç yineleyici kalıpları, result.Pages / .Paragraphs / .Words özelliği gezinimi ile değiştirin
  16. PreprocessingSettings nesnelerini kaldırın ve boole bayraklarını açık input.Deskew(), input.DeNoise(), input.Contrast() yöntem çağrıları ile değiştirin
  17. 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
  • CropRectangle tabanlı bölge çıkarmanın, haritalanmış her alan için OmniPage GetZoneText() çı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 .lic dosyası 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.

Lütfen dikkate alınKofax OmniPage, OpenPDF ve Tesseract, ilgili sahiplerinin tescilli markalarıdır. Bu site, Google, Kofax veya LibrePDF ile münasebet halinde değildir, onaylanmamıştır veya desteklenmemektedir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.

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.

Curtis Chau
Teknik Yazar

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ı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara