Altbilgi içeriğine atla
VIDEOLAR

Charlesw Tesseract'dan IronOCR'a Geçiş

Bu kılavuz, .NET geliştiricilerini charlesw/tesseract NuGet paketinden (Tesseract) IronOCR'ye geçiş konusunda yönlendirir. Geçiş, belirli bir soruna odaklanır: charlesw sarmalayıcısının zorladığı yerel ikili dağıtım modeli ve bu modelin geliştiricilerin yazmak zorunda olduğu platforma bağlı koşullu kod. CI'da DllNotFoundException ile mücadele eden, Linux'ta Leptonica kütüphane yollarıyla uğraşan veya OCR ile ilgisi olmayan işletim sistemi tespit blokları yazan ekipler, geçiş yaptıktan sonra neyin tamamen ortadan kalktığını bu kılavuzda bulacaktır.

Charlesw Tesseract'tan Neden Geçiş Yapılır?

Arşivlenen charlesw/tesseract paketi, API kötü olduğu için değil, gerektirdiği dağıtım modeli modern .NET altyapısında geçerli olmayan varsayımlar üzerine kurulu olduğu için yeni projeleri sıkıntıya sokar. İşte geçiş kararlarını yönlendiren şey:

Her Platform İçin Yerel İkili Dağıtım. Tesseract NuGet paketi, platforma özgü yerel ikili dosyalar gönderir: Windows x64 için tesseract50.dll, x86 için ayrı bir yapı, Linux x64 için libtesseract.so. Bu ikili dosyalar, P/Invoke çağrılarının başarılı olması için çalışma zamanında doğru konumda olmalıdır. Geliştirici çalışma istasyonunda SDK, bunları otomatik olarak kopyalar. Bir Docker konteynerinde, bir ARM64 yapı aracısında veya standart olmayan bir uygulama kökü olan bir Azure Uygulama Servisinde bu gerçekleşmez. Her yeni dağıtım hedefi bir hata ayıklama oturumu haline gelir.

Gizli Bağımlılık Olarak Leptonica. Tesseract'ın görüntü yüklemesi, Tesseract binarylerinin yanı sıra kendi yerel DLL seti olarak gönderilen Leptonica kütüphanesi tarafından yönetilir. Windows'ta leptonica-1.82.0.dll, çıktı dizininde bulunmalıdır. Linux'ta, Leptonica paylaşılan kütüphanesi ya pakete eklenmelidir ya da sistem paketi olarak kurulmalıdır. libleptonica-dev olmadan Debian tabanlı Docker görüntüleri, Pix.LoadFromFile() ile yararsız bir yerel istisna verir ve bunu düzeltmek için bağımlılığı çözecek sistem paketini bilmek gerekir.

Uygulama Mantığında Platforma Bağlı Koşullu Kod. Yerel ikili yükleme ve tessdata yol çözümü birleşimi geliştiricileri, hedefe göre değişen RuntimeInformation.IsOSPlatform() denetimleri, kapsayıcı bağlamları için ortam değişkeni algılama ve yol oluşturma mantığı yazmaya zorlar. Bu kodun hiçbiri OCR mantığı değildir. Paketin binary yönetimi eksik olduğu için var olan bir dağıtım tesisatıdır.

Düzeltme Yolu Olmayan Arşivlenmiş Paket. Depo 2021'den beri arşivlenmiştir. Bir Linux ana bilgisayarındaki bir sistem paketi güncellemesi Leptonica ABI'sini değiştirdiğinde veya yeni bir .NET çalışma zamanı yerel binary yükleme davranışını değiştirdiğinde, güncellenecek bir sürüm yoktur. Tek seçenekler, yerel yapı hattını çatallaştırmak veya kütüphaneyi değiştirmektir.

Tesseract 4.1.1 Motoru Donmuş. Paket, Tesseract 4.1.1'i sarmalar. Tesseract 5'in yeniden yazılmış LSTM modeli, bozulmuş belgeler üzerinde anlamlı olarak daha yüksek doğruluk sağlar. Bu yükseltme, charlesw paketi üzerinden mevcut değildir - kütüphaneleri değiştirmeyi gerektirir.

Standart Bir Model Olmadan Güven İşleme. charlesw sarmalayıcı page.GetMeanConfidence()'yi 0 ile 1 arasında bir kayan nokta olarak ortaya çıkarır, ancak kelime veya karakter düzeyinde güven eşiklerini uygulamak iter.GetConfidence(PageIteratorLevel.Word) ile yineleyici modelini gerektirir. Standart filtreleme API yok; her ekip, kendi eşik mantığını farklı şekilde uygular.

Temel Sorun

Charlesw sargısı, OCR çalıştırılmadan önce platforma özgü yerel binary yapılandırmasını gerektirir:

// charlesw Tesseract: OS detection required just to find native DLLs
// DllNotFoundException on any platform where binaries do not resolve
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    Environment.SetEnvironmentVariable("LD_LIBRARY_PATH", "/app/lib");
}
var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath); // Requires leptonica native DLL
using var page = engine.Process(img);
return page.GetText();
// charlesw Tesseract: OS detection required just to find native DLLs
// DllNotFoundException on any platform where binaries do not resolve
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    Environment.SetEnvironmentVariable("LD_LIBRARY_PATH", "/app/lib");
}
var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath); // Requires leptonica native DLL
using var page = engine.Process(img);
return page.GetText();
Imports System
Imports System.Runtime.InteropServices
Imports Tesseract

' charlesw Tesseract: OS detection required just to find native DLLs
' DllNotFoundException on any platform where binaries do not resolve
If RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then
    Environment.SetEnvironmentVariable("LD_LIBRARY_PATH", "/app/lib")
End If

Dim engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
Using img As Pix = Pix.LoadFromFile(imagePath) ' Requires leptonica native DLL
    Using page As Page = engine.Process(img)
        Return page.GetText()
    End Using
End Using
$vbLabelText   $csharpLabel

IronOCR, hiçbir yerel binary yapılandırması gerektirmez:

// IronOCR: no path management, no OS detection, no leptonica dependency
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
// IronOCR: no path management, no OS detection, no leptonica dependency
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
' IronOCR: no path management, no OS detection, no leptonica dependency
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

IronOCR ve Charlesw Tesseract: Özellik Karşılaştırması

Aşağıdaki tablo, bu geçişi değerlendiren ekipler için ilgili yetenekleri kapsar:

Özellik Charlesw Tesseract IronOCR
Bakım Durumu Arşivlenmiş (2021'den beri güncelleme yok) Aktif olarak sürdürülüyor
Tesseract motoru sürümü 4.1.1 (donmuş) 5 (güncel, optimize edilmiş)
Lisans Apache 2.0 (ücretsiz) Ticari ($999–$2,999 süresiz)
NuGet kurulumu Tesseract IronOcr
Yerel İkili Yönetimi Manuel her platform için DLL dağıtımı Paketlenmiş, sıfır yapılandırma
Leptonica bağımlılığı Gerektirir leptonica-1.82.0.dll / libleptonica-dev Geçerli değil (içeride yönetilir)
Tessdata Yönetimi Manuel indirme ve .csproj kopya girişi NuGet dil paketleri
Platforma özgü koşullu kod Çok hedefli dağıtım için gerekli Gerekli değil
Docker dağıtımı Açık tessdata COPY + Leptonica apt-get gerektirir Standart .NET konteyner gereksinimleri sadece
ARM64 desteği Arşiv sonrası doğrulanmamış Paketli, doğrulanmış
Görüntü girdi formatları TIFF, PNG, BMP, JPG (Leptonica aracılığıyla) JPG, PNG, BMP, TIFF, GIF ve daha fazlası
Çok sayfalı TIFF Manuel çerçeve yinelemesi input.LoadImageFrames()
Yerel PDF girişi Hayır (ikincil kütüphane gerektirir) Evet
Aranabilir PDF çıktısı Hayır Evet (result.SaveAsSearchablePdf())
Yerleşik ön işleme None Deskew, DeNoise, Kontrast, Binarizasyon, Keskinleştirme, Ölçekleme, Geliştirme, Erod, Ters Çevir
Güvence filtreleme API Manuel yineleyici GetConfidence() ile result.Confidence, word.Confidence
Yapılandırılmış sonuçlar Yineleyici örüntü (ResultIterator) Doğrudan koleksiyonlar (Sayfalar, Paragraflar, Satırlar, Kelimeler)
Barkod okuma Hayır Evet (OCR geçişi sırasında)
Bölge tabanlı OCR Hayır Evet (CropRectangle)
Thread güvenliği Çağıranın sorumluluğu Yerleşik
125+ dil paketleri Manuel tessdata indirmeleri dotnet add package IronOcr.Languages.*
Çapraz platform .NET Evet (.NET Standard 2.0) Evet (.NET Framework 4.6.2+, .NET 5/6/7/8/9)
Güvenlik yaması ritmi Yok (arşivlenmiş) Düzenli sürümler

Hızlı Başlangıç: Charlesw Tesseract'tan IronOCR Geçişi

Adım 1: NuGet Paketini Değiştirin

Charlesw Tesseract paketini kaldırın:

dotnet remove package Tesseract
dotnet remove package Tesseract
SHELL

NuGet kullanarak IronOCR'u yükleyin:

dotnet add package IronOcr

Adım 2: Ad Alanlarını Güncelleyin

// Before (charlesw Tesseract)
using Tesseract;

// After (IronOCR)
using IronOcr;
// Before (charlesw Tesseract)
using Tesseract;

// After (IronOCR)
using IronOcr;
Imports IronOcr
$vbLabelText   $csharpLabel

Adım 3: Lisansa İzin Verin

Uygulama başlangıcında, herhangi bir OCR işleminden önce bu çağrıyı bir kez ekleyin:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ücretsiz deneme lisansı, IronOCR lisanslama sayfasında mevcuttur. Deneme, çıktıyı filigrandan çıkarır ve tam API erişimi sağlar.

Kod Göç Örnekleri

Yerel Binary Yol Yapılandırmasının Kaldırılması

Charlesw/tesseract projelerindeki en yaygın başlatma deseni, tessdata yolunu oluşturan ve yerel kütüphane yüklemesini her ortam için yapılandıran bir fabrika veya yardımcı sınıftır. Bu kod, yalnızca sargının dağıtım modeli nedeniyle vardır.

Charlesw Tesseract Yaklaşımı:

// A realistic factory found in production charlesw/Tesseract projects
public static class OcrEngineFactory
{
    private static string GetTessDataPath()
    {
        // Different path per environment — all wrong until explicitly configured
        if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true")
            return "/app/tessdata";                                    // Docker
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            return Path.Combine(AppContext.BaseDirectory, "tessdata"); // Linux bare metal
        if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            return "/usr/local/share/tessdata";                        // macOS Homebrew install
        return @".\tessdata";                                          // Windows dev machine
    }

    public static TesseractEngine Create(string language = "eng")
    {
        // If leptonica-1.82.0.dll is not in output directory: DllNotFoundException at this line
        // If tessdata folder is missing: TesseractException at engine construction
        return new TesseractEngine(GetTessDataPath(), language, EngineMode.Default);
    }
}

// Call site
using var engine = OcrEngineFactory.Create();
using var img = Pix.LoadFromFile("invoice.jpg");
using var page = engine.Process(img);
Console.WriteLine(page.GetText());
// A realistic factory found in production charlesw/Tesseract projects
public static class OcrEngineFactory
{
    private static string GetTessDataPath()
    {
        // Different path per environment — all wrong until explicitly configured
        if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true")
            return "/app/tessdata";                                    // Docker
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            return Path.Combine(AppContext.BaseDirectory, "tessdata"); // Linux bare metal
        if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            return "/usr/local/share/tessdata";                        // macOS Homebrew install
        return @".\tessdata";                                          // Windows dev machine
    }

    public static TesseractEngine Create(string language = "eng")
    {
        // If leptonica-1.82.0.dll is not in output directory: DllNotFoundException at this line
        // If tessdata folder is missing: TesseractException at engine construction
        return new TesseractEngine(GetTessDataPath(), language, EngineMode.Default);
    }
}

// Call site
using var engine = OcrEngineFactory.Create();
using var img = Pix.LoadFromFile("invoice.jpg");
using var page = engine.Process(img);
Console.WriteLine(page.GetText());
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Tesseract

Public Module OcrEngineFactory
    Private Function GetTessDataPath() As String
        ' Different path per environment — all wrong until explicitly configured
        If Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") = "true" Then
            Return "/app/tessdata"                                    ' Docker
        End If
        If RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then
            Return Path.Combine(AppContext.BaseDirectory, "tessdata") ' Linux bare metal
        End If
        If RuntimeInformation.IsOSPlatform(OSPlatform.OSX) Then
            Return "/usr/local/share/tessdata"                        ' macOS Homebrew install
        End If
        Return ".\tessdata"                                           ' Windows dev machine
    End Function

    Public Function Create(Optional language As String = "eng") As TesseractEngine
        ' If leptonica-1.82.0.dll is not in output directory: DllNotFoundException at this line
        ' If tessdata folder is missing: TesseractException at engine construction
        Return New TesseractEngine(GetTessDataPath(), language, EngineMode.Default)
    End Function
End Module

' Call site
Using engine As TesseractEngine = OcrEngineFactory.Create()
    Using img As Pix = Pix.LoadFromFile("invoice.jpg")
        Using page As Page = engine.Process(img)
            Console.WriteLine(page.GetText())
        End Using
    End Using
End Using
$vbLabelText   $csharpLabel

IronOCR Yaklaşımı:

// IronOCR: no factory, no path logic, no OS detection
// Runs identically on Windows, Linux, macOS, and ARM64
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var result = new IronTesseract().Read("invoice.jpg");
Console.WriteLine(result.Text);
// IronOCR: no factory, no path logic, no OS detection
// Runs identically on Windows, Linux, macOS, and ARM64
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var result = new IronTesseract().Read("invoice.jpg");
Console.WriteLine(result.Text);
' IronOCR: no factory, no path logic, no OS detection
' Runs identically on Windows, Linux, macOS, and ARM64
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim result = New IronTesseract().Read("invoice.jpg")
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

Tüm OcrEngineFactory sınıfı silinir. Bununla birlikte, platforma bağımlı yol mantığı, DOTNET_RUNNING_IN_CONTAINER kontrolü ve Leptonica DLL bağımlılığı tamamen ortadan kalkar. Her ortam - geliştirici çalışma istasyonu, CI aracısı, Docker konteyneri, bulut VM - aynı iki satırı çalıştırır. IronTesseract kurulum kılavuzu varsayılanların ayarlama gerektirdiği durumda yapılandırma seçeneklerini kapsar, ancak çoğu dağıtım için hiçbirine ihtiyaç duyulmaz.

Leptonica Görüntü Dönüşümü Değiştirme

Charlesw sarmalayıcı, görüntü temsili olarak Leptonica'nın Pix türünü kullanır. OCR'dan önce görüntüleri işleyen herhangi bir kod, Leptonica yerel DLL'sinin yüklü ve çalışır durumda olmasını gerektiren Pix üzerinden dönüştürülecek. Bu örüntüyü OcrInput ile değiştirmek, Leptonica bağımlılığını tamamen ortadan kaldırır.

Charlesw Tesseract Yaklaşımı:

// Pix is Leptonica's image type — requires leptonica native DLL
// Converting from System.Drawing.Bitmap requires a temp file round-trip
public string ProcessInMemoryImage(Bitmap bitmap)
{
    //Hayırdirect Bitmap → Pix conversion; must write to temp file
    var tempPath = Path.Combine(Path.GetTempPath(), $"ocr_{Guid.NewGuid()}.png");
    try
    {
        bitmap.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png);

        using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
        using var pix = Pix.LoadFromFile(tempPath);   // Leptonica file I/O
        using var page = engine.Process(pix);

        return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
// Pix is Leptonica's image type — requires leptonica native DLL
// Converting from System.Drawing.Bitmap requires a temp file round-trip
public string ProcessInMemoryImage(Bitmap bitmap)
{
    //Hayırdirect Bitmap → Pix conversion; must write to temp file
    var tempPath = Path.Combine(Path.GetTempPath(), $"ocr_{Guid.NewGuid()}.png");
    try
    {
        bitmap.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png);

        using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
        using var pix = Pix.LoadFromFile(tempPath);   // Leptonica file I/O
        using var page = engine.Process(pix);

        return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
Imports System
Imports System.Drawing
Imports System.IO
Imports Tesseract

Public Class ImageProcessor
    ' Pix is Leptonica's image type — requires leptonica native DLL
    ' Converting from System.Drawing.Bitmap requires a temp file round-trip
    Public Function ProcessInMemoryImage(bitmap As Bitmap) As String
        ' No direct Bitmap → Pix conversion; must write to temp file
        Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"ocr_{Guid.NewGuid()}.png")
        Try
            bitmap.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png)

            Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
                Using pix As Pix = Pix.LoadFromFile(tempPath) ' Leptonica file I/O
                    Using page As Page = engine.Process(pix)
                        Return page.GetText()
                    End Using
                End Using
            End Using
        Finally
            If File.Exists(tempPath) Then File.Delete(tempPath)
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

IronOCR Yaklaşımı:

// OcrInput accepts byte arrays and streams — no temp file, no Leptonica
public string ProcessInMemoryImage(byte[] imageBytes)
{
    using var input = new OcrInput();
    input.LoadImage(imageBytes);   // Direct byte array loading

    var result = new IronTesseract().Read(input);
    return result.Text;
}

// Or from a stream — same pattern
public string ProcessFromStream(Stream imageStream)
{
    using var input = new OcrInput();
    input.LoadImage(imageStream);

    var result = new IronTesseract().Read(input);
    return result.Text;
}
// OcrInput accepts byte arrays and streams — no temp file, no Leptonica
public string ProcessInMemoryImage(byte[] imageBytes)
{
    using var input = new OcrInput();
    input.LoadImage(imageBytes);   // Direct byte array loading

    var result = new IronTesseract().Read(input);
    return result.Text;
}

// Or from a stream — same pattern
public string ProcessFromStream(Stream imageStream)
{
    using var input = new OcrInput();
    input.LoadImage(imageStream);

    var result = new IronTesseract().Read(input);
    return result.Text;
}
Imports System.IO

' OcrInput accepts byte arrays and streams — no temp file, no Leptonica
Public Function ProcessInMemoryImage(imageBytes As Byte()) As String
    Using input As New OcrInput()
        input.LoadImage(imageBytes)   ' Direct byte array loading

        Dim result = New IronTesseract().Read(input)
        Return result.Text
    End Using
End Function

' Or from a stream — same pattern
Public Function ProcessFromStream(imageStream As Stream) As String
    Using input As New OcrInput()
        input.LoadImage(imageStream)

        Dim result = New IronTesseract().Read(input)
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

Geçici dosya gidiş-dönüşü ortadan kalkar. Diskte hiçbir dosya yazılmaz, dönüştürme için Leptonica DLL'si çağrılmaz ve temizlenecek bir finally bloğu yoktur. görüntü giriş kılavuzu ve akış giriş kılavuzu, URL'lerden ve belleğe eşlenmiş dosyalardan yüklemeyi içeren tüm desteklenen giriş kaynaklarını belgelemektedir.

Güvence Eşiği Filtreleme

Charlesw sarmalayıcı iki seviyede güven sunar: tüm sayfa için page.GetMeanConfidence() ve bireysel kelimeler için iter.GetConfidence(PageIteratorLevel.Word). Düşük güvence kelimelerini çıktının dışına filtrelemek, bir yineleyici döngüsünü manuel olarak yönetmeyi gerektirir. IronOCR, sonucu nesnelerde doğrudan güvence açığa çıkarır, böylece eşik mantığı bir LINQ ifadesi olur.

Charlesw Tesseract Yaklaşımı:

// Word-level confidence filtering requires iterator boilerplate
public List<string> ExtractHighConfidenceWords(string imagePath, float minConfidence = 0.8f)
{
    var highConfidenceWords = new List<string>();

    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    // Page-level confidence only: fine-grained requires the iterator
    Console.WriteLine($"Page confidence: {page.GetMeanConfidence():P1}");

    using var iter = page.GetIterator();
    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Word))
        {
            var wordText = iter.GetText(PageIteratorLevel.Word)?.Trim();
            var wordConf  = iter.GetConfidence(PageIteratorLevel.Word) / 100f; // Returns 0-100
            if (!string.IsNullOrEmpty(wordText) && wordConf >= minConfidence)
                highConfidenceWords.Add(wordText);
        }
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.Word));

    return highConfidenceWords;
}
// Word-level confidence filtering requires iterator boilerplate
public List<string> ExtractHighConfidenceWords(string imagePath, float minConfidence = 0.8f)
{
    var highConfidenceWords = new List<string>();

    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    // Page-level confidence only: fine-grained requires the iterator
    Console.WriteLine($"Page confidence: {page.GetMeanConfidence():P1}");

    using var iter = page.GetIterator();
    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Word))
        {
            var wordText = iter.GetText(PageIteratorLevel.Word)?.Trim();
            var wordConf  = iter.GetConfidence(PageIteratorLevel.Word) / 100f; // Returns 0-100
            if (!string.IsNullOrEmpty(wordText) && wordConf >= minConfidence)
                highConfidenceWords.Add(wordText);
        }
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.Word));

    return highConfidenceWords;
}
Imports System
Imports Tesseract

