Altbilgi içeriğine atla
DIğER BILEşENLERLE KARşıLAşTıRıN

Fatura OCR Açık Kaynak Karşılaştırması: En İyi Aracı Bulun

LEADTOOLS, 1990'dan beri SDK yazılımı sevkiyatı yapmaktadır ve OCR entegrasyonu bu mirası tam anlamıyla taşır: Tek bir karakter tanınmadan önce, uygulamanızın disk üzerindeki iki ikili dosyayı bulması, LEADTOOLS.LIC ve LEADTOOLS.LIC.KEY arasında bir eşleşmeyi doğrulaması, bir RasterCodecs örneğini başlatması, üç farklı seçenekten bir motor türü seçmesi, bir çalışma zamanı dizin yolu ile engine.Startup() çağrısı yapması ve sonra — ve ancak o zaman — gerçek tanıma işine başlaması gerekir. Her üretim makinesi, lisans dosyalarının belirli bir yola dağıtılmasını gerektirir.Dockerkonteynerleri, bu dosyaların monte edilmesini veya pişirilmesini gerektirir. CI/CD hatları, dosyaların doğru yerde olmasını veya uygulamanın başlangıçta çökmesini gerektirir. Ve geliştirme kitlerini satın alan geliştirici yanlış paketi satın almışsa, OCR modülü hiç dahil olmayabilir, çünkü LEADTOOLS, görüntüleme kodeklerinden ayrı bir modül olarak OCR yeteneklerini satar.

LEADTOOLS OCR'ı Anlamak

LEADTOOLS, LEAD Technologies'ten bir belge görüntüleme platformudur, bu şirket 1990'dan beri ticari SDK yazılımı göndermektedir. OCR yeteneği, aynı zamanda belge görüntüleyicileri, tıbbi görüntüleme (DICOM/PACS), barkod okuma, form tanıma, anotasyonlar ve PDF manipülasyonunu kapsayan bir araç kitindeki birçok modülden biridir. Bu mimari, LEADTOOLS'un bir OCR kütüphanesi olmadığı — OCR'nin modüllerinden biri olduğu bir görüntüleme platformu olduğu anlamına gelir.

LEADTOOLS OCR'nin temel mimari özellikleri:

  • Üç ayrı OCR motoru: Temel lisansa dahil olan LEAD özel motoru, tessdata dosyaları gerektiren bir Tesseract sarmalayıcı ve ayrı bir Kofax lisans anlaşması ve ikinci bir satıcı ilişkisi gerektiren bir OmniPage motoru. Motor seçimi, hem kodu hem de maliyeti etkiler.
  • Dosya tabanlı lisans dağıtımı: LEADTOOLS.LIC ve LEADTOOLS.LIC.KEY olmak üzere iki dosya çalışma zamanında okunabilir olmalıdır. Yol başlangıçta sabit kodlanmış veya çözülmüş olabilir. Yol çözümlemesi IIS ile konsol ana bilgisayarı arasında,Dockerile çıplak metal arasında, sürüm yapıları ile hata ayıklama arasında farklı davranır.
  • Gerekli bir ara adım olarak RasterCodecs: Görüntü yükleme doğrudan OCR motoruna gitmez. PDF sayfaları dahil olmak üzere her görüntü ilk önce RasterCodecs örneği aracılığıyla yüklenir ve bu motor başlamadan önce başlatılmalıdır.
  • Açık motor yaşam döngüsü: OcrEngineManager.CreateEngine() motoru oluşturur, engine.Startup() bunu belleğe yükler (500–2000 ms) ve engine.Shutdown(), Dispose() çağrılmadan önce çağrılmalıdır. Yanlış sırayla kapatma çağrısını atlamak, hatalar üretir.
  • Paket fiyatlandırma karmaşıklığı: LEADTOOLS fiyatı kamuya açıklamaz. Özel gereksinimlerinize dayalı teklif almak için LEADTOOLS satış ekibi ile iletişime geçin. Güncellemeleri almak için yıllık bakım ücretleri gereklidir.
  • Büyük dağıtım ayak izi: Üretim dağıtımları çoklu LEADTOOLS DLL'leri, bir OcrRuntime/ dizini, lisans dosyaları ve isteğe bağlı olarak Tesseract motorunu kullanıyorsanız bir tessdata/ klasörü içerir.

Başlangıç Sırası

LEADTOOLS, herhangi bir tanıma başlamadan önce belirli bir çok adımlı kurulum gerektirir. Sıra isteğe bağlı değildir — SetLicense() veya RasterCodecs başlatılmadan önce Startup() çağrılması çalışma zamanı hatalarına neden olur:

using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;

public class LeadtoolsOcrService : IDisposable
{
    private IOcrEngine _ocrEngine;
    private RasterCodecs _codecs;

    public LeadtoolsOcrService()
    {
        // Step 1: Locate and validate both license files
        RasterSupport.SetLicense(
            @"C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));

        // Step 2: Initialize image codec layer
        _codecs = new RasterCodecs();

        // Step 3: Select engine type — wrong choice means different behavior
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);

        // Step 4: Load runtime into memory (500–2000ms)
        _ocrEngine.Startup(_codecs, null, null,
            @"C:\LEADTOOLS\OCR\OcrRuntime");
    }

    public string ExtractText(string imagePath)
    {
        using var image = _codecs.Load(imagePath);
        using var document = _ocrEngine.DocumentManager.CreateDocument();
        var page = document.Pages.AddPage(image, null);
        page.Recognize(null);   // Recognition is not automatic
        return page.GetText(-1);
    }

    public void Dispose()
    {
        _ocrEngine?.Shutdown(); // Must call before Dispose
        _ocrEngine?.Dispose();
        _codecs?.Dispose();
    }
}
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;

public class LeadtoolsOcrService : IDisposable
{
    private IOcrEngine _ocrEngine;
    private RasterCodecs _codecs;

    public LeadtoolsOcrService()
    {
        // Step 1: Locate and validate both license files
        RasterSupport.SetLicense(
            @"C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));

        // Step 2: Initialize image codec layer
        _codecs = new RasterCodecs();

        // Step 3: Select engine type — wrong choice means different behavior
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);

        // Step 4: Load runtime into memory (500–2000ms)
        _ocrEngine.Startup(_codecs, null, null,
            @"C:\LEADTOOLS\OCR\OcrRuntime");
    }

    public string ExtractText(string imagePath)
    {
        using var image = _codecs.Load(imagePath);
        using var document = _ocrEngine.DocumentManager.CreateDocument();
        var page = document.Pages.AddPage(image, null);
        page.Recognize(null);   // Recognition is not automatic
        return page.GetText(-1);
    }

    public void Dispose()
    {
        _ocrEngine?.Shutdown(); // Must call before Dispose
        _ocrEngine?.Dispose();
        _codecs?.Dispose();
    }
}
Imports Leadtools
Imports Leadtools.Ocr
Imports Leadtools.Codecs
Imports System.IO

Public Class LeadtoolsOcrService
    Implements IDisposable

    Private _ocrEngine As IOcrEngine
    Private _codecs As RasterCodecs

    Public Sub New()
        ' Step 1: Locate and validate both license files
        RasterSupport.SetLicense(
            "C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText("C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"))

        ' Step 2: Initialize image codec layer
        _codecs = New RasterCodecs()

        ' Step 3: Select engine type — wrong choice means different behavior
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)

        ' Step 4: Load runtime into memory (500–2000ms)
        _ocrEngine.Startup(_codecs, Nothing, Nothing,
            "C:\LEADTOOLS\OCR\OcrRuntime")
    End Sub

    Public Function ExtractText(imagePath As String) As String
        Using image = _codecs.Load(imagePath)
            Using document = _ocrEngine.DocumentManager.CreateDocument()
                Dim page = document.Pages.AddPage(image, Nothing)
                page.Recognize(Nothing) ' Recognition is not automatic
                Return page.GetText(-1)
            End Using
        End Using
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        If _ocrEngine IsNot Nothing Then
            _ocrEngine.Shutdown() ' Must call before Dispose
            _ocrEngine.Dispose()
        End If
        If _codecs IsNot Nothing Then
            _codecs.Dispose()
        End If
    End Sub
End Class
$vbLabelText   $csharpLabel

