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
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
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
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
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"
Ü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
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)
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
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
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
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
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
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
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
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
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
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
ç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
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)
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" .
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
- Charlesw sarmalayıcıyı kaldırmak için
dotnet remove package Tesseractçalıştırın 2.IronOCR yüklemek içindotnet add package IronOcrçalıştırın - Uygulama başlangıcında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin - Tüm
using Tesseract;ifadeleriniusing IronOcr;ile değiştirin - tessdata yol sabitini ve çevreye göre yolu oluşturan herhangi bir yöntemi silin
- Tessdata yol seçimi için yazılan tüm
RuntimeInformation.IsOSPlatform()bloklarını kaldırın - Tüm
.csprojdosyalarından tessdata dosyaları için<CopyToOutputDirectory>girişlerini kaldırın - Tessdata
.traineddatadosyalarını kaynak kontrolden veya dağıtım eser deposundan silin - Daha önce
.traineddatadosyası olarak dağıtılan her dil içindotnet add package IronOcr.Languages.*ekleyin new IronTesseract().Read()ileTesseractEngine+Pix.LoadFromFile()+engine.Process()zincirlerini değiştirin- Tüm
Pix.LoadFromFile()vePix.LoadFromMemory()çağrılarınıinput.LoadImage()ile değiştirin - Tüm
page.GetText()çağrılarınıresult.Textile değiştirin result.Pagesüzerindeki koleksiyon erişimine doğrudan erişim ile yinelemeli kelime/çizgi çıkarımını değiştiriniter.GetConfidence()eşik mantığınıresult.Wordsveyaresult.Linesüzerinde LINQ ile değiştirin- Dockerfile'lar ve dağıtım komut dosyalarından
libleptonica-dev/leptonica-1.82.0.dllkaldı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,
libgdiplusdışında herhangi birapt-getdeğ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.
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.