Public Class WordExtractor
    Public Function ExtractHighConfidenceWords(imagePath As String, Optional minConfidence As Single = 0.8F) As List(Of String)
        Dim highConfidenceWords As New List(Of String)()

        Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
            Using img As Pix = Pix.LoadFromFile(imagePath)
                Using page As Page = engine.Process(img)
                    ' Page-level confidence only: fine-grained requires the iterator
                    Console.WriteLine($"Page confidence: {page.GetMeanConfidence():P1}")

                    Using iter As ResultIterator = page.GetIterator()
                        iter.Begin()
                        Do
                            If iter.IsAtBeginningOf(PageIteratorLevel.Word) Then
                                Dim wordText As String = iter.GetText(PageIteratorLevel.Word)?.Trim()
                                Dim wordConf As Single = iter.GetConfidence(PageIteratorLevel.Word) / 100.0F ' Returns 0-100
                                If Not String.IsNullOrEmpty(wordText) AndAlso wordConf >= minConfidence Then
                                    highConfidenceWords.Add(wordText)
                                End If
                            End If
                        Loop While iter.Next(PageIteratorLevel.Para, PageIteratorLevel.Word)
                    End Using
                End Using
            End Using
        End Using

        Return highConfidenceWords
    End Function
End Class
$vbLabelText   $csharpLabel