Bu, minimum uygulanabilir uygulamadır. Lisans yolu hataları, motor durumu doğrulama veya toplu işlem için gerekli olan bellek yönetimi (RasterImage örneklerinin bırakılmasının unutulması işlemin çökmesine kadar belleği biriktirir) için hata işlemi içermez.

IronOCR'u Anlamak

IronOCR, geliştirilmiş bir Tesseract 5 LSTM motoru etrafında kurulmuş ticari bir .NET OCR kütüphanesidir. Odağa sahip bir OCR ürünüdür — modül olarak OCR içeren bir görüntüleme platformu değil. Tasarım hedefi, bir geliştirici ve tanınmış metin arasındaki her türlü altyapı yükünü kaldırmaktır.

IronOCR'nin ana özellikleri:

  • Tek NuGet paketi: dotnet add package IronOcr, dağıtacak ek bir çalışma zamanı dizini, tessdata klasörü veya lisans dosyası olmadan gerekli her şeyi, yerel bağımlılıklar dahil, kurar.
  • Dize tabanlı lisanslama: Tek bir satır, bir lisans anahtarı atar. Anahtar, bir ortam değişkeninden, appsettings.json, Azure Key Vault veya AWS Secrets Manager'dan gelebilir — zaten kullanılan herhangi bir gizlilik yönetimi deseni. Diske dosya yok.
  • Motor yaşam döngüsü yok: IronTesseract, ilk kullanımda lazy loading ile başlatılır. Hiçbir Startup() çağrısı yok, Shutdown() çağrısı yok ve işlemler arasında motoru bırakma gerekliliği yok.
  • Yerel PDF girişi: PDF'ler, OcrInput.LoadPdf() aracılığıyla doğrudan yüklenir. Sayfa sayfa rasterleştirme döngüsü yok, bayt sırası belirtimi yok, ara RasterImage nesnelerinin manuel olarak bırakılması yok.
  • Otomatik ön işleme: Yatıştırma, paraziti giderme, kontrast arttırma, ikili hale getirme ve çözünürlük normalizasyonu OcrInput üzerinde tek bir yöntem çağrısı olarak mevcuttur. Tüm sayfalara aynı anda uygulanır.
  • 125+ dil NuGet üzerinden: Her dil ayrı bir NuGet paketi (IronOcr.Languages.French, vb.). Yönetilecek bir tessdata dizini yok, yol yapılandırması yok.
  • Varsayılan olarak thread-safe: IronTesseract örnekleri eşzamanlı kullanım için güvenlidir. Paralel işleme ek senkronizasyon kodu gerektirmez.
  • Süresiz lisanslama: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited, bir yıl güncellemeyle birlikte tek seferlik satın alma.

Özellik Karşılaştırması

Özellik LEADTOOLS OCR IronOCR
Kurulum karmaşıklığı Yüksek — 4 adımlı başlatma dizisi Düşük — bir NuGet paketi
Lisans dağıtımı Her makinede iki dosya (.LIC + .LIC.KEY) Dize anahtarı, herhangi bir yere kaydedin
Fiyatlandırma modeli LEADTOOLS satış departmanıyla fiyatlandırma için iletişime geçin $999–$5,999 tek seferlik süresiz
PDF desteği Elle sayfa bazında rasterleştirme Yerel LoadPdf()
Ön işlem Elle — ayrı görüntü işleme komutları Yerleşik filtre yöntemleri
Motor yaşam döngüsü Manuel Startup() / Shutdown() gereklidir Otomatik, tembel
NuGet paketleri Birden fazla (Leadtools, Leadtools.Ocr, Leadtools.Codecs, Leadtools.Pdf) Bir (IronOcr)
Thread güvenliği Dikkatli yönetim gerektirir Yerleşik

Ayrıntılı Özellik Karşılaştırması

Özellik LEADTOOLS OCR IronOCR
Lisanslama
Lisans mekanizması .LIC + .LIC.KEY dosya çifti Dize anahtarı
Lisans dağıtımı Her üretim makinesinde dosyalar Ortam değişkeni veya yapılandırma
Fiyat şeffaflığı Satış danışması gereklidir Web sitesinde yayınlanmış
Süresiz seçenek Hayır (yıllık bakım gereklidir) Evet
Kurulum ve Yükleme
NuGet paketleri gerekli 3–4 minimum (PDF için daha fazla) 1
Çalışma zamanı dosyaları gereklidir Evet — OcrRuntime/ dizini Hayır
Motor başlatma Runtime yoluyla manuel Startup() None
Motor kapatma Dispose() öncesinde manuel Shutdown() None
tessdata management Tesseract motor seçeneği için gereklidir Hayır
OCR Yetenekleri
Motor seçenekleri LEAD, Tesseract, OmniPage (ayrı lisanslanır) IronTesseract (optimize edilmiş Tesseract 5 LSTM)
Diller 60–120 (motor bağımlı) 125+ NuGet üzerinden
Dil dağıtımı tessdata files or engine-bundled NuGet dil paketleri
Güven skoru page.RecognizeStatus result.Confidence (yüzde)
Yapılandırılmış çıktı Sayfa, bölge-düzeyi Sayfa, paragraf, satır, kelime, karakter
Barkod okuma Ayrıca LEADTOOLS Barkod modülü Dahili (ReadBarCodes = true)
PDF İşleme
PDF girdisi Sayfa bazında rasterleştirme döngüsü Yerel LoadPdf()
Şifreli PDF'ler Leadtools.Pdf modülü gerektirir (ek lisans) Dahili Password parametresi
Aranabilir PDF çıktısı DocumentWriter yapılandırması + document.Save() result.SaveAsSearchablePdf()
Sayfa aralığı seçimi Elle döngü sınırları LoadPdfPages(path, start, end)
Ön işlem
Hizalama DeskewCommand (manuel her görüntü için) input.Deskew()
Gürültü giderme DespeckleCommand (manuel her görüntü için) input.DeNoise()
İkili hale getirme AutoBinarizeCommand (manuel her görüntü için) input.Binarize()
Kontrast artırma ContrastBrightnessCommand (manuel) input.Contrast()
Çözünürlük iyileştirmesi Elle gri tonlama + yeniden örnekleme komutları input.EnhanceResolution(300)
Dağıtım
Docker LIC/ANAHTAR dosyaları takılmalı veya sabit olmalı Standart dotnet publish
Linux Yerel bağımlılıklar ile desteklenir Desteklenir, bağımlılıklar paketlenmiştir
İzole Evet Evet
CI/CD karmaşıklığı Her ortamda lisans dosyaları + çalışma zamanı yolu Gizli yönetiminde lisans anahtarı

Lisans Mimarisi: Dosya Dağıtımı vs. Dize Anahtar

LEADTOOLS ve IronOCR arasında lisans mimarisi farkı sadece geliştirici ergonomisi ile sınırlı değil — doğrudan dağıtım hatlarını, konteyner stratejilerini ve operasyon yükünü etkiler.

LEADTOOLS Yaklaşımı

LEADTOOLS, uygulama başlatıldığında mevcut ve okunabilir iki fiziksel dosya gerektirir. .cs kaynak dosyalarındaki kod modeli doğrular:

// From leadtools-migration-examples.cs
public void InitializeLicense()
{
    // Option 1: Absolute paths — deployment dependent
    string licPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC";
    string keyPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY";

    // Option 2: Relative paths — working directory dependent
    licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC");
    keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY");

    // Read key file content (not the path — the content)
    string key = File.ReadAllText(keyPath);

    // Set license — silent failure on some error types
    RasterSupport.SetLicense(licPath, key);

    // Verify license is valid for the module you purchased
    if (!RasterSupport.IsLocked(RasterSupportType.Document))
    {
        throw new InvalidOperationException("Document module not licensed");
    }
}
// From leadtools-migration-examples.cs
public void InitializeLicense()
{
    // Option 1: Absolute paths — deployment dependent
    string licPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC";
    string keyPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY";

    // Option 2: Relative paths — working directory dependent
    licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC");
    keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY");

    // Read key file content (not the path — the content)
    string key = File.ReadAllText(keyPath);

    // Set license — silent failure on some error types
    RasterSupport.SetLicense(licPath, key);

    // Verify license is valid for the module you purchased
    if (!RasterSupport.IsLocked(RasterSupportType.Document))
    {
        throw new InvalidOperationException("Document module not licensed");
    }
}
Imports System
Imports System.IO

Public Sub InitializeLicense()
    ' Option 1: Absolute paths — deployment dependent
    Dim licPath As String = "C:\LEADTOOLS\License\LEADTOOLS.LIC"
    Dim keyPath As String = "C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"

    ' Option 2: Relative paths — working directory dependent
    licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC")
    keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY")

    ' Read key file content (not the path — the content)
    Dim key As String = File.ReadAllText(keyPath)

    ' Set license — silent failure on some error types
    RasterSupport.SetLicense(licPath, key)

    ' Verify license is valid for the module you purchased
    If Not RasterSupport.IsLocked(RasterSupportType.Document) Then
        Throw New InvalidOperationException("Document module not licensed")
    End If
End Sub
$vbLabelText   $csharpLabel

Hata modları birden fazla ve her biri ayrı bir çözüm gerektirir. Yol çözümlemesi, IIS ile bir konsol ana bilgisayarı arasında farklı davranır. bin/Debug içindeki göreceli yollar, bin/Release ya da birDockerkonteynerında yollarla eşleşmez, onları açıkça eşleştirmedikçe. LIC ve KEY dosyalarının aynı indirilmeye ait olması gerekir — farklı indirmelerden dosyalar 'anahtar lisans dosyasıyla eşleşmiyor' hatası üretir. Eğer lisans yalnızca Belge paketi kapsamındaysa ancak kod Tanıma paketinden bir özellik kullanıyorsa, IsLocked() false döndürür ve uygulama başlangıçta uyumsuzluğu işlemesi gerekir.

Üretim sırasındaki yaygın hatalar:

  • "License file not found at specified path" — yol yanlış dizine çözülmüş
  • "License key does not match license file" — çeşitli indirmelerden gelen veya aktarımda bozulmuş dosyalar
  • "Document module not licensed" — yanlış paket satın alındı
  • "License has expired" — değerlendirme lisans süresi doldu veya bakım aksadı

IronOCR Yaklaşımı

IronOCR lisanslaması tek bir dize atamasıdır. Dosya yok, yol çözünürlüğü yok, iki parçalı doğrulama yok:

// From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY";

// Production: pull from environment variable
IronOcr.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

// Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration["IronOCR:LicenseKey"];
// From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY";

// Production: pull from environment variable
IronOcr.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

// Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration["IronOCR:LicenseKey"];
' From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY"

' Production: pull from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

' Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration("IronOCR:LicenseKey")
$vbLabelText   $csharpLabel

Anahtar Azure Anahtar Kasası, AWS Secrets Manager, Kubernetes sırları veyaDockerçevresel değişkenine girebilir.Dockergörüntüsünde dahil edilmesi gereken dosya yoktur. CI/CD hattı aşaması, lisans eserlerini yapı ajanlarına kopyalamaz. IronOCR lisanslama sayfası, mevcut düzeyleri doğrudan belgelemekte, satış görüşmesi gerektirmemektedir.

Motor Kurulumu ve Ayrıntı Düzeyi

Temel bir OCR görevi için LEADTOOLS ve IronOCR arasındaki kod farkı, her kütüphanenin API felsefesini gösterir.

LEADTOOLS Yaklaşımı

Metin döndürülmeden önce on farklı işlem gerektiren en düşük çalıştırılabilir LEADTOOLS uygulaması (leadtools-vs-ironocr-examples.cs'dan doğrudan alınmıştır):

using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;

public class LeadtoolsOcrService : IDisposable
{
    private IOcrEngine _ocrEngine;
    private RasterCodecs _codecs;

    public LeadtoolsOcrService()
    {
        // Step 1: License files
        RasterSupport.SetLicense(
            @"C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));

        // Step 2: Codec layer
        _codecs = new RasterCodecs();

        // Step 3: Engine factory
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);

        // Step 4: Engine startup (500–2000ms blocking call)
        _ocrEngine.Startup(_codecs, null, null,
            @"C:\LEADTOOLS\OCR\OcrRuntime");
    }

    public string ExtractText(string imagePath)
    {
        using var image = _codecs.Load(imagePath);          // Step 5: Load via codecs
        using var document = _ocrEngine.DocumentManager     // Step 6: Create document
                                       .CreateDocument();
        var page = document.Pages.AddPage(image, null);     // Step 7: Add page
        page.Recognize(null);                               // Step 8: Explicit recognize
        return page.GetText(-1);                            // Step 9: Extract text
    }

    public void Dispose()
    {
        _ocrEngine?.Shutdown();  // Step 10: Shutdown before dispose
        _ocrEngine?.Dispose();
        _codecs?.Dispose();
    }
}
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;

public class LeadtoolsOcrService : IDisposable
{
    private IOcrEngine _ocrEngine;
    private RasterCodecs _codecs;

    public LeadtoolsOcrService()
    {
        // Step 1: License files
        RasterSupport.SetLicense(
            @"C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));

        // Step 2: Codec layer
        _codecs = new RasterCodecs();

        // Step 3: Engine factory
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);

        // Step 4: Engine startup (500–2000ms blocking call)
        _ocrEngine.Startup(_codecs, null, null,
            @"C:\LEADTOOLS\OCR\OcrRuntime");
    }

    public string ExtractText(string imagePath)
    {
        using var image = _codecs.Load(imagePath);          // Step 5: Load via codecs
        using var document = _ocrEngine.DocumentManager     // Step 6: Create document
                                       .CreateDocument();
        var page = document.Pages.AddPage(image, null);     // Step 7: Add page
        page.Recognize(null);                               // Step 8: Explicit recognize
        return page.GetText(-1);                            // Step 9: Extract text
    }

    public void Dispose()
    {
        _ocrEngine?.Shutdown();  // Step 10: Shutdown before dispose
        _ocrEngine?.Dispose();
        _codecs?.Dispose();
    }
}
Imports Leadtools
Imports Leadtools.Ocr
Imports Leadtools.Codecs
Imports System.IO

Public Class LeadtoolsOcrService
    Implements IDisposable

    Private _ocrEngine As IOcrEngine
    Private _codecs As RasterCodecs

    Public Sub New()
        ' Step 1: License files
        RasterSupport.SetLicense(
            "C:\LEADTOOLS\License\LEADTOOLS.LIC",
            File.ReadAllText("C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"))

        ' Step 2: Codec layer
        _codecs = New RasterCodecs()

        ' Step 3: Engine factory
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)

        ' Step 4: Engine startup (500–2000ms blocking call)
        _ocrEngine.Startup(_codecs, Nothing, Nothing,
            "C:\LEADTOOLS\OCR\OcrRuntime")
    End Sub

    Public Function ExtractText(imagePath As String) As String
        Using image = _codecs.Load(imagePath) ' Step 5: Load via codecs
            Using document = _ocrEngine.DocumentManager ' Step 6: Create document
                                           .CreateDocument()
                Dim page = document.Pages.AddPage(image, Nothing) ' Step 7: Add page
                page.Recognize(Nothing) ' Step 8: Explicit recognize
                Return page.GetText(-1) ' Step 9: Extract text
            End Using
        End Using
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _ocrEngine?.Shutdown() ' Step 10: Shutdown before dispose
        _ocrEngine?.Dispose()
        _codecs?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

DocumentManager.CreateDocument() / Pages.AddPage() / page.Recognize() / page.GetText() zinciri çözülebilir değildir. Her adım ayrı bir API çağrısıdır. page.GetText(-1) öncesinde page.Recognize(null) göz ardı edilir ve boş metin döner — bir sayfa eklenmesi otomatik olarak tanımayı tetiklemez.

IronOCR Yaklaşımı

Aynı karşılaştırma dosyasından eşdeğer IronOCR uygulaması, çekirdek işlem için bir satır ve sıfır yaşam döngüsü yönetimi:

using IronOcr;

public class OcrService
{
    public string ExtractText(string imagePath)
    {
        return new IronTesseract().Read(imagePath).Text;
    }
}
using IronOcr;

public class OcrService
{
    public string ExtractText(string imagePath)
    {
        return new IronTesseract().Read(imagePath).Text;
    }
}
Imports IronOcr

Public Class OcrService
    Public Function ExtractText(imagePath As String) As String
        Return New IronTesseract().Read(imagePath).Text
    End Function
End Class
$vbLabelText   $csharpLabel