IronOCR Yaklaşımı:

// Confidence is a property on each result object — no iterator required
public List<string> ExtractHighConfidenceWords(string imagePath, double minConfidence = 80.0)
{
    var result = new IronTesseract().Read(imagePath);

    Console.WriteLine($"Page confidence: {result.Confidence}%");

    // LINQ directly on the word collection — no iterator state management
    return result.Pages
        .SelectMany(p => p.Lines)
        .SelectMany(l => l.Words)
        .Where(w => w.Confidence >= minConfidence && !string.IsNullOrWhiteSpace(w.Text))
        .Select(w => w.Text)
        .ToList();
}
// Confidence is a property on each result object — no iterator required
public List<string> ExtractHighConfidenceWords(string imagePath, double minConfidence = 80.0)
{
    var result = new IronTesseract().Read(imagePath);

    Console.WriteLine($"Page confidence: {result.Confidence}%");

    // LINQ directly on the word collection — no iterator state management
    return result.Pages
        .SelectMany(p => p.Lines)
        .SelectMany(l => l.Words)
        .Where(w => w.Confidence >= minConfidence && !string.IsNullOrWhiteSpace(w.Text))
        .Select(w => w.Text)
        .ToList();
}
Imports System
Imports System.Collections.Generic
Imports System.Linq

Public Function ExtractHighConfidenceWords(imagePath As String, Optional minConfidence As Double = 80.0) As List(Of String)
    Dim result = New IronTesseract().Read(imagePath)

    Console.WriteLine($"Page confidence: {result.Confidence}%")

    ' LINQ directly on the word collection — no iterator state management
    Return result.Pages _
        .SelectMany(Function(p) p.Lines) _
        .SelectMany(Function(l) l.Words) _
        .Where(Function(w) w.Confidence >= minConfidence AndAlso Not String.IsNullOrWhiteSpace(w.Text)) _
        .Select(Function(w) w.Text) _
        .ToList()
End Function
$vbLabelText   $csharpLabel

Yinelemeli durum makinesi gitti. IronOCR'deki güvence değerleri sürekli olarak 0–100 ölçeğinde, 100 ile bölmeye gerek yoktur. güvence puanları kılavuzu kelime başına, satır başına ve sayfa başına güvence erişim kalıplarını kapsar. okuma sonuçları kılavuzu tam yapılandırılmış sonuç hiyerarşisini nasıl gezineceğinizi gösterir.

Çok Sayfalı TIFF Toplu İşleme

Birden fazla kareye sahip TIFF dosyaları, belge tarama iş akışlarında yaygındır. Charlesw sargısında yerleşik çok kareli TIFF desteği yoktur; Her çerçeve işlemden önce manuel olarak çıkarılmalıdır. IronOCR, tek bir yükleme çağrısı ile yerel olarak çok kareli TIFFlerle başa çıkar.

Charlesw Tesseract Yaklaşımı:

// charlesw/Tesseract has no multi-frame TIFF support
// Each frame must be extracted via System.Drawing before OCR can run
public string ProcessMultiFrameTiff(string tiffPath)
{
    var fullText = new StringBuilder();

    using var tiffImage = Image.FromFile(tiffPath);
    var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame as a temp file for Pix to load
        var tempPath = Path.Combine(Path.GetTempPath(), $"tiff_frame_{i}.png");
        try
        {
            tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png);

            using var pix  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(pix);
            fullText.AppendLine(page.GetText());
        }
        finally
        {
            if (File.Exists(tempPath)) File.Delete(tempPath);
        }
    }

    return fullText.ToString();
}
// charlesw/Tesseract has no multi-frame TIFF support
// Each frame must be extracted via System.Drawing before OCR can run
public string ProcessMultiFrameTiff(string tiffPath)
{
    var fullText = new StringBuilder();

    using var tiffImage = Image.FromFile(tiffPath);
    var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame as a temp file for Pix to load
        var tempPath = Path.Combine(Path.GetTempPath(), $"tiff_frame_{i}.png");
        try
        {
            tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png);

            using var pix  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(pix);
            fullText.AppendLine(page.GetText());
        }
        finally
        {
            if (File.Exists(tempPath)) File.Delete(tempPath);
        }
    }

    return fullText.ToString();
}
Imports System.Drawing
Imports System.Drawing.Imaging
Imports Tesseract
Imports System.IO
Imports System.Text

Public Function ProcessMultiFrameTiff(tiffPath As String) As String
    Dim fullText As New StringBuilder()

    Using tiffImage As Image = Image.FromFile(tiffPath)
        Dim frameCount As Integer = tiffImage.GetFrameCount(FrameDimension.Page)

        Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
            For i As Integer = 0 To frameCount - 1
                tiffImage.SelectActiveFrame(FrameDimension.Page, i)

                ' Must save each frame as a temp file for Pix to load
                Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"tiff_frame_{i}.png")
                Try
                    tiffImage.Save(tempPath, Imaging.ImageFormat.Png)

                    Using pix As Pix = Pix.LoadFromFile(tempPath)
                        Using page As Page = engine.Process(pix)
                            fullText.AppendLine(page.GetText())
                        End Using
                    End Using
                Finally
                    If File.Exists(tempPath) Then File.Delete(tempPath)
                End Try
            Next
        End Using
    End Using

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

IronOCR Yaklaşımı:

// LoadImageFrames handles multi-frame TIFFs natively — no frame extraction loop
public string ProcessMultiFrameTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);   // All frames loaded in one call

    var result = new IronTesseract().Read(input);

    // Pages maps directly to TIFF frames
    foreach (var page in result.Pages)
        Console.WriteLine($"Frame {page.PageNumber}: {page.Words.Count()} words");

    return result.Text;
}
// LoadImageFrames handles multi-frame TIFFs natively — no frame extraction loop
public string ProcessMultiFrameTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);   // All frames loaded in one call

    var result = new IronTesseract().Read(input);

    // Pages maps directly to TIFF frames
    foreach (var page in result.Pages)
        Console.WriteLine($"Frame {page.PageNumber}: {page.Words.Count()} words");

    return result.Text;
}
Imports System
Imports IronOcr

Public Class TiffProcessor
    ' LoadImageFrames handles multi-frame TIFFs natively — no frame extraction loop
    Public Function ProcessMultiFrameTiff(tiffPath As String) As String
        Using input As New OcrInput()
            input.LoadImageFrames(tiffPath) ' All frames loaded in one call

            Dim result = New IronTesseract().Read(input)

            ' Pages maps directly to TIFF frames
            For Each page In result.Pages
                Console.WriteLine($"Frame {page.PageNumber}: {page.Words.Count()} words")
            Next

            Return result.Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Geçici dosya çıkarma döngüsü ve çerçeve başına taşıma zinciri kaybolur. FrameDimension.Page ile çerçeve sayısı algılama ortadan kalkar. IronOCR, TIFF çerçevelerini OcrResult.Pages ile eşleştirir, bu nedenle çerçeve başına metin erişimi için ek yineleme mantığı gerekmez. TIFF/GIF girdi kılavuzu, kare seçimi ve kısmi TIFF işleme için ek seçenekleri kapsar.

Aranabilir PDF Oluşturma

Charlesw sargısı sadece metin çıktısı üretir. Belgeleri yönetim sistemleri için yaygın bir gereksinim olan taranmış bir belgeyi aranabilir bir PDF'ye dönüştürmek, orijinal görüntü sayfalarının üzerine çıkarılan metni eksiksiz bir şekilde yüklemek için bir ikincil PDF kütüphanesi (IronPDF, PDFSharp veya benzeri) gerektirir. IronOCR, arama yapılabilir PDFleri tek bir yöntem çağrısında, ikincil bir kütüphane olmadan üretir.

Charlesw Tesseract Yaklaşımı:

// charlesw/Tesseract produces text only.
// Creating a searchable PDF requires a second library and significant code.
// The pattern below is representative — actual implementation varies by PDF library.
public void CreateSearchablePdf(string imagePath, string outputPdfPath)
{
    // Step 1: Extract text from image
    string extractedText;
    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    extractedText = page.GetText();

    // Step 2: Build a PDF with the image as background and text overlay
    // Requires a separate PDF library (not shown — 50-100+ additional lines)
    // The text layer must be positioned to match the original image layout
    // Word-level coordinates from the iterator are needed for accurate alignment
    throw new NotImplementedException(
        "Searchable PDF generation requires a separate PDF library. " +
        "Add PdfSharp, IronPDF, or similar, then implement text layer overlay.");
}
// charlesw/Tesseract produces text only.
// Creating a searchable PDF requires a second library and significant code.
// The pattern below is representative — actual implementation varies by PDF library.
public void CreateSearchablePdf(string imagePath, string outputPdfPath)
{
    // Step 1: Extract text from image
    string extractedText;
    using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    extractedText = page.GetText();

    // Step 2: Build a PDF with the image as background and text overlay
    // Requires a separate PDF library (not shown — 50-100+ additional lines)
    // The text layer must be positioned to match the original image layout
    // Word-level coordinates from the iterator are needed for accurate alignment
    throw new NotImplementedException(
        "Searchable PDF generation requires a separate PDF library. " +
        "Add PdfSharp, IronPDF, or similar, then implement text layer overlay.");
}
Imports Tesseract

Public Sub CreateSearchablePdf(imagePath As String, outputPdfPath As String)
    ' Step 1: Extract text from image
    Dim extractedText As String
    Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
        Using img As Pix = Pix.LoadFromFile(imagePath)
            Using page As Page = engine.Process(img)
                extractedText = page.GetText()
            End Using
        End Using
    End Using

    ' Step 2: Build a PDF with the image as background and text overlay
    ' Requires a separate PDF library (not shown — 50-100+ additional lines)
    ' The text layer must be positioned to match the original image layout
    ' Word-level coordinates from the iterator are needed for accurate alignment
    Throw New NotImplementedException("Searchable PDF generation requires a separate PDF library. " & _
                                      "Add PdfSharp, IronPDF, or similar, then implement text layer overlay.")
End Sub
$vbLabelText   $csharpLabel

IronOCR Yaklaşımı:

// SaveAsSearchablePdf produces a PDF/A-compatible searchable document
//Hayırsecondary library, no text overlay code, no coordinate mapping
public void CreateSearchablePdf(string imagePath, string outputPdfPath)
{
    var result = new IronTesseract().Read(imagePath);
    result.SaveAsSearchablePdf(outputPdfPath);
    Console.WriteLine($"Searchable PDF saved: {outputPdfPath}");
}

// Same API works for multi-page TIFF or existing PDF input
public void MakePdfSearchable(string scannedPdfPath, string outputPdfPath)
{
    var result = new IronTesseract().Read(scannedPdfPath);
    result.SaveAsSearchablePdf(outputPdfPath);
}
// SaveAsSearchablePdf produces a PDF/A-compatible searchable document
//Hayırsecondary library, no text overlay code, no coordinate mapping
public void CreateSearchablePdf(string imagePath, string outputPdfPath)
{
    var result = new IronTesseract().Read(imagePath);
    result.SaveAsSearchablePdf(outputPdfPath);
    Console.WriteLine($"Searchable PDF saved: {outputPdfPath}");
}

// Same API works for multi-page TIFF or existing PDF input
public void MakePdfSearchable(string scannedPdfPath, string outputPdfPath)
{
    var result = new IronTesseract().Read(scannedPdfPath);
    result.SaveAsSearchablePdf(outputPdfPath);
}
Imports System

' SaveAsSearchablePdf produces a PDF/A-compatible searchable document
' Hayırsecondary library, no text overlay code, no coordinate mapping
Public Sub CreateSearchablePdf(imagePath As String, outputPdfPath As String)
    Dim result = New IronTesseract().Read(imagePath)
    result.SaveAsSearchablePdf(outputPdfPath)
    Console.WriteLine($"Searchable PDF saved: {outputPdfPath}")
End Sub

' Same API works for multi-page TIFF or existing PDF input
Public Sub MakePdfSearchable(scannedPdfPath As String, outputPdfPath As String)
    Dim result = New IronTesseract().Read(scannedPdfPath)
    result.SaveAsSearchablePdf(outputPdfPath)
End Sub
$vbLabelText   $csharpLabel

SaveAsSearchablePdf(), OCR metnini tanınan kelimelere hizalanmış gizli bir katman olarak gömer, böylece belge, görsel görünümünü değiştirmeden tam metin arama yapılabilir hale gelir. arama yapılabilir PDF nasıl yapılır kılavuzu sayfa aralığı seçimini ve sıkıştırma seçeneklerini kapsar. Çalışan bir örnek, arama yapılabilir PDF örnek sayfasında mevcuttur.