Üretim kullanımı için, IronTesseract örneği çağrılar arasında yeniden kullanıldığında:

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

    public string ExtractText(string imagePath)
    {
        return _ocr.Read(imagePath).Text;
    }
}
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string imagePath)
    {
        return _ocr.Read(imagePath).Text;
    }
}
Imports IronTesseract

Public Class OcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractText(imagePath As String) As String
        Return _ocr.Read(imagePath).Text
    End Function
End Class
$vbLabelText   $csharpLabel

Hiçbir Startup(), Shutdown() yok, hiçbir codec katmanı yok, hiçbir belge konteyneri yok, hiçbir açık tanıma çağrısı yok. IronTesseract API referansı tam yüzey alanını gösterir. kurulum kılavuzu, üretim senaryoları için yapılandırma seçeneklerini kapsar.

PDF İşleme

PDF OCR, LEADTOOLS'un sayfa bazında rasterleştirme modelinin en belirgin olduğu yerdir. LEADTOOLS'un yerel PDF tanıma yolu yoktur — her bir PDF sayfası RasterCodecs aracılığıyla raster bir görüntü olarak yüklenmeli, sonra IOcrDocument eklenmeli, daha sonra ayrı ayrı tanınmalı, daha sonrasında metin ayrı ayrı çıkarılmalıdır.

LEADTOOLS Yaklaşımı

leadtools-pdf-processing.cs'dan, temel PDF iş akışı:

public string ExtractTextFromPdf(string pdfPath)
{
    var text = new StringBuilder();

    // Get page count first — separate call
    var pdfInfo = _codecs.GetInformation(pdfPath, true);
    int totalPages = pdfInfo.TotalPages;

    using var document = _ocrEngine.DocumentManager.CreateDocument();

    for (int pageNum = 1; pageNum <= totalPages; pageNum++)
    {
        // Load each page as a raster image — must dispose each
        using var pageImage = _codecs.Load(
            pdfPath,
            0,                            // bitsPerPixel
            CodecsLoadByteOrder.BgrOrGray,
            pageNum,                      // firstPage
            pageNum);                     // lastPage

        var page = document.Pages.AddPage(pageImage, null);
        page.Recognize(null);
        text.AppendLine(page.GetText(-1));
    }

    return text.ToString();
}
public string ExtractTextFromPdf(string pdfPath)
{
    var text = new StringBuilder();

    // Get page count first — separate call
    var pdfInfo = _codecs.GetInformation(pdfPath, true);
    int totalPages = pdfInfo.TotalPages;

    using var document = _ocrEngine.DocumentManager.CreateDocument();

    for (int pageNum = 1; pageNum <= totalPages; pageNum++)
    {
        // Load each page as a raster image — must dispose each
        using var pageImage = _codecs.Load(
            pdfPath,
            0,                            // bitsPerPixel
            CodecsLoadByteOrder.BgrOrGray,
            pageNum,                      // firstPage
            pageNum);                     // lastPage

        var page = document.Pages.AddPage(pageImage, null);
        page.Recognize(null);
        text.AppendLine(page.GetText(-1));
    }

    return text.ToString();
}
Imports System.Text

Public Function ExtractTextFromPdf(ByVal pdfPath As String) As String
    Dim text As New StringBuilder()

    ' Get page count first — separate call
    Dim pdfInfo = _codecs.GetInformation(pdfPath, True)
    Dim totalPages As Integer = pdfInfo.TotalPages

    Using document = _ocrEngine.DocumentManager.CreateDocument()

        For pageNum As Integer = 1 To totalPages
            ' Load each page as a raster image — must dispose each
            Using pageImage = _codecs.Load(pdfPath, 0, CodecsLoadByteOrder.BgrOrGray, pageNum, pageNum)
                Dim page = document.Pages.AddPage(pageImage, Nothing)
                page.Recognize(Nothing)
                text.AppendLine(page.GetText(-1))
            End Using
        Next
    End Using

    Return text.ToString()
End Function
$vbLabelText   $csharpLabel

Şifre korumalı bir PDF'nin işlenmesi başka bir bağımlılık ekler. leadtools-pdf-processing.cs'dan:

// Requires Leadtools.Pdf module — additional license
using Leadtools.Pdf;

public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
    var pdfFile = new PDFFile(pdfPath);
    pdfFile.Password = password;

    var loadOptions = new CodecsLoadOptions();
    _codecs.Options.Pdf.Load.Password = password;
    // ... same page iteration loop follows
}
// Requires Leadtools.Pdf module — additional license
using Leadtools.Pdf;

public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
    var pdfFile = new PDFFile(pdfPath);
    pdfFile.Password = password;

    var loadOptions = new CodecsLoadOptions();
    _codecs.Options.Pdf.Load.Password = password;
    // ... same page iteration loop follows
}
Imports Leadtools.Pdf

Public Function ExtractFromEncryptedPdf(ByVal pdfPath As String, ByVal password As String) As String
    Dim pdfFile As New PDFFile(pdfPath)
    pdfFile.Password = password

    Dim loadOptions As New CodecsLoadOptions()
    _codecs.Options.Pdf.Load.Password = password
    ' ... same page iteration loop follows
End Function
$vbLabelText   $csharpLabel

Leadtools.Pdf isim alanı ayrı bir modüldür. Geliştirme ekibi OCR modülünü satın aldıysa ancak PDF modülü yoksa, şifreli PDF desteği ek lisans satın alımı olmadan kullanılamaz.

Aranabilir bir PDF çıktısı oluşturmak, DocumentWriter yapılandırmayı kaydetmeden önce gerektirir:

// From leadtools-pdf-processing.cs
var pdfOptions = new PdfDocumentOptions
{
    DocumentType = PdfDocumentType.Pdf,
    ImageOverText = true,
    Linearized = false,
    Title = Path.GetFileNameWithoutExtension(inputPdfPath)
};

_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions);
document.Save(outputPdfPath, DocumentFormat.Pdf, null);
// From leadtools-pdf-processing.cs
var pdfOptions = new PdfDocumentOptions
{
    DocumentType = PdfDocumentType.Pdf,
    ImageOverText = true,
    Linearized = false,
    Title = Path.GetFileNameWithoutExtension(inputPdfPath)
};

_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions);
document.Save(outputPdfPath, DocumentFormat.Pdf, null);
Imports System.IO

Dim pdfOptions As New PdfDocumentOptions With {
    .DocumentType = PdfDocumentType.Pdf,
    .ImageOverText = True,
    .Linearized = False,
    .Title = Path.GetFileNameWithoutExtension(inputPdfPath)
}

_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions)
document.Save(outputPdfPath, DocumentFormat.Pdf, Nothing)
$vbLabelText   $csharpLabel

IronOCR Yaklaşımı

IronOCR PDF'leri yerel olarak ele alır. Aynı üç senaryo — temel PDF, şifre korumalı PDF ve aranabilir PDF çıktısı — her biri iki ila üç satıra indirir:

using IronOcr;

// Basic PDF — all pages, automatic handling
public string ExtractTextFromPdf(string pdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return new IronTesseract().Read(input).Text;
}

// Password-protected PDF — no additional module required
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
    using var input = new OcrInput();
    input.LoadPdf(pdfPath, Password: password);
    return new IronTesseract().Read(input).Text;
}

//Aranabilir PDF çıktısı— one method call
public void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
using IronOcr;

// Basic PDF — all pages, automatic handling
public string ExtractTextFromPdf(string pdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return new IronTesseract().Read(input).Text;
}

// Password-protected PDF — no additional module required
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
    using var input = new OcrInput();
    input.LoadPdf(pdfPath, Password: password);
    return new IronTesseract().Read(input).Text;
}

//Aranabilir PDF çıktısı— one method call
public void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
Imports IronOcr

' Basic PDF — all pages, automatic handling
Public Function ExtractTextFromPdf(pdfPath As String) As String
    Using input As New OcrInput()
        input.LoadPdf(pdfPath)
        Return New IronTesseract().Read(input).Text
    End Using
End Function

' Password-protected PDF — no additional module required
Public Function ExtractFromEncryptedPdf(pdfPath As String, password As String) As String
    Using input As New OcrInput()
        input.LoadPdf(pdfPath, Password:=password)
        Return New IronTesseract().Read(input).Text
    End Using
End Function

'Aranabilir PDF çıktısı— one method call
Public Sub CreateSearchablePdf(inputPdfPath As String, outputPdfPath As String)
    Using input As New OcrInput()
        input.LoadPdf(inputPdfPath)
        Dim result = New IronTesseract().Read(input)
        result.SaveAsSearchablePdf(outputPdfPath)
    End Using
End Sub
$vbLabelText   $csharpLabel

PDF giriş rehberi sayfa aralığı seçimini, akış girişini ve sayfa başına sonuç erişimini kapsar. aranabilir PDF örneği tam çıktı iş akışını gösterir. Tanıma öncesi düşük kaliteli taranmış PDF'ler için görüntü kalitesi düzeltme rehberine bakın.

Önişleme: El Komutları ve Yerleşik Filtreler

LEADTOOLS, ayrı bir Leadtools.ImageProcessing isim alanı üzerinden görüntü işleme komutları sağlar. Bu komutlar, görüntü OCR motoruna aktarılmadan önce her RasterImage örneğine ayrı ayrı uygulanmalıdır.

LEADTOOLS Yaklaşımı

leadtools-pdf-processing.cs'dan, bir PDF sayfasının ön işlenmesi:

using Leadtools.ImageProcessing;

public string ProcessLowQualityPdf(string pdfPath)
{
    var text = new StringBuilder();
    var pdfInfo = _codecs.GetInformation(pdfPath, true);

    using var document = _engine.DocumentManager.CreateDocument();

    for (int i = 1; i <= pdfInfo.TotalPages; i++)
    {
        using var pageImage = _codecs.Load(pdfPath, 0,
            CodecsLoadByteOrder.BgrOrGray, i, i);

        // Each command is a separate instantiation and Run() call
        var deskewCommand = new DeskewCommand();
        deskewCommand.Run(pageImage);

        var despeckleCommand = new DespeckleCommand();
        despeckleCommand.Run(pageImage);

        if (pageImage.BitsPerPixel > 8)
        {
            var grayscaleCommand = new GrayscaleCommand(8);
            grayscaleCommand.Run(pageImage);
        }

        var binarizeCommand = new AutoBinarizeCommand();
        binarizeCommand.Run(pageImage);

        var page = document.Pages.AddPage(pageImage, null);
        page.Recognize(null);
        text.AppendLine(page.GetText(-1));
    }

    return text.ToString();
}
using Leadtools.ImageProcessing;

public string ProcessLowQualityPdf(string pdfPath)
{
    var text = new StringBuilder();
    var pdfInfo = _codecs.GetInformation(pdfPath, true);

    using var document = _engine.DocumentManager.CreateDocument();

    for (int i = 1; i <= pdfInfo.TotalPages; i++)
    {
        using var pageImage = _codecs.Load(pdfPath, 0,
            CodecsLoadByteOrder.BgrOrGray, i, i);

        // Each command is a separate instantiation and Run() call
        var deskewCommand = new DeskewCommand();
        deskewCommand.Run(pageImage);

        var despeckleCommand = new DespeckleCommand();
        despeckleCommand.Run(pageImage);

        if (pageImage.BitsPerPixel > 8)
        {
            var grayscaleCommand = new GrayscaleCommand(8);
            grayscaleCommand.Run(pageImage);
        }

        var binarizeCommand = new AutoBinarizeCommand();
        binarizeCommand.Run(pageImage);

        var page = document.Pages.AddPage(pageImage, null);
        page.Recognize(null);
        text.AppendLine(page.GetText(-1));
    }

    return text.ToString();
}
Imports Leadtools.ImageProcessing
Imports System.Text

Public Function ProcessLowQualityPdf(pdfPath As String) As String
    Dim text As New StringBuilder()
    Dim pdfInfo = _codecs.GetInformation(pdfPath, True)

    Using document = _engine.DocumentManager.CreateDocument()
        For i As Integer = 1 To pdfInfo.TotalPages
            Using pageImage = _codecs.Load(pdfPath, 0, CodecsLoadByteOrder.BgrOrGray, i, i)
                ' Each command is a separate instantiation and Run() call
                Dim deskewCommand As New DeskewCommand()
                deskewCommand.Run(pageImage)

                Dim despeckleCommand As New DespeckleCommand()
                despeckleCommand.Run(pageImage)

                If pageImage.BitsPerPixel > 8 Then
                    Dim grayscaleCommand As New GrayscaleCommand(8)
                    grayscaleCommand.Run(pageImage)
                End If

                Dim binarizeCommand As New AutoBinarizeCommand()
                binarizeCommand.Run(pageImage)

                Dim page = document.Pages.AddPage(pageImage, Nothing)
                page.Recognize(Nothing)
                text.AppendLine(page.GetText(-1))
            End Using
        Next
    End Using

    Return text.ToString()
End Function
$vbLabelText   $csharpLabel

Her ön işleme adımı, bir komut sınıfı oluşturmayı ve görüntü üzerinde .Run() çağrısında bulunmayı gerektirir. Geliştirici, her dönüşümün sırasını ve uygulanabilirliğini yönetir. Eğer görüntü zaten ikili ise, AutoBinarizeCommand kalitenin düşmesine neden olabilir. Koşullu BitsPerPixel kontrolü geliştiricinin sorumluluğundadır.

IronOCR Yaklaşımı

IronOCR ön işlemesi, OcrInput nesnesine uygulanır ve tüm yüklenmiş sayfaları aynı anda etkiler:

using IronOcr;

public string ProcessLowQualityPdf(string pdfPath)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadPdf(pdfPath);

    // Applied to all pages
    input.Deskew();
    input.DeNoise();
    input.Binarize();
    input.Contrast();
    input.EnhanceResolution(300);

    var result = ocr.Read(input);
    Console.WriteLine($"Confidence: {result.Confidence}%");
    return result.Text;
}
using IronOcr;

public string ProcessLowQualityPdf(string pdfPath)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadPdf(pdfPath);

    // Applied to all pages
    input.Deskew();
    input.DeNoise();
    input.Binarize();
    input.Contrast();
    input.EnhanceResolution(300);

    var result = ocr.Read(input);
    Console.WriteLine($"Confidence: {result.Confidence}%");
    return result.Text;
}
Imports IronOcr

Public Function ProcessLowQualityPdf(pdfPath As String) As String
    Dim ocr = New IronTesseract()

    Using input As New OcrInput()
        input.LoadPdf(pdfPath)

        ' Applied to all pages
        input.Deskew()
        input.DeNoise()
        input.Binarize()
        input.Contrast()
        input.EnhanceResolution(300)

        Dim result = ocr.Read(input)
        Console.WriteLine($"Confidence: {result.Confidence}%")
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

Beş ön işleme adımı, tüm sayfalara eşit olarak uygulanır, sayfa başına döngü yoktur. IronOCR'un otomatik ön işleme özelliği, varsayılan olarak her Read() çağrısında çalışır, yaygın tarama sorunlarını hiçbir açık filtre çağrısı olmadan ele alır. görüntü filtreleri eğitimi tam filtre kataloğunu kapsar. düşük kaliteli tarama örneği, zor belgelerde önişleme öncesi ve sonrası gösterir.

API Eşleme Başvurusu