Charlesw TesseractAPI'den IronOCR'ye Haritalama Referansı

Charlesw Tesseract IronOCR Karşılığı
new TesseractEngine(tessDataPath, "eng", EngineMode.Default) new IronTesseract()
Pix.LoadFromFile(imagePath) input.LoadImage(imagePath)
Pix.LoadFromMemory(bytes) input.LoadImage(imageBytes)
engine.Process(pix) ocr.Read(input)
page.GetText() result.Text
page.GetMeanConfidence() result.Confidence (0–100 ölçeği)
page.GetIterator() result.Pages, result.Words (doğrudan koleksiyonlar)
iter.GetText(PageIteratorLevel.Word) word.Text
iter.GetConfidence(PageIteratorLevel.Word) word.Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out var b) word.X, word.Y, word.Width, word.Height
iter.GetText(PageIteratorLevel.Para) paragraph.Text
iter.IsAtBeginningOf(PageIteratorLevel.Block) page.Paragraphs (doğrudan yinele)
EngineMode.Default Otomatik (Tesseract 5 LSTM varsayılan)
EngineMode.TesseractOnly ocr.Configuration.PageSegmentationMode
Manuel tessdata .traineddata dosyası dotnet add package IronOcr.Languages.French
TessDataPath sabiti + .csproj kopya girişi Geçerli değil — paketli
Leptonica DLL ile Pix.LoadFromFile() input.LoadImage() — yerel DLL gerekmez
Platform GetTessDataPath() yöntemi Geçerli değil — kaldırıldı
leptonica-1.82.0.dll / libleptonica-dev Geçerli değil — Leptonica bağımlılığı yok
Manuel geçici dosya çerçeve çıkartma için TIFF input.LoadImageFrames(tiffPath)
Aranabilir PDF çıktısı yok result.SaveAsSearchablePdf(outputPath)
new TesseractEngine() iş parçacığı başına Bir IronTesseract — iş parçacığı güvenli

Yaygın Göç Sorunları ve Çözümleri

1. Sorun: Leptonica veya Tesseract İkili Dosyaları için DllNotFoundException

Charlesw Tesseract: Leptonica yerel DLL beklenen konumda olmadığında System.DllNotFoundException: Unable to load DLL 'leptonica-1.82.0': The specified module could not be found. bu istisna meydana gelir. Yeni Docker kapsayıcılarında, CI ajanlarında veya NuGet paketinin runtimes/ klasörünün doğru kopyalanmadığı her ortamda yaygındır.

Çözüm: Tesseract paketini kaldırın. IronOcr yükleyin. IronOCR, tüm yerel ikili dosyaları dahili olarak paketler ve sistem Leptonica'ya P/Invoke yapmaz. Dış Leptonica bağımlılığı olmadığı için bu hata oluşamaz:

dotnet remove package Tesseract
:InstallCmd dotnet add package IronOcr
dotnet remove package Tesseract
:InstallCmd dotnet add package IronOcr
SHELL

Gerekli apt-get install libleptonica-dev yok. Yerel DLL'ler için <CopyToOutputDirectory> giriş yok.

2. Sorun: Dağıtımdan Sonra Tessdata Yol Hataları

Charlesw Tesseract: Tesseract.TesseractException: Failed to initialise tesseract engine. bu, TessDataPath çalışma zamanında çözülmediğinde ortaya çıkar. Hatasız derlenir, yalnızca çalışma zamanında başarısız olur ve hata yolu dağıtım ortamına bağlıdır.

Çözüm: IronOCR'da tessdata yol kavramı yoktur. Sabit değeri silin, CopyToOutputDirectory XML'i .csproj içinde silin ve bunu oluşturan fabrika yöntemini silin. Dil verileri NuGet paketleri olarak dağıtılır:

# Replace this manual tessdata file management:
#   tessdata/eng.traineddata  (15 MB, manually downloaded)
#   tessdata/fra.traineddata  (15 MB, manually downloaded)
#   .csproj <CopyToOutputDirectory> entry

# With NuGet packages:
dotnet add package IronOcr.Languages.French
# Replace this manual tessdata file management:
#   tessdata/eng.traineddata  (15 MB, manually downloaded)
#   tessdata/fra.traineddata  (15 MB, manually downloaded)
#   .csproj <CopyToOutputDirectory> entry

# With NuGet packages:
dotnet add package IronOcr.Languages.French
SHELL

çoklu diller kılavuzu, dil paketleri ekledikten sonra çoklu dil tanıma nasıl yapılandırılacağını gösterir.

3. Sorun: Temel Görüntü Güncellendiğinde Konteyner Yapısı Bozuluyor

Charlesw Tesseract: Dockerfile, Leptonica yerel bağımlılığı karşılamak için apt-get install -y libleptonica-dev içerir. Temel görüntü Debian Bullseye'den Bookworm'a taşındığında veya Leptonica paket adı dağıtımlar arasında değiştiğinde, yapı bir apt hatasıyla bozulur. Bunu düzeltmek, yeni dağıtımda hangi paket adının kullanılacağını bilmeyi gerektirir.

Çözüm: Leptonica apt-get satırını tamamen kaldırın. Linux'ta IronOCR, zaten System.Drawing kullanan herhangi bir .NET uygulamasının ihtiyaç duyduğu standart libgdiplus paketini gerektirir:

# Before: Leptonica explicit install — breaks on base image updates
RUN apt-get update && apt-get install -y libleptonica-dev

# After: standard .NET Linux requirement only
RUN apt-get update && apt-get install -y libgdiplus

Docker dağıtım kılavuzu yaygın temel görüntüler için test edilmiş Dockerfile şablonlarını sağlar. charlesw'ye özgü altyapı kodu gerekmez.

4. Sorun: Boş veya Beyaz Alanlı Sayfalarda İteratör Deseni Bozuluyor

Charlesw Tesseract: ResultIterator, bazı sayfa segmentlerinde iter.GetText()'den null döndürür, döngü boyunca açık bir şekilde null kontrolleri gerektirir. Null kontrolünü kaçırmak, boş sayfalarda veya tanınabilir metin içermeyen resimlerde NullReferenceException'e neden olur.

Çözüm:IronOCR sonuç koleksiyonları hiç bir zaman null olmaz. Boş sayfalar boş koleksiyonlar döndürür. Null referanslar yerine metin içeriğini kontrol edin:

// Before: null checks required at every iterator level
var wordText = iter.GetText(PageIteratorLevel.Word);
if (wordText != null && wordText.Trim().Length > 0)
    results.Add(wordText.Trim());

// After: collection is safe to enumerate; check content as needed
foreach (var word in result.Pages.SelectMany(p => p.Lines).SelectMany(l => l.Words))
{
    if (!string.IsNullOrWhiteSpace(word.Text))
        results.Add(word.Text);
}
// Before: null checks required at every iterator level
var wordText = iter.GetText(PageIteratorLevel.Word);
if (wordText != null && wordText.Trim().Length > 0)
    results.Add(wordText.Trim());