LEADTOOLS API IronOCR Karşılığı
RasterSupport.SetLicense(licPath, key) IronOcr.License.LicenseKey = "key"
RasterCodecs OcrInput
_codecs.Load(path) input.LoadImage(path) veya input.LoadPdf(path)
_codecs.GetInformation(path, true).TotalPages Otomatik — sayfa sayısı gerekli değil
OcrEngineManager.CreateEngine(OcrEngineType.LEAD) new IronTesseract()
engine.Startup(_codecs, null, null, runtimePath) Gerekli değil
engine.Shutdown() Gerekli değil
engine.DocumentManager.CreateDocument() Gerekli değil
document.Pages.AddPage(image, null) input.LoadImage(path)
page.Recognize(null) ocr.Read(input) (tanıma, Read'in bir parçasıdır)
page.GetText(-1) result.Text
page.RecognizeStatus result.Confidence
OcrZone ile Bounds = new LeadRect(x, y, w, h) new CropRectangle(x, y, w, h) input.LoadImage()'ya geçirildi
OcrZoneType.Text Varsayılan — tür belirtimi gerekmez
page.Zones.Add(zone) input.LoadImage(path, cropRect)
DeskewCommand().Run(image) input.Deskew()
DespeckleCommand().Run(image) input.DeNoise()
AutoBinarizeCommand().Run(image) input.Binarize()
PdfDocumentOptions { ImageOverText = true } result.SaveAsSearchablePdf() tarafından işlendi
_engine.DocumentWriterInstance.SetOptions(...) Gerekli değil
document.Save(path, DocumentFormat.Pdf, null) result.SaveAsSearchablePdf(path)
CodecsLoadByteOrder.BgrOrGray Gerekli değil — otomatik olarak ele alınır
_codecs.Options.Pdf.Load.Password = password input.LoadPdf(path, Password: password)

Takımların LEADTOOLS OCR'den IronOCR'ye Geçişi Düşünmesi

Görüntüleme Kiti Gerekeceğiz Sadece OCR Projesi

LEADTOOLS, bir ekibin entegre bir platformda döküman görüntüleyici, tıbbi görüntüleme, form tanıma ve OCR birlikte çalışmasına uygun olduğunda mali ve mimari anlamda mantıklıdır. Gereksinim, görüntülerden ve PDF'lerden metin çıkarımı olduğunda hesaplama değişir. LEADTOOLS lisans maliyetleri, teklifler için bir satış birlikteliği gerektirir — güncel fiyatlandırma için LEADTOOLS ile iletişime geçin. Yıllık bakım lisans maliyetine ek olarak gereklidir. Profesyonel seviyedeki $2,999'daki IronOCR, yenileme gerektirmeksizin 10 geliştiriciyi kapsar. LEADTOOLS yenileme döngüsünün sonuna gelmiş ve maliyeti yeniden değerlendiren ekipler, genellikle paketin yalnızca OCR modülünü kullandıklarını keşfederler.

Kapsayıcı ve Sunucusuz Dağıtımlar

LEADTOOLS'un dosya tabanlı lisanslaması, modern dağıtım mimarilerinde aktif bir sürtüşme noktası haline gelir.Dockerkonteyneri, görüntüye yerleştirilmiş — katman geçmişinde açığa çıkan — veya her düzenleme ortamında hacim eşgüdümüyle çalıştırıldığında monte edilmiş iki fiziksel lisans dosyasına ihtiyaç duyar. Azure İşlevleri ve AWS Lambda, lisans dosyası dağıtımı için belirgin bir mekanizma olmadan geçici çözümler gerektirir. LEADTOOLS, çalışma zamanlı dosyaları belleğe yükleyen ve sunucusuz işlevler için doğrudan kullanıcı deneyimini etkileyen 500–2000 ms ekleyen engelleyici bir motor başlatması da gerçekleştirir — sunucusuz işlevlerde gecikme doğrudan kullanıcı deneyimini etkiler. IronOCR, standart bir NuGet referansı olarak dağıtılır, bir çevre değişkeninden lisans anahtarı ayarlar ve temelde ilk kullanımda gecikmeli olarak başlatılır. Docker dağıtım kılavuzu ve AWS dağıtım kılavuzu ortak kapsayıcı senaryoları için ayrıntıları kapsar.

Yanlış Paket Sorunu

LEADTOOLS'un modül yapısı, IronOCR'nin sahip olmadığı bir sorun kategorisi yaratır: yanlış düzeyin satın alınması. OCR, her LEADTOOLS paketinde dahil değildir. Şifre korumalı PDF desteği, her OCR odaklı lisansın bir parçası olmayan ayrı bir PDF modülü gerektirir. Daha yüksek doğruluk motor seçeneği, LEADTOOLS satın alınmasının üzerine ayrı bir satıcı anlaşması gerektirir. Satın almanın ihtiyaç duydukları bir özelliği kapsadığını düşünen ekipler — ve üretimde çalışma zamanı sırasında aksiyle karşılaştıklarında — satışla özellik etkinleştirilmeden önce yeniden pazarlık sürecine girmelidirler.IronOCR lisansları, her düzeyde tüm özellikleri kapsar. Ayrı bir PDF modülü yok, şifreli belgeler için ek yok, daha yüksek doğruluk motoru için ikinci bir satıcı yok.

Bakım ve Kaynak Yönetimi Karmaşıklığı

LEADTOOLS'un motor yaşam döngüsü sadece bir kurulum seremonisi değildir — devam eden bir bakım yüzeyi oluşturur. Motor başlatılmalı, kullanılmalı, kapatılmalı ve ardından doğru sırada bertaraf edilmelidir; bu diziden sapma hatalar üretir. LEADTOOLS toplu işleme uygulamalarındaki bellek sızıntıları genellikle bertaraf edilmeyen ara görüntü nesnelerine, işleme sonrası açık bırakılan belge konteynerlerine veya uygun temizlik yapılmadan birden çok kez oluşturulmuş motor örneklerine izlenir. Üretim toplu işlemcileri genellikle belge parçaları arasında telafi mekanizması olarak zorunlu çöp toplama çağrılarını içerir — bu, altta yatan nesne modelinin çalışma zamanıyla mücadele ettiğine işaret eden bir kalıptır. Gece yarısı 2'de bir belge işleme hizmetindeki bellek büyümesini hata ayıklamış olan ekipler, genellikle kök nedeni LEADTOOLS bertaraf modelinde bulurlar.IronOCR standart .NET bertaraf kapsamlarını kullanır. Yalnızca giriş konteynerinin açıkça bertaraf edilmesi gerekir. Motorun kendisi durumsuz ve iş parçacığı güvenlidir.

Çoklu Ortam Dağıtım Tutarlılığı

Geliştirme, hazırlık ve üretim ortamlarının hepsi, konsistent yollarda LEADTOOLS lisans dosyalarına ve uygulamanın başlatma sırasında beklediği tam yolda çalışma zamanı dizinine ihtiyaç duyar. Ortamlar arasında bir tutarsızlık — bir hazırlık sunucusu, üretimden farklı bir sürücü harfi ile çalışma zamanı dizin yolu üretir — o ortama özgü bir hata üretir ve düzeltmek için bir kod veya yapılandırma değişikliği gerektirir.IronOCR lisans anahtarı ve tek NuGet paketi, tüm ortamlarda aynı şekilde davranır. Lisans anahtarı ortam-spesifik tek değerdir ve her .NET ekibinin zaten veritabanı bağlantı dizeleri ve API anahtarları için kullandığı aynı gizli yönetim kalıplarını izler.

Genel Geçiş Dikkat Edilmesi Gereken Hususlar

Motor Yaşam Döngüsü Kaldırma

LEADTOOLS kodu, yaşam döngüsünün yönetilmesi gerektiğinden, motoru IDisposable uygular bir hizmet sınıfının içinde sarar. Göç bu gereksinimi tamamen ortadan kaldırır:

// LEADTOOLS: Service class required for lifecycle management
public class LeadtoolsService : IDisposable
{
    private IOcrEngine _engine;
    private RasterCodecs _codecs;

    public LeadtoolsService()
    {
        RasterSupport.SetLicense(licPath, key);
        _codecs = new RasterCodecs();
        _engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
        _engine.Startup(_codecs, null, null, runtimePath);
    }

    public string Process(string path)
    {
        using var image = _codecs.Load(path);
        using var doc = _engine.DocumentManager.CreateDocument();
        var page = doc.Pages.AddPage(image, null);
        page.Recognize(null);
        return page.GetText(-1);
    }

    public void Dispose()
    {
        _engine?.Shutdown();
        _engine?.Dispose();
        _codecs?.Dispose();
    }
}

// IronOCR: No lifecycle to manage
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string Process(string path) => _ocr.Read(path).Text;
}
// LEADTOOLS: Service class required for lifecycle management
public class LeadtoolsService : IDisposable
{
    private IOcrEngine _engine;
    private RasterCodecs _codecs;

    public LeadtoolsService()
    {
        RasterSupport.SetLicense(licPath, key);
        _codecs = new RasterCodecs();
        _engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
        _engine.Startup(_codecs, null, null, runtimePath);
    }

    public string Process(string path)
    {
        using var image = _codecs.Load(path);
        using var doc = _engine.DocumentManager.CreateDocument();
        var page = doc.Pages.AddPage(image, null);
        page.Recognize(null);
        return page.GetText(-1);
    }

    public void Dispose()
    {
        _engine?.Shutdown();
        _engine?.Dispose();
        _codecs?.Dispose();
    }
}

// IronOCR: No lifecycle to manage
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string Process(string path) => _ocr.Read(path).Text;
}
Imports System
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Ocr
Imports IronOcr