// After: collection is safe to enumerate; check content as needed
foreach (var word in result.Pages.SelectMany(p => p.Lines).SelectMany(l => l.Words))
{
    if (!string.IsNullOrWhiteSpace(word.Text))
        results.Add(word.Text);
}
' Before: null checks required at every iterator level
Dim wordText = iter.GetText(PageIteratorLevel.Word)
If wordText IsNot Nothing AndAlso wordText.Trim().Length > 0 Then
    results.Add(wordText.Trim())
End If

' After: collection is safe to enumerate; check content as needed
For Each word In result.Pages.SelectMany(Function(p) p.Lines).SelectMany(Function(l) l.Words)
    If Not String.IsNullOrWhiteSpace(word.Text) Then
        results.Add(word.Text)
    End If
Next
$vbLabelText   $csharpLabel

5. Sorun: Yük Altında Thread Güvenliği İhlalleri

Charlesw Tesseract: TesseractEngine, iş parçacığı güvenli değildir. Bir ASP.NET uygulamasında ortak istekler arasında bir örneği paylaşmak erişim ihlallerine veya bozulmuş sonuçlara neden olur. Standart çözüm, thread başına bir motor oluşturmaktır, ancak bu, API'den açık değildir ve işler yanlış gittiğinde hata mesajları karmaşık yerel istisnalardır.

Çözüm: IronTesseract, iş parçacığı güvenlidir. Bir örnek, eşzamanlı istekleri hizmet verebilir veya maksimum verim için bir Parallel.ForEach içinde iş parçacığı başına bir tane oluşturulabilir — her iki model de değişiklik gerektirmeden çalışır:

// Thread-safe parallel processing — IronTesseract handles concurrent access
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, imagePath =>
{
    var ocr    = new IronTesseract();
    var result = ocr.Read(imagePath);
    results.Add(result.Text);
});
// Thread-safe parallel processing — IronTesseract handles concurrent access
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, imagePath =>
{
    var ocr    = new IronTesseract();
    var result = ocr.Read(imagePath);
    results.Add(result.Text);
});
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' Thread-safe parallel processing — IronTesseract handles concurrent access
Dim results As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(imagePath)
    Dim ocr As New IronTesseract()
    Dim result = ocr.Read(imagePath)
    results.Add(result.Text)
End Sub)
$vbLabelText   $csharpLabel

asenkron OCR kılavuzu, thread engellemenin kabul edilemez olduğu ASP.NET Core denetleyicileri için asenkron desenleri kapsar.

6. Sorun: ARM64 İkili Eksikliği Çalışma Zamanında

Charlesw Tesseract: AWS Graviton (Linux ARM64) veya Apple Silicon CI ajanlarında, arşivlenmiş paket ARM64 yerel bir ikili dosya içermeyebilir. Hata, motor oluşturulurken DllNotFoundException veya BadImageFormatException olur — paketin desteklemek için bir yolu olmayan bir platformda bir çalışma zamanı hatası.

Çözüm: IronOCR, hem Linux hem de macOS için doğrulanmış ARM64 ikili dosyaları sağlar. ARM64'e herhangi bir kod değişikliği yapmadan dağıtın. Linux dağıtım kılavuzu ve macOS dağıtım kılavuzu, desteklenen çalışma zaman kimliklerini doğrular.

Charlesw TesseractGeçiş Kontrol Listesi

Öncesi-Geçiş

Tüm değişecek desenleri belirlemek için kod tabanını denetleyin:

# Find all references to Tesseract namespace (engine creation, Pix usage, iterator usage)
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine instantiation points
grep -rn "TesseractEngine" --include="*.cs" .

# Find Pix usage (Leptonica image type)
grep -rn "Pix\." --include="*.cs" .

# Find tessdata path constants and methods
grep -rn "tessdata\|TessDataPath\|traineddata" --include="*.cs" .

# Find platform-conditional deployment code
grep -rn "IsOSPlatform\|DOTNET_RUNNING_IN_CONTAINER\|LD_LIBRARY_PATH" --include="*.cs" .

# Find iterator pattern usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find confidence calls
grep -rn "GetMeanConfidence\|GetConfidence" --include="*.cs" .

# Find .csproj tessdata copy entries
grep -rn "tessdata" --include="*.csproj" .
# Find all references to Tesseract namespace (engine creation, Pix usage, iterator usage)
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine instantiation points
grep -rn "TesseractEngine" --include="*.cs" .

# Find Pix usage (Leptonica image type)
grep -rn "Pix\." --include="*.cs" .

# Find tessdata path constants and methods
grep -rn "tessdata\|TessDataPath\|traineddata" --include="*.cs" .

# Find platform-conditional deployment code
grep -rn "IsOSPlatform\|DOTNET_RUNNING_IN_CONTAINER\|LD_LIBRARY_PATH" --include="*.cs" .

# Find iterator pattern usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find confidence calls
grep -rn "GetMeanConfidence\|GetConfidence" --include="*.cs" .

# Find .csproj tessdata copy entries
grep -rn "tessdata" --include="*.csproj" .
SHELL

Projenin hedeflediği dağıtım ortamlarını not edin (Docker, Linux, ARM64, Azure, AWS) — bunlar charlesw/tesseract'in en fazla yapılandırma gerektirdiği ve IronOCR'in ortadan kaldırdığı ortamlardır.

Kod Geçişi

  1. Charlesw sarmalayıcıyı kaldırmak için dotnet remove package Tesseract çalıştırın 2.IronOCR yüklemek için dotnet add package IronOcr çalıştırın
  2. Uygulama başlangıcında IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; ekleyin
  3. Tüm using Tesseract; ifadelerini using IronOcr; ile değiştirin
  4. tessdata yol sabitini ve çevreye göre yolu oluşturan herhangi bir yöntemi silin
  5. Tessdata yol seçimi için yazılan tüm RuntimeInformation.IsOSPlatform() bloklarını kaldırın
  6. Tüm .csproj dosyalarından tessdata dosyaları için <CopyToOutputDirectory> girişlerini kaldırın
  7. Tessdata .traineddata dosyalarını kaynak kontrolden veya dağıtım eser deposundan silin
  8. Daha önce .traineddata dosyası olarak dağıtılan her dil için dotnet add package IronOcr.Languages.* ekleyin
  9. new IronTesseract().Read() ile TesseractEngine + Pix.LoadFromFile() + engine.Process() zincirlerini değiştirin
  10. Tüm Pix.LoadFromFile() ve Pix.LoadFromMemory() çağrılarını input.LoadImage() ile değiştirin
  11. Tüm page.GetText() çağrılarını result.Text ile değiştirin
  12. result.Pages üzerindeki koleksiyon erişimine doğrudan erişim ile yinelemeli kelime/çizgi çıkarımını değiştirin
  13. iter.GetConfidence() eşik mantığını result.Words veya result.Lines üzerinde LINQ ile değiştirin
  14. Dockerfile'lar ve dağıtım komut dosyalarından libleptonica-dev / leptonica-1.82.0.dll kaldırın

Geçiş Sonrası