' LEADTOOLS: Service class required for lifecycle management
Public Class LeadtoolsService
    Implements IDisposable

    Private _engine As IOcrEngine
    Private _codecs As RasterCodecs

    Public Sub New()
        RasterSupport.SetLicense(licPath, key)
        _codecs = New RasterCodecs()
        _engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)
        _engine.Startup(_codecs, Nothing, Nothing, runtimePath)
    End Sub

    Public Function Process(path As String) As String
        Using image = _codecs.Load(path)
            Using doc = _engine.DocumentManager.CreateDocument()
                Dim page = doc.Pages.AddPage(image, Nothing)
                page.Recognize(Nothing)
                Return page.GetText(-1)
            End Using
        End Using
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _engine?.Shutdown()
        _engine?.Dispose()
        _codecs?.Dispose()
    End Sub
End Class

' IronOCR: No lifecycle to manage
Public Class OcrService

    Private ReadOnly _ocr As New IronTesseract()

    Public Function Process(path As String) As String
        Return _ocr.Read(path).Text
    End Function
End Class
$vbLabelText   $csharpLabel

IronTesseract örneği thread-safe'tir ve singleton olarak paylaşılabilir. Motorun faydası için hizmet sınıfında IDisposable uygulamasına gerek yoktur.

Bölge Bazında OCR Göçü

LEADTOOLS bölge yapılandırması, LeadRect sınırları ile OcrZone kullanır ve özel olanlar eklenmeden önce otomatik tespit edilen bölgeleri temizlemeyi gerektirir. IronOCR, doğrudan LoadImage()'a gönderilen CropRectangle kullanır:

// LEADTOOLS zone setup
var zone = new OcrZone
{
    Bounds = new LeadRect(x, y, width, height),
    ZoneType = OcrZoneType.Text,
    CharacterFilters = OcrZoneCharacterFilters.None,
    RecognitionModule = OcrZoneRecognitionModule.Auto
};
page.Zones.Clear();  // Must clear auto-detected zones first
page.Zones.Add(zone);

//IronOCR equivalent
using var input = new OcrInput();
input.LoadImage(imagePath, new CropRectangle(x, y, width, height));
var text = new IronTesseract().Read(input).Text;
// LEADTOOLS zone setup
var zone = new OcrZone
{
    Bounds = new LeadRect(x, y, width, height),
    ZoneType = OcrZoneType.Text,
    CharacterFilters = OcrZoneCharacterFilters.None,
    RecognitionModule = OcrZoneRecognitionModule.Auto
};
page.Zones.Clear();  // Must clear auto-detected zones first
page.Zones.Add(zone);

//IronOCR equivalent
using var input = new OcrInput();
input.LoadImage(imagePath, new CropRectangle(x, y, width, height));
var text = new IronTesseract().Read(input).Text;
Imports Leadtools
Imports IronOcr

' LEADTOOLS zone setup
Dim zone As New OcrZone With {
    .Bounds = New LeadRect(x, y, width, height),
    .ZoneType = OcrZoneType.Text,
    .CharacterFilters = OcrZoneCharacterFilters.None,
    .RecognitionModule = OcrZoneRecognitionModule.Auto
}
page.Zones.Clear() ' Must clear auto-detected zones first
page.Zones.Add(zone)

' IronOCR equivalent
Using input As New OcrInput()
    input.LoadImage(imagePath, New CropRectangle(x, y, width, height))
    Dim text As String = New IronTesseract().Read(input).Text
End Using
$vbLabelText   $csharpLabel

bölge tabanlı OCR kılavuzu tek bölge ve çoklu bölge çıkarma kalıplarını kapsar. bölge kırpma örneği pratik bir kullanım alanı olarak fatura başlık çıkarımını gösterir.

NuGet Paketi Temizleme

LEADTOOLS birden çok paket gerektirir. Göç tümünü kaldırır ve tek bir tane ekler:

# Remove LEADTOOLS packages
dotnet remove package Leadtools
dotnet remove package Leadtools.Ocr
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Pdf

# Add IronOCR
dotnet add package IronOcr
# Remove LEADTOOLS packages
dotnet remove package Leadtools
dotnet remove package Leadtools.Ocr
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Pdf

# Add IronOCR
dotnet add package IronOcr
SHELL

Dağıtım ayak izi azaltımı önemlidir. Bina çıktısından gitti: LEADTOOLS.LIC, LEADTOOLS.LIC.KEY, OcrRuntime/ dizini, birden fazla LEADTOOLS DLL'leri ve Tesseract motoru seçeneğinden herhangi bir tessdata/ klasörü. Kalan tek paket referansıdır. IronOCR NuGet paketi tüm yerel bağımlılıkları içerir.

Güven Skoru Erişimi

LEADTOOLS tanıma kalitesini bir enum olarak (OcrPageRecognizeStatus.Done tamamlama gösterir, ancak doğruluk seviyesini değil) page.RecognizeStatus üzerinden açığa çıkarır. IronOCR, doğrudan yüzde oranı result.Confidence sağlar:

var result = new IronTesseract().Read("document.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");

// Branch on quality threshold
if (result.Confidence < 60)
{
    // Apply additional preprocessing and retry
    using var input = new OcrInput();
    input.LoadImage("document.jpg");
    input.Deskew();
    input.DeNoise();
    input.EnhanceResolution(300);
    result = new IronTesseract().Read(input);
}
var result = new IronTesseract().Read("document.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");

// Branch on quality threshold
if (result.Confidence < 60)
{
    // Apply additional preprocessing and retry
    using var input = new OcrInput();
    input.LoadImage("document.jpg");
    input.Deskew();
    input.DeNoise();
    input.EnhanceResolution(300);
    result = new IronTesseract().Read(input);
}
Imports System
Imports IronOcr

Dim result = New IronTesseract().Read("document.jpg")
Console.WriteLine($"Confidence: {result.Confidence}%")

' Branch on quality threshold
If result.Confidence < 60 Then
    ' Apply additional preprocessing and retry
    Using input As New OcrInput()
        input.LoadImage("document.jpg")
        input.Deskew()
        input.DeNoise()
        input.EnhanceResolution(300)
        result = New IronTesseract().Read(input)
    End Using
End If
$vbLabelText   $csharpLabel

güven skorları kılavuzu eşik seçimini ve kalite tabanlı yeniden deneme kalıplarını kapsar.

Ek IronOCR Yetenekleri

Yukarıda kapsanan karşılaştırma noktalarının ötesinde, IronOCR, LEADTOOLS OCR'de olmayan veya ek modül satın alımları gerektiren özellikler de içerir:

  • OCR sırasında barkod okuma: ocr.Configuration.ReadBarCodes = true ayarlayın ve barkodlar tek bir Read() geçişinde metinle birlikte çıkarılır. Ayrı LEADTOOLS Barkod modülü lisansı gerekmez. barkod okuma kılavuzuna ve barkod OCR örneğine bakın.
  • Yapılandırılmış veri çıkarma: result.Pages, result.Paragraphs, result.Lines, result.Words ve result.Characters, tüm belge hiyerarşisini sınır kutuları ve her eleman için güven skorları ile birlikte açığa çıkarır. okuma sonuçları kılavuzu tam çıktı modelini kapsar.
  • hOCR dışa aktarımı: result.SaveAsHocrFile(), ek yerleşim analizi için yerleşik konum verisi ile HTML üretir. hOCR dışa aktarım kılavuzuna bakın.
  • 125+ dil desteği: Her dil bir NuGet paketidir. tessdata dizini yok, dosya yolu yapılandırması yok. tam dil endeksine ve birçok dil kılavuzuna bakın.
  • Async OCR: await ocr.ReadAsync(input), ASP.NET ve arka plan hizmetleri için engellemeyen belge işleme. asenkron OCR kılavuzuna bakın.
  • Özel belge tanıma: Pasaportlar, plaka levhaları, MICR çekleri ve el yazısı için yerleşik destek. özel özellikler sayfasına bakın.
  • İlerleme izleme: ocr.Configuration.ProgressCallback uzun süreli toplu işlerde sayfa başına ilerlemeyi rapor eder. ilerleme takip kılavuzuna bakın.

.NET Uyumluluğu ve Geleceğe Hazırlık

IronOCR, .NET 6, .NET 7, .NET 8, .NET 9 ve .NET Standard 2.0'ı hedef alır - sonuncusu .NET Framework 4.6.2 ve daha sonraki sürümleri kapsar. Çapraz platform desteği, tüm yerel bağımlılıkları NuGet paketine dahil olan Windows (x86 ve x64),Linuxx64, macOS, Azure App Service, AWS Lambda ve Docker'ı kapsar. Platforma özgü herhangi bir yapılandırma gerekli değildir; paket, çalışma zamanında doğru yerel ikili dosyayı seçer. LEADTOOLS, platformlar arası .NET dağıtımını destekler ancak her hedef ortam için platforma özgü çalışma zamanı dosyaları ve ilgili yol yapılandırması gerektirir.Linuxkonteynerleri veya macOS geliştirme makinelerini Windows üretim sunucularıyla hedefleyen ekipler için, IronOCR'un tek paket dağıtımı, platforma özgü yapılandırma katmanını ortadan kaldırarak işleri kolaylaştırır.

Sonuç

LEADTOOLS OCR, 35 yıllık geliştirme geçmişine sahip kapsamlı bir görüntüleme platformu içinde olgun bir teknolojidir. Zaten LEADTOOLS'ü belge görüntüleyiciler, tıbbi görüntüleme veya form tanıma için standart hale getirmiş kuruluşlar için, bu mevcut yatırıma OCR eklemek mantıklı bir karardır - entegrasyon maliyeti zaten ödenmiş ve birleştirilmiş API yüzeyi değer taşır.

Gereksinim resimlerden ve PDF'lerden metin çıkarmak olduğunda hesaplama farklıdır. LEADTOOLS'un dört aşamalı başlatma dizisi, dosya tabanlı lisans dağıtımı, ayrı codec katmanı ve açık motor yaşam döngüsü, OCR doğruluğu veya yeteneğini sağlayan karmaşıklıklar değildir. Bunlar, ekipteki her geliştiricinin anlaması gereken, her dağıtım ortamının uyum sağlaması gereken ve her CI/CD hattının taşımak zorunda olduğu altyapı maliyetleridir. Yanlış paket alımı - PDF modülü olmadan OCR modülü veya LEAD motoru olmadan OmniPage doğruluk katmanı - satın alma yerine üretimde sessiz başarısızlıklarla sonuçlanır.

IronOCR'un tek NuGet paketi, dizi tabanlı lisanslaması ve tek satırlık tanıma yolu, üretim OCR için önemli olan yeteneklerden ödün vermeden bu maliyeti ortadan kaldırır: otomatik ön işleme, yerel PDF desteği, parola korumalı belge işleme, yapılandırılmış çıktı çıkarma, 125+ dil desteği ve iş parçacığı güvenli paralel işleme. Fiyat farkı — süresiz $2,999 ve LEADTOOLS'un çok yıllı lisanslama ve bakım ücretleri — önemli. Bu, tek seferlik bir mühendislik aracı satın alımı ile yıllık bütçe gerekçesi gerektiren sürekli bir abonelik arasındaki farktır.

Açılış problemi — her üretim makinesinde lisans dosyaları, paket karmaşası ve bir karakter okunmadan önce bir başlatma töreni — gerçek dağıtım ve operasyonel maliyetleri yansıtır. Her iki seçeneği değerlendiren ekipler, LEADTOOLS başlatma dizisini konteyner stratejilerine, CI/CD hatlarına ve gizli yönetim yaklaşımlarına karşı test etmelidir. Cevap genellikle kararı netleştirir.

Lütfen dikkate alınKofax OmniPage, LEADTOOLS ve Tesseract, ilgili sahiplerinin tescilli markalarıdır. Bu site, Apryse, Google, Kofax veya LEAD Technologies 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

LEADTOOLS OCR nedir?

LEADTOOLS OCR, geliştiriciler ve işletmeler tarafından görüntülerden ve belgelerden metin çıkarmak için kullanılan bir OCR çözümüdür. .NET uygulama geliştirme için IronOCR ile birlikte değerlendirilen birkaç OCR seçeneğinden biridir.

.NET geliştiricileri için IronOCR, LEADTOOLS OCR ile nasıl karşılaştırılır?

IronOCR, IronTesseract'ı temel motoru olarak kullanan bir NuGet yerli .NET OCR kütüphanesidir. LEADTOOLS OCR'ye kıyasla, daha basit bir dağıtım (herhangi bir SDK yükleyici yok), sabit fiyatlandırma ve COM ara yüzde ya da bulut bağımlılıkları olmadan temiz bir C# API sunar.

IronOCR, LEADTOOLS OCR'den daha mı kolay kurulabilir?

IronOCR, tek bir NuGet paketi aracılığıyla yüklenir. SDK kurulumları, kopyalamak için lisans dosyaları, kaydedilecek COM bileşenleri veya yönetilecek ayrı çalışma zamanı ikili dosyaları yoktur. Tüm OCR motoru paket içinde yer alır.

LEADTOOLS OCR ile IronOCR arasında hangi doğruluk farkları vardır?

IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranmış formlar için yüksek tanıma doğruluğu sağlar. Çok kötü durumda olan belgeler ya da nadir yazılar için ise doğruluk, kaynak kalitesine göre değişiklik gösterebilir. IronOCR, düşük kaliteli girişlerde tanımayı geliştirmek için görüntü ön işleme filtreleri içerir.

IronOCR, PDF metin çıkarma desteği sunuyor mu?

Evet. IronOCR, tek bir çağrıda hem yerel PDF'lerden hem de taranmış PDF görüntülerinden metin çıkarır. Çok sayfalı TIFF dosyaları, görüntüler ve akıntılar da desteklenir. Taranmış PDF'ler için, OCR sayfa bazında uygulanır ve her sayfa için sonuç nesneleri sağlanır.

LEADTOOLS OCR lisanslaması ile IronOCR'yi nasıl karşılaştırılır?

IronOCR, sayfa veya tarama başına ücret içermeyen sabit oranlı bir süresiz lisans kullanır. Yüksek belge hacmi işleyen kuruluşlar, hacme rağmen aynı lisans maliyetini öder. Ayrıntılar ve hacim fiyatlandırması IronOCR lisans sayfasında mevcuttur.

IronOCR hangi dilleri destekliyor?

IronOCR, ayrı NuGet dil paketleri aracılığıyla 127 dili destekler. Bir dil eklemek için tek bir 'dotnet add package IronOcr.Languages.{Language}' komutu gerekir. Manuel dosya yerleştirme veya yol yapılandırması gerekmez.

.NET projesine IronOCR'yi nasıl kurarım?

NuGet üzerinden kurun: 'Install-Package IronOcr' Package Manager Console'da veya 'dotnet add package IronOcr' CLI'de. Ek dil paketleri aynı şekilde yüklenir. Yerel SDK kurucusu gerekmez.

IronOCR, LEADTOOLS OCR'den farklı olarak Docker ve konteynerize dağıtımlar için uygun mu?

Evet. IronOCR, NuGet paketi aracılığıyla Docker konteynerlerinde çalışır. Lisans anahtarı, bir ortam değişkeni aracılığıyla ayarlanır. Lisans dosyaları, SDK yolları veya OCR motoru için hacimlerin bağlanmasına gerek yoktur.

LEADTOOLS OCR karşısında IronOCR'yi satın almadan önce deneyebilir miyim?

Evet. IronOCR deneme modu, belgeleri işler ve çıkış üzerine bir filigran eklemeli OCR sonuçları döndürür. Lisans satın almadan önce kendi belgeleriniz üzerinde doğruluğu kontrol edebilirsiniz.

IronOCR, metin çıkarma yanında barkod okuma desteği sunar mı?

IronOCR, metin çıkarma ve OCR'ye odaklanır. Barkod okuma için Iron Software, eşlik eden bir kütüphane olan IronBarcode'u sağlar. Her ikisi de ayrı ayrı veya Iron Suite paketi olarak mevcuttur.

LEADTOOLS OCR'den IronOCR'ye geçiş yapmak kolay mı?

LEADTOOLS OCR'den IronOCR'ye geçiş genellikle başlangıç dizilerini IronTesseract oluşturma ile değiştirmeyi, COM yaşam döngüsü yönetimini kaldırmayı ve API çağrılarını güncellemeyi içerir. Çoğu geçişler, kod karmaşıklığını önemli ölçüde azaltır.

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