Kod güncellemelerinden sonra aşağıdakileri doğrulayın:

  • OCR, Windows üzerinde yerel DLL hatası olmadan başarıyla çalışır
  • OCR, libgdiplus dışında herhangi bir apt-get değişikliği olmaksızın Docker Linux kapsayıcısında başarıyla çalışır
  • OCR, dağıtım matrisinde o platform varsa ARM64 üzerinde metin çıktısı üretir
  • Çok sayfalı TIFF dosyaları, sadece ilk kare değil, tüm karelerden metin döndürür
  • Güven filtresi, önceki iteratör uygulamasıyla aynı mantıksal yüksek güvenli kelime kümesini döndürür
  • Dil özgü belgeler (Fransızca, Almanca, vb.) dil NuGet paketleri kurulduktan sonra doğru şekilde tanınır
  • Paralel OCR işlemleri hatasız veya bozulmuş çıktı olmadan tamamlanır
  • Aranabilir PDF çıktısı, önceki uygulamada yalnızca metin döndürdüğü yerde oluşturulur
  • CI/CD hattı, herhangi bir tessdata indirme adımı veya Leptonica yükleme komutları olmadan derlenir
  • Aynı görüntü topluluğu kullanılarak önceki uygulamanın doğrulandığına karşı duman testi uygulanır

IronOCR'a Geçişin Ana Faydaları

Kendine Yeterli Dağıtım Modeli. Geçişten sonra, OCR bağımlılığı tek bir NuGet paket referansı ile tamamen tanımlanır. Kaynak kontrolünde tessdata dosyaları yok, CopyToOutputDirectory girişleri yok, yerel DLL dağıtım adımları yok, Leptonica sistem paketleri yok. Önceden çok adımlı eser yönetimi gerektiren CI/CD hatları, dotnet publish'a düşer. Charlew sarmalayıcısını desteklemek için birikmiş dağıtım ile ilgili kod kalıcı olarak gider.

Koşullu Mantık Olmadan Platform Taşınabilirliği. Aynı uygulama ikilisi, değişiklik yapılmadan Windows x64, Linux x64, Linux ARM64, macOS x64 ve macOS ARM64 üzerinde çalışır. Bir ARM64 dağıtım hedefi ekleyen ekipler — AWS Graviton, Apple Silicon CI veya Raspberry Pi olsun — yeni platform algılama kodu yazmazlar. Linux dağıtım kılavuzu ve AWS dağıtım kılavuzu, test edilmiş yapılandırmaları doğrular.

Tesseract 5 Doğruluğu İçin Yerleşik Ön İşleme. Tesseract 4.1.1'den Tesseract 5'e atlamak, bozulmuş belgelerde tanımayı geliştirir. IronOCR, motor yükseltilmesinin üzerine otomatik ön işleme ekler, her görüntüyü işlemeye başlamadan önce eğrilik düzeltme, gürültü giderme, kontrast normalizasyon ve binarizasyon uygular. Önceden kabul edilebilir doğruluk eşik seviyelerine ulaşmak için özel bir ön işleme boru hattı gerektiren belgeler, artık ek kod gerektirmeden bu eşik seviyelerine ulaşır. görüntü kalitesi düzeltme kılavuzu, varsayılanların ötesine ayar yapmak gereken durumlar için açık ön işleme seçeneklerini belgeler.

Doğrudan Sonuç Gezinimi, Yineleyici Şablon Kodunu Değiştirir. charlesw yineleme deseni — GetIterator(), Begin(), Next(), IsAtBeginningOf(), null denetimleri boyunca — basit koleksiyonlar ile değiştirildi. Kelimeler, satırlar, paragraflar ve sayfalar sonuç nesnesinin özellikleridir. Güvene dayalı filtreleme bir LINQ ifadesidir. Daha önce kelime düzeyinde verileri çıkartan kod, iteratör yönetimi için 15–30 satır gerektiriyordu;IronOCR eşdeğeri 2–3 satırdır. OCR sonuç özellikleri sayfası, tam yapılandırılmış çıktı modelini özetler.

İkincil Bir Kütüphane Olmadan Aranabilir PDF Çıkışı. result.SaveAsSearchablePdf(), tanınan kelimelere hizalı metin katmanına sahip bir PDF üretir, ikincil bir PDF kütüphanesi gerektirmez. Aranabilir PDF'leri içeren belge yönetim sistemleri artık ayrı bir PDF oluşturma adımı gerektirmiyor. Çıkartılan metni sağlayan aynı sonuç nesnesi, aranabilir dosyayı da yazar, belge işleme boru hatlarını tek bir kütüphane bağımlılığına indirir.

Aktif Bakım ve Güvenlik Yama Kapsamı. IronOCR, Tesseract 5 model iyileştirmelerini, .NET çalışma zamanı uyumluluk doğrulamasını ve temel C++ motoru için güvenlik yama kapsamını izleyen düzenli güncellemeler alır. Artık arşivlenmiş bir paketin risk profilini taşımayan bağımlılık, eksik bir güvenlik yama yolu için inceleme raporları üretmez. .NET 10, 2026 boyunca genel kullanıma sunuldukça, IronOCR dökümantasyon merkezi geçerli uyumluluğu yansıtacak, çözüm veya forklara gerek kalmayacak.

Lütfen dikkate alınPDFSharp ve Tesseract, ilgili sahiplerinin tescilli markalarıdır. Bu site, Google veya empira Software GmbH ile bağlantılı, onaylanmış veya sponsorlu değildir. 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

Neden charlesw/tesseract (.NET Tesseract wrapper) 'dan IronOCR'a 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.

charlesw/tesseract (.NET Tesseract wrapper) 'dan IronOCR'a geçişteki ana kod değişiklikleri nelerdir?

charlesw/tesseract başlatma dizilerini IronTesseract oluşturma ile değiştirin, COM yaşam döngüsü yönetimini (açık Oluştur/Yükle/Kapat desenleri) kaldırın ve sonuç özellik adlarını güncelleyin. Sonuç, önemli ölçüde daha az sablon 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, charlesw/tesseract (.NET Tesseract wrapper) 'ın standart iş belgeleri için OCR doğruluğuna eşit midir?

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, charlesw/tesseract (.NET Tesseract wrapper) 'ın ayrı olarak yüklediği dil verilerini nasıl ele alır?

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.

charlesw/tesseract (.NET Tesseract wrapper) 'dan IronOCR'a geçiş, dağıtım altyapısında değişiklikler gerektirir mi?

IronOCR, charlesw/tesseract (.NET Tesseract wrapper) 'dan daha az altyapı değişikliği gerektirir. SDK ikili yolları, lisans dosyası yerleştirmeleri veya lisans sunucu yapılandırmaları yoktur. NuGet paketi, tamamıyla OCR motorunu içerir ve lisans anahtarı uygulama kodunda bir dize olarak ayarlanır.

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 charlesw/tesseract 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'un fiyatlandırması, charlesw/tesseract (.NET Tesseract wrapper) 'dan daha öngörülebilir mi? İş yüklerini artırırken?

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.

charlesw/tesseract (.NET Tesseract wrapper) 'dan IronOCR'a geçişten sonra mevcut testlerime ne olur?

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