MODI OCR C# ile IronOCR: C#'de Doğru Optik Karakter Tanıma Kütüphanesi Seçimi
TesseractOCR (Sicos1977 çatallaştırması) abir sahici, modern .NET sarımıdır — bu da tam olarak sınırlarının yakından incelenmeye değer olması nedenidir. Arşivlenmiş charlesw/tesseract projesinin aksine, bu çatallaştırma .NET 6+'yı hedefler ve Tesseract 5.4.1'i sarar. Ancak yeni bir sarım alttaki Tesseract motorunu düzeltmez. charlesw'den uyum sağlamak için TesseractOCR'ye güncelleyen ekipler çerçeve uyumluluğu tüm zorluklarım devam ettiğini keşfeder: tessdata klasör yönetimi, sıfır yerleşik önişleme, yerel PDF desteği yok ve eşzamanlı senaryolarda iş parçacığı başına bir örnek zorlayan iş parçacığı güvenli olmayan bir motor.
TesseractOCR'u Anlamak
TesseractOCR, Apache 2.0 lisansı altında Kees van Spelde (Sicos1977) tarafından orijinal charlesw/tesseract projesinin bir topluluk çatallaştırması olarak sürdürülen bir .NET sarmacıdır. Çatallaştırma için birincil motivasyon pratikti: charlesw'nin etkinliği 2023'ten sonra yavaşladı, .NET 6/7/8 geliştiricilerini mevcut bir çerçeve Tesseract bağlantısı olmadan bıraktı. TesseractOCR, .NET 6.0, 7.0 ve 8.0'ı hedef alarak ve Windows x64, Linux x64 ve macOS için Tesseract 5.x yerel kütüphaneleri paketleyerek bu boşluğu doldurur.
Mimari, bir P/Invoke sarımıdır: yönetilen .NET kodu, iç ara kullanarak yerel Tesseract C API'yi çağırır. NuGet paketi, eski sarımda mevcut olan bazı yerel kütüphane dağıtım sürtünmelerini ortadan kaldırarak yaygın platformlar için yerel ikili dosyaları paketler. Ancak, temel tasarım, Tesseract motoruna ince bir bağlantı olarak kalır — önişleme mantığı yok, PDF boru hattı yok, iş parçacığı soyutlaması yok.
Ana mimari özellikler:
- Tek gönüllü geliştirici tarafından aktif bakım — güncellemeler gönderilir, ancak SLA yok, ticari destek yok ve otobüs faktörü birdir
- Tesseract 5.5.0'yı sarar — en son LSTM motor iyileştirmeleri erişilebilir, charlesw'nin 5.2.0'sından avantaj
- .NET 6.0+ hedefler — modern çerçeve hedefleme, çatallaştırmanın var olmasının birincil nedeni
- Manuel tessdata yönetimi gerektirir — dil
.traineddatadosyaları ayrı ayrı indirilmeli ve uygulama ile birlikte dağıtılmalıdır - Yerleşik ön işleme yok — kaplama
engine.Process(image)doğrudan çağırır; görüntü kalitesi iyileştirme tamamen geliştiricinin sorumluluğundadır - Thread-safe olmayan motor —
Engineörnekleri iş parçacıkları arasında paylaşılamaz; her paralel çalışan kendi örneğine ihtiyaç duyar, bellek tüketimini çoğaltır - Yerel PDF desteği yok — PDF girişi, Tesseract'ın işleyebilmesi için sayfaları görüntülere dönüştürmek üzere ayrı bir kütüphane (Docnet.Core, PdfiumViewer) gerektirir
- ~200K NuGet indirimi vs charlesw'nin ~8M'si — daha küçük bir topluluk, daha az Stack Overflow cevabı, daha az öğretici ve mevcut Tesseract kaynaklarından daha fazla adaptasyon çalışması anlamına gelir
Motor Başlatma ve tessdata Bağımlılığı
HerTesseractOCRişlemi Engine başlatılmasıyla başlar ve bu başlatma, manuel olarak harici depolardan indirilen dil .traineddata dosyalarını içeren bir tessdata klasörü gerektirir:
// tessdata/eng.traineddata must exist before this line runs
// Downloaded separately: curl -L -o tessdata/eng.traineddata
// https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
string text = page.Text;
float confidence = page.MeanConfidence; // Returns 0.0-1.0 float
// tessdata/eng.traineddata must exist before this line runs
// Downloaded separately: curl -L -o tessdata/eng.traineddata
// https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
string text = page.Text;
float confidence = page.MeanConfidence; // Returns 0.0-1.0 float
Imports TesseractOCR
' tessdata/eng.traineddata must exist before this line runs
' Downloaded separately: curl -L -o tessdata/eng.traineddata
' https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As Pix.Image = TesseractOCR.Pix.Image.LoadFromFile("document.png")
Using page As Page = engine.Process(image)
Dim text As String = page.Text
Dim confidence As Single = page.MeanConfidence ' Returns 0.0-1.0 float
End Using
End Using
End Using
Engine yapıcı, tessdata dizin yolunu ve bir Language enum değerini kabul eder. Eğer dizin mevcut değilse, .traineddata dosyası eksikse veya dosya sürümü Tesseract motor sürümüyle eşleşmiyorsa, başlatma hatası atar. Bunlar, herhangi bir Tesseract sarmalayıcıyla en yaygın üç üretim hatasıdır veTesseractOCRtümünü devralır. Projenin kendi README'si, motoru oluşturmayı denemeden önce tessdata klasörünü ve bireysel dil dosyalarını kontrol eden savunmacı doğrulama kodu içerir — bu, geliştiricilerin bu sorunu ne kadar sık karşılaştığını gösterir.
IronOCR'u Anlamak
IronOCR, optimize edilmiş Tesseract 5 motorunu otomatik önişleme, yerel PDF giriş/çıkış ve iş parçacığı güvenli bir mimari ile saran ticari bir .NET OCR kütüphanesidir. Tüm kütüphane, tek bir NuGet paketi olarak gönderilir, harici bağımlılıklar yok, tessdata klasör yönetimi yok ve yerel kütüphane yapılandırması yok.
Anahtar özellikler:
- Tek bir NuGet yüklemesi —
dotnet add package IronOcrçalışan bir OCR hattı üretir; temel iş akışı için tessdata, yerel ikili kurulum veya ek paket gerekmez - Otomatik önişleme — motor otomatik olarak uyumu düzeltir, gürültü gidermeyi, kontrast arttırmayı, ikili hale getirmeyi ve çözünürlük ölçeklendirmeyi uygulanır; explicit filter methods are available when fine-grained control is needed
- Yerel PDF giriş ve çıkışı — PDF'ler doğrudan
OcrInput.LoadPdf()üzerinden yüklenir; tarama yapılmış PDF'lerresult.SaveAsSearchablePdf()üzerinden aranabilir PDF çıktısı üretir - Thread-safe
IronTesseract— tek bir örnek, iş parçacıkları arasında kopyalama olmadan eşzamanlı istekleri işler - 125+ dil olarak NuGet paketleri — harici dosya indirmeleri yok; Dil paketleri
dotnet add package IronOcr.Languages.Frenchüzerinden yüklenir ve yol yapılandırması olmadan referans alınır - Süresiz lisanslama — $999 Lite / $1,499 Plus / $2,999 Professional; belge başına maliyet yok, abonelik gerekmez
- Tutarlı davranışla çapraz platform — Windows, Linux, macOS, Docker, Azure ve AWS, platforma özgü yapılandırma olmadan aynı paket üzerinden çalışır
Özellik Karşılaştırması
| Özellik | TesseractOCR | IronOCR |
|---|---|---|
| .NET hedefleme | .NET 6.0, 7.0, 8.0 | .NET 6.0, 7.0, 8.0, .NET Framework 4.6.2+ |
| Lisans | Apache 2.0 (ücretsiz) | Ticari ($999+ süresiz) |
| tessdata management | Gereklidir (manuel indirme) | Gerekli değil (paketlenmiş) |
| Dahili ön işleme | None | Otomatik + açık filtreler |
| Yerel PDF girişi | Hayır | Evet |
| Aranabilir PDF çıktısı | Hayır | Evet |
| İş parçacığı güvenliği | Hayır (iş parçacığı başına motorlar) | Evet (tek paylaşılan örnek) |
Ayrıntılı Özellik Karşılaştırması
| Özellik | TesseractOCR | IronOCR |
|---|---|---|
| Kurulum ve Dağıtım | ||
| NuGet yükle | TesseractOCR |
IronOcr |
| tessdata klasörü gerekli | Evet | Hayır |
| Dil dosyası indir | Manuel (GitHub) | NuGet paketi |
| Yerel ikili paketleme | Kısmi (yaygın platformlar) | Tam |
| Tek paket dağıtımı | Hayır (tessdata ayrı) | Evet |
| Hava geçirmez ortam | Önceden aşamalı tessdata gerektirir | Dil NuGet paketleri çevrimdışı çalışır |
| OCR Yetenekleri | ||
| Tesseract motor sürümü | 5.5.0 | 5.x (optimize) |
| Otomatik düzeltme | Hayır | Evet |
| Otomatik gürültü giderme | Hayır | Evet |
| Otomatik kontrast | Hayır | Evet |
| Çözünürlük iyileştirmesi | Hayır | Evet (EnhanceResolution(300)) |
| Binarizasyon | Hayır | Evet |
| PDF Desteği | ||
| PDF girdisi | Hayır (harici kütüphane gereklidir) | Evet (yerel) |
| Şifre korumalı PDF | Hayır (şifreyi çöz + yeniden işle gerektirir) | Evet (tek parametre) |
| Aranabilir PDF çıktısı | Hayır | Evet |
| Belirli sayfa aralıkları | Manuel (sayfa başına render döngüsü) | Evet (LoadPdfPages) |
| Dil Desteği | ||
| Desteklenen diller | Herhangi bir tessdata dosyası | 125+ NuGet üzerinden |
| Çoklu-dil sözdizimi | Dil.İngilizce |Dil.Fransızca |
OcrLanguage.English + OcrLanguage.French |
| Özel dil verisi | Evet (dili tessdata'ya kopyala) | Evet (özel dil paketleri) |
| İş Parçacığı ve Toplu | ||
| İş parçacığı güvenli motor | Hayır | Evet |
| Paralel işleme deseni | Her iş parçacığı için motor (bellek yoğun) | Tek örnek, paralel girdiler |
| İplik başına bellek | Her motor örneği başına ~40-100MB | Paylaşılan örnek |
| Çıktı ve Sonuçlar | ||
| Güven skoru | page.MeanConfidence (0.0-1.0) |
result.Confidence (0-100%) |
| Kelime seviyesi konumlandırma | Sınırlı | Evet (X, Y, Genişlik, Yükseklik kelime başına) |
| Yapılandırılmış sonuç hiyerarşisi | Hayır | Sayfalar, Paragraflar, Satırlar, Kelimeler |
| OCR sırasında barkod okuma | Hayır | Evet |
| hOCR içeri aktarma | Hayır | Evet |
| Destek ve Bakım | ||
| Bakım modeli | Tek gönüllü geliştirici | Ticari ekip |
| Ticari destek | Hayır | Evet (e-posta, SLA seçenekleri) |
| GitHub sorunları yanıtı | Gönüllü program | Ticari program |
Tessdata Yönetimi: Gitmeyen Dağıtım Sorunu
Sicos1977 çatallaştırması, Tesseract motorunu güncelledi ve hedef çerçeveyi modernleştirdi. Dil verisinin nasıl çalıştığını değiştirmedi.TesseractOCRçalıştıran her ortam, ilk Engine yapıcı çağrısından önce .traineddata dosyalarıyla doldurulmuş bir tessdata klasörüne ihtiyaç duyar.
TesseractOCR Yaklaşımı
Bu depodaki basic-ocr.cs dosyası, proje tarafından herhangi bir OCR işleminden önce çalıştırılması önerilen bir ValidateTessData() yöntemi içerir. Bu savunmacı desen, hatalı bir mod olan — bir TesseractException hatası hattın ortasında atıldığında — kitaplığın kendi örneklerinin bile bu durumdan koruma sağladığı yeterince yaygın bir hata moduyla var.
// From BasicOcrService in tesseractocr-basic-ocr.cs
private void ValidateTessData()
{
if (!Directory.Exists(_tessDataPath))
{
throw new DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}\n" +
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best");
}
string engTrainedData = Path.Combine(_tessDataPath, "eng.traineddata");
if (!File.Exists(engTrainedData))
{
throw new FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}\n" +
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata");
}
}
// From BasicOcrService in tesseractocr-basic-ocr.cs
private void ValidateTessData()
{
if (!Directory.Exists(_tessDataPath))
{
throw new DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}\n" +
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best");
}
string engTrainedData = Path.Combine(_tessDataPath, "eng.traineddata");
if (!File.Exists(engTrainedData))
{
throw new FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}\n" +
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata");
}
}
Private Sub ValidateTessData()
If Not Directory.Exists(_tessDataPath) Then
Throw New DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}" & vbCrLf &
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best")
End If
Dim engTrainedData As String = Path.Combine(_tessDataPath, "eng.traineddata")
If Not File.Exists(engTrainedData) Then
Throw New FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}" & vbCrLf &
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata")
End If
End Sub
Çok dilli OCR sorunu büyütür. Her dil kendi .traineddata dosyasını gerektirir — dil başına 15 ila 50 MB — ve dosyalar, doğru depolu sürümden gelmelidir. tessdata_best deposu daha yüksek doğruluk sağlar, ancak daha yavaş işler; tessdata_fast hızı karşılığında doğruluğu değiştirir. Sürümleri karıştırmak veya Tesseract 5.x motoru ile Tesseract 4.x için derlenmiş tessdata dosyalarını kullanmak, herhangi bir hata sinyali olmadan sessiz doğruluk bozulmasına neden olur.
Docker dağıtımları için, tessdata dosyaları ya imaj içine yerleştirilmeli ya da bilinen bir yolda monte edilmelidir. CI/CD boru hatları için, indirme adımı betik yazılmalı ve önbelleğe alınmalıdır. Hava geçirmez ortamlar için dosyalar ön aşamalı olmalıdır. Her dağıtım yapılandırması, burada başarısız olabilir.
// Multi-language requires each .traineddata file pre-downloaded
// eng.traineddata + fra.traineddata + deu.traineddata all required
using var engine = new Engine(@"./tessdata",
Language.English | Language.French | Language.German,
EngineMode.Default);
// If any traineddata file is missing, this throws at construction time
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
return page.Text;
// Multi-language requires each .traineddata file pre-downloaded
// eng.traineddata + fra.traineddata + deu.traineddata all required
using var engine = new Engine(@"./tessdata",
Language.English | Language.French | Language.German,
EngineMode.Default);
// If any traineddata file is missing, this throws at construction time
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
return page.Text;
Imports TesseractOCR
' Multi-language requires each .traineddata file pre-downloaded
' eng.traineddata + fra.traineddata + deu.traineddata all required
Using engine As New Engine("./tessdata", Language.English Or Language.French Or Language.German, EngineMode.Default)
' If any traineddata file is missing, this throws at construction time
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(imagePath)
Using page As Page = engine.Process(image)
Return page.Text
End Using
End Using
End Using
IronOCR Yaklaşımı
IronOCR, NuGet paketleri olarak dil desteğini gönderir. İngilizce, çekirdek paketin içinde yer alır. Ek diller tek bir komutla yüklenir ve yol konfigürasyonu gerektirmez:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
//Hayırtessdata folder, no download scripts, no path validation
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
return result.Text;
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
//Hayırtessdata folder, no download scripts, no path validation
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
return result.Text;
Imports IronOcr
' dotnet add package IronOcr.Languages.French
' dotnet add package IronOcr.Languages.German
'Hayırtessdata folder, no download scripts, no path validation
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)
Using input As New OcrInput()
input.LoadImage(imagePath)
Dim result = ocr.Read(input)
Return result.Text
End Using
Dil paketi bir NuGet bağımlılığıdır, versiyonlanmıştır, otomatik olarak geri yüklenir ve uygulamanın ikili dosyası ile dağıtılır. Dış GitHub depoları yok, curl betikleri yok, dosyaları çıktı dizinine kopyalamak için yapı sistemi konfigürasyonu yok. İzole yapılandırmalar için, diğer tüm paketlerde olduğu gibi NuGet paketi çevrimdışı olarak özel bir beslemeyle geri yüklenebilir. çoklu diller kılavuzu, desteklenen tüm 125+ dilin kurulumu hakkında bilgi verir.
Ön İşleme: Modern Çatalın Hâlâ Yapamadığı Neler
TesseractOCR'un Sicos1977 dalı, charlesw'dan daha yenidir, güncel .NET'i hedef alır ve güncellenmiş Tesseract ikili dosyalarını içerir. Bir geliştirici, engine.Process(image)'ye eğik, düşük kontrastlı veya telefon kamerası kalitesinde bir görüntü geçirdiğinde ne olduğunu hiçbir şey değiştirmez. Motor ham pikselleri alır. Tesseract düşük kaliteli çıkış üretir. Ardından geliştirici, bağımlılık grafiğine dış bir görüntüleme kütüphanesi ekler ve önceden işleme kodunu yazar.
TesseractOCR Yaklaşımı
Bu havuzdaki migration-comparison.cs dosyası, TesseractOCR'un ihtiyaç duyduğu ön işleme modelini gösterir. Dış görüntü kitaplığı (bu durumda SixLabors.ImageSharp) eklenmeli, manuel filtre parametreleri ayarlanmalı ve ön işlenmiş görüntü, TesseractOCR'nin okuyabilmesi için bir geçici dosyaya yazılmalıdır — çünkü TesseractOCR.Pix.Image API'si bir dosya yolu bekler:
// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — each parameter requires tuning per document type
using var image = Image.Load(imagePath);
image.Mutate(x => x.Grayscale());
image.Mutate(x => x.Contrast(1.5f)); // 1.5 is a guess; tune per use case
image.Mutate(x => x.GaussianBlur(0.5f)); // Denoise with blur
image.Mutate(x => x.BinaryThreshold(0.5f)); // Threshold requires manual tuning
// Deskew is NOT in ImageSharp — requires separate Hough transform implementation
// (~50-100 additional lines)
string tempPath = Path.GetTempFileName() + ".png";
try
{
image.Save(tempPath);
using var engine = new Engine(@"./tessdata", Language.English);
using var pixImage = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(pixImage);
return page.Text;
}
finally
{
File.Delete(tempPath); // Clean up temp file
}
// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — each parameter requires tuning per document type
using var image = Image.Load(imagePath);
image.Mutate(x => x.Grayscale());
image.Mutate(x => x.Contrast(1.5f)); // 1.5 is a guess; tune per use case
image.Mutate(x => x.GaussianBlur(0.5f)); // Denoise with blur
image.Mutate(x => x.BinaryThreshold(0.5f)); // Threshold requires manual tuning
// Deskew is NOT in ImageSharp — requires separate Hough transform implementation
// (~50-100 additional lines)
string tempPath = Path.GetTempFileName() + ".png";
try
{
image.Save(tempPath);
using var engine = new Engine(@"./tessdata", Language.English);
using var pixImage = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(pixImage);
return page.Text;
}
finally
{
File.Delete(tempPath); // Clean up temp file
}
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.Processing
Imports TesseractOCR
Imports System.IO
' Requires: dotnet add package SixLabors.ImageSharp
' Manual preprocessing — each parameter requires tuning per document type
Dim image As Image = Image.Load(imagePath)
image.Mutate(Sub(x) x.Grayscale())
image.Mutate(Sub(x) x.Contrast(1.5F)) ' 1.5 is a guess; tune per use case
image.Mutate(Sub(x) x.GaussianBlur(0.5F)) ' Denoise with blur
image.Mutate(Sub(x) x.BinaryThreshold(0.5F)) ' Threshold requires manual tuning
' Deskew is NOT in ImageSharp — requires separate Hough transform implementation
' (~50-100 additional lines)
Dim tempPath As String = Path.GetTempFileName() & ".png"
Try
image.Save(tempPath)
Using engine As New Engine("./tessdata", Language.English)
Using pixImage As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(tempPath)
Using page As Page = engine.Process(pixImage)
Return page.Text
End Using
End Using
End Using
Finally
File.Delete(tempPath) ' Clean up temp file
End Try
TesseractOCR'un README'si, kusurlu girişlerde doğruluk düşüşlerini listeler: 5 derecelik bir eğiklik, doğruluğu %97'den %65-75'e düşürür; bir telefon kamerası ile çekim %30-50'ye düşer. Bunlar üretimde uç durumlar değildir — taranmış belgelerin, beyaz tahta fotoğraflarının ve faksların varsayılan durumudur. O doğruluğu geri kazanmak için dengeleme, gürültü azaltma ve kontrast normalizasyonu gereklidir. Tek başına dengeleme yaygın .NET görüntüleme kütüphanelerinde mevcut değildir ve bir Hough dönüşümü açı algılama algoritması uygulanmasını gerektirir.
IronOCR Yaklaşımı
IronOCR'nin ön işleme hattı OcrInput içinde yerleşiktir. Deskew(), DeNoise(), Contrast() ve EnhanceResolution()'yi çağırmak, yaygın belge türleri için dış kitaplıklar, geçici dosyalar veya parametre ayarı olmadan ilgili algoritmaları uygular:
//Hayırexternal imaging library needed
//Hayırtemp files, no manual parameter tuning
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // Automatic angle detection and correction
input.DeNoise(); // Intelligent noise removal
input.Contrast(); //Otomatik kontrastenhancement
input.EnhanceResolution(300); // Upscale if below 300 DPI
var result = new IronTesseract().Read(input);
return result.Text;
//Hayırexternal imaging library needed
//Hayırtemp files, no manual parameter tuning
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // Automatic angle detection and correction
input.DeNoise(); // Intelligent noise removal
input.Contrast(); //Otomatik kontrastenhancement
input.EnhanceResolution(300); // Upscale if below 300 DPI
var result = new IronTesseract().Read(input);
return result.Text;
Imports IronOcr
Using input As New OcrInput()
input.LoadImage(imagePath)
input.Deskew() ' Automatic angle detection and correction
input.DeNoise() ' Intelligent noise removal
input.Contrast() ' Automatic contrast enhancement
input.EnhanceResolution(300) ' Upscale if below 300 DPI
Dim result = New IronTesseract().Read(input)
Return result.Text
End Using
Kalite sorunlarının önceden bilinmediği belgeler için, motor herhangi bir açık filtre çağrısı olmadan otomatik olarak baz düzeltmeler uygular. görüntü kalitesi düzeltme kılavuzu, otomatik davranışın ayarlama gerektirdiği durumlar için her bir filtreyi ve parametre seçeneklerini kapsar. görüntü yönlendirme düzeltme kılavuzu özellikle dengeleme ve dönme algılamayı kapsar —TesseractOCRile özel bir uygulama gerektirecek işlemler. düşük kaliteli tarama örneği, zorlu belgelerdeki doğruluk farkını gösterir.
PDF İşleme: Dış Kütüphane Vergisi
TesseractOCR görüntüleri işler. PDF dosyalarını işlemez.TesseractOCRile her bir PDF iş akışı, PDF sayfalarını görüntü dosyalarına dönüştürmek için ikinci bir kütüphane gerektirir ve PDF-görüntü iş akışı her birine geçici dosya yönetimi, bayt formatı dönüştürme ve temizlik mantığı gerektirir.
TesseractOCR Yaklaşımı
Bu havuzdaki tesseractocr-pdf-processing.cs dosyası, komple bir PDF OCR hizmeti uygular. IronOCR'un üçte yaptığı işi yapmak için ek bir bağımlılık olarak Docnet.Core'u gerektirir ve yaklaşık 100 satır kod gerektirir. Temel çıkarım döngüsü, PDF'yi Docnet ile yüklemeyi, her sayfayı BGRA bayt dizilerine render etmeyi, her sayfayı geçici bir dosyaya yazmayı içerir (çünkü TesseractOCR.Pix.Image.LoadFromFile bir dosya yolu gerektirir, bir bayt dizisi değil), geçici dosyayı OCR işleme tabi tutmayı, StringBuilder'yı eklemeyi ve finally bloğunda geçici dosyaları silmeyi içerir:
// Requires: dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// Note: Docnet is MIT-licensed; iTextSharp would be AGPL
using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(dpi, dpi));
int pageCount = docReader.GetPageCount();
var allText = new StringBuilder();
var tempFiles = new List<string>();
try
{
using var engine = new Engine(_tessDataPath, Language.English, EngineMode.Default);
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
{
using var pageReader = docReader.GetPageReader(pageIndex);
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var imageBytes = pageReader.GetImage(); // BGRA bytes
// TesseractOCR.Pix.Image requires a file path — write to temp
string tempPath = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png");
tempFiles.Add(tempPath);
SaveBgraAsPng(imageBytes, width, height, tempPath); // ~30 lines
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
allText.AppendLine($"--- Page {pageIndex + 1} ---");
allText.AppendLine(page.Text);
}
}
finally
{
foreach (var tempFile in tempFiles)
{
try { File.Delete(tempFile); } catch { }
}
}
// Requires: dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// Note: Docnet is MIT-licensed; iTextSharp would be AGPL
using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(dpi, dpi));
int pageCount = docReader.GetPageCount();
var allText = new StringBuilder();
var tempFiles = new List<string>();
try
{
using var engine = new Engine(_tessDataPath, Language.English, EngineMode.Default);
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
{
using var pageReader = docReader.GetPageReader(pageIndex);
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var imageBytes = pageReader.GetImage(); // BGRA bytes
// TesseractOCR.Pix.Image requires a file path — write to temp
string tempPath = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png");
tempFiles.Add(tempPath);
SaveBgraAsPng(imageBytes, width, height, tempPath); // ~30 lines
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
allText.AppendLine($"--- Page {pageIndex + 1} ---");
allText.AppendLine(page.Text);
}
}
finally
{
foreach (var tempFile in tempFiles)
{
try { File.Delete(tempFile); } catch { }
}
}
Imports Docnet.Core
Imports TesseractOCR
Imports System.IO
Imports System.Text
' Requires: dotnet add package TesseractOCR
' dotnet add package Docnet.Core
' Note: Docnet is MIT-licensed; iTextSharp would be AGPL
Dim library = DocLib.Instance
Dim docReader = library.GetDocReader(pdfPath, New PageDimensions(dpi, dpi))
Dim pageCount As Integer = docReader.GetPageCount()
Dim allText As New StringBuilder()
Dim tempFiles As New List(Of String)()
Try
Using engine As New Engine(_tessDataPath, Language.English, EngineMode.Default)
For pageIndex As Integer = 0 To pageCount - 1
Using pageReader = docReader.GetPageReader(pageIndex)
Dim width = pageReader.GetPageWidth()
Dim height = pageReader.GetPageHeight()
Dim imageBytes = pageReader.GetImage() ' BGRA bytes
' TesseractOCR.Pix.Image requires a file path — write to temp
Dim tempPath As String = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png")
tempFiles.Add(tempPath)
SaveBgraAsPng(imageBytes, width, height, tempPath) ' ~30 lines
Using image = TesseractOCR.Pix.Image.LoadFromFile(tempPath)
Using page = engine.Process(image)
allText.AppendLine($"--- Page {pageIndex + 1} ---")
allText.AppendLine(page.Text)
End Using
End Using
End Using
Next
End Using
Finally
For Each tempFile In tempFiles
Try
File.Delete(tempFile)
Catch
End Try
Next
End Try
Parola korumalı PDF'ler, önce belgeyi şifre çözmek için bir üçüncü kütüphaneye ihtiyaç duyar (AGPL lisanslı iText veya PDFSharp), başka bir bağımlılık ve değerlendirilmesi gereken başka bir lisanslama konusu ekler. Bu konuda tesseractocr-pdf-processing.cs dosyasındaki yorumlar açık: "TesseractOCR + Docnet şifre korumalı PDF'leri doğrudan işleyemez. Yapmanız gereken: 1. Şifre çözümü destekleyen bir PDF kütüphanesi kullan... 2. Şifreyi açık hale getirme/şifreyi kaldırma... 3. Şifresi çözülmüş PDF'yi kaydet... 4. Ardından yukarıdaki kod ile işleyin."
IronOCR Yaklaşımı
IronOCR'un PDF desteği yereldir. Dış kütüphane, geçici dosyalar, bayt formatı dönüşümü yoktur. PDF giriş kılavuzu, her PDF senaryosunu — tam belge, sayfa aralıkları ve şifre korumalı dosyalar — kapsar:
//TamPDF — native, no external library
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = ocr.Read(input);
string text = result.Text;
//Şifre korumalı PDF— built-in, one parameter
using var encryptedInput = new OcrInput();
encryptedInput.LoadPdf("encrypted.pdf", Password: "secret");
var encryptedResult = ocr.Read(encryptedInput);
// Specific page range — no manual loop required
using var pageInput = new OcrInput();
pageInput.LoadPdfPages(pdfPath, startPage: 1, endPage: 5);
var pageResult = ocr.Read(pageInput);
//TamPDF — native, no external library
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = ocr.Read(input);
string text = result.Text;
//Şifre korumalı PDF— built-in, one parameter
using var encryptedInput = new OcrInput();
encryptedInput.LoadPdf("encrypted.pdf", Password: "secret");
var encryptedResult = ocr.Read(encryptedInput);
// Specific page range — no manual loop required
using var pageInput = new OcrInput();
pageInput.LoadPdfPages(pdfPath, startPage: 1, endPage: 5);
var pageResult = ocr.Read(pageInput);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Dim result = ocr.Read(input)
Dim text As String = result.Text
End Using
Using encryptedInput As New OcrInput()
encryptedInput.LoadPdf("encrypted.pdf", Password:="secret")
Dim encryptedResult = ocr.Read(encryptedInput)
End Using
Using pageInput As New OcrInput()
pageInput.LoadPdfPages(pdfPath, startPage:=1, endPage:=5)
Dim pageResult = ocr.Read(pageInput)
End Using
Tarama yapılmış PDF'ler — TesseractOCR'nin Docnet + ön işleme + OCR kombinasyonunun en zahmetli olduğu senaryo — aynı zamanda IronOCR'nin ön işleme hattının en önemli olduğu senaryodur. Tarama yapılmış bir PDF, geçici dosya yönetimi olmadan LoadPdf(), otomatik ön işleme, OCR ve isteğe bağlı aranabilir PDF çıktısından geçer. PDF OCR örneği ve aranabilir PDF rehberi, TesseractOCR'de eşdeğeri olmayan result.SaveAsSearchablePdf() dahil tam iş akışını kapsar.
Konu Çözümleme: Thread Güvenli Olmayan Motorların Bellek Maliyeti
TesseractOCR'nin Engine thread-safe değildir. basic-ocr.cs dosyası, açık bir uyarı içeren bir ThreadSafeOcrService sınıfı içerir: "Bellek yükü: 4 thread x 50MB = sadece motorlar için 200MB+. ParalelTesseractOCRişleme maliyeti, her biri ~40-100MB yerel Tesseract belleği tutan, her biri ~500ms başlatma süresi gerektiren thread başına bir motor örneği olmalıdır.
TesseractOCR Yaklaşımı
TesseractOCR ile paralel işleme, her işçi lambda içinde yeni bir Engine oluşturulmasını gerektirir:
// WARNING: Engine is NOT thread-safe — must create per thread
// Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(
imagePaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Per-thread engine — required, expensive (~500ms init, ~50MB memory)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
results[imagePath] = page.Text;
});
// WARNING: Engine is NOT thread-safe — must create per thread
// Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(
imagePaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Per-thread engine — required, expensive (~500ms init, ~50MB memory)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
results[imagePath] = page.Text;
});
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' WARNING: Engine is NOT thread-safe — must create per thread
' Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
Dim results As New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(
imagePaths,
New ParallelOptions With {.MaxDegreeOfParallelism = 4},
Sub(imagePath)
' Per-thread engine — required, expensive (~500ms init, ~50MB memory)
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(imagePath)
Using page As Page = engine.Process(image)
results(imagePath) = page.Text
End Using
End Using
End Using
End Sub)
Tek motoru yeniden kullanma modeli (döngünün dışında bir motor oluşturup sırayla yeniden kullanma) seri işlem için çalışır, ancak başka hiçbir thread örneğe dokunmazsa çalışmaz. Bu nedenle yük altında yığın işleme, ya thread başına motorların bellek maliyetini kabul etmeyi ya da dikkatli yaşam döngüsü yönetimi ile thread-özel motor havuzunu uygulamayı gerektirir.
IronOCR Yaklaşımı
IronTesseract thread-safe. Bir örnek, efharazany sayıda eş zamanlı thread'den gelen istekleri işler:
// Single instance — thread-safe, no per-thread duplication
var ocr = new IronTesseract();
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
using var input = new OcrInput(imagePath);
results[imagePath] = ocr.Read(input).Text;
});
// Single instance — thread-safe, no per-thread duplication
var ocr = new IronTesseract();
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
using var input = new OcrInput(imagePath);
results[imagePath] = ocr.Read(input).Text;
});
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' Single instance — thread-safe, no per-thread duplication
Dim ocr As New IronTesseract()
Dim results As New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(imagePath)
Using input As New OcrInput(imagePath)
results(imagePath) = ocr.Read(input).Text
End Using
End Sub)
çok iş parçacıklı örnek deseni gösterir. 4 paralel işçi için bellek izleri dört yerine bir motor örneğidir. Geçicilik önemli olduğunda yığın belge işleme boru hatları için, bu önemli bir farktır.
API Eşleme Başvurusu
| TesseractOCR | IronOCR Karşılığı | Notlar |
|---|---|---|
Engine(tessDataPath, Language.English, EngineMode.Default) |
new IronTesseract() |
tessdata yolu gerekli değil |
TesseractOCR.Pix.Image.LoadFromFile(path) |
new OcrInput(path) |
Daha fazla biçimi destekler |
engine.Process(image) |
ocr.Read(input) |
Temel OCR çağrısı |
page.Text |
result.Text |
Tam çıkarılmış metin |
page.MeanConfidence (0.0-1.0) |
result.Confidence (0-100) |
Ölçek farkı |
Dil.İngilizce |Dil.Fransızca |
OcrLanguage.English + OcrLanguage.French |
Operatör farkı |
EngineMode.Default |
Yok | Otomatik seçim |
TesseractOCR.Exceptions.TesseractException |
IronOcr.Exceptions.OcrException |
Daha az işlenmesi gereken istisna türü |
| Manuel ön işleme (ImageSharp) | input.Deskew(), input.DeNoise(), input.Contrast() |
Dahili, dış kütüphane yok |
Docnet GetPageReader().GetImage() + geçici dosya |
input.LoadPdf(path) |
Yerli PDF, geçici dosya yok |
| Yok | input.LoadPdf(path, Password: "secret") |
Ek kütüphane olmadan eşdeğeri yok |
| Yok | result.SaveAsSearchablePdf(path) |
TesseractOCR'de eşdeğeri yok |
| Yok | result.Pages, result.Lines, result.Words |
Yapılandırılmış çıktı |
| Yok | ocr.Configuration.ReadBarCodes = true |
Barkod eş-okuma |
İş parçacığı başına Engine örnekleri |
Tek IronTesseract örneği |
Yerleşik thread-güvenliği |
Ekipler TesseractOCR'dan IronOCR'a Geçmeyi Düşündüğünde
Belgenin Kalitesi Değişkendir
BirTesseractOCRentegrasyonu, yüksek kaliteli 300 DPI taramalarında sorunsuz çalışır. Belgelerin kalitesi düştüğünde — yassı yataktan eğik sayfalar, düşük kontrastlı fakslar, fişlerin telefon fotoğrafları — doğruluk boşluğu açılır. README'nin kendi ölçütü, ön işleme olmadan telefon kamerası çekimi doğruluğunu %30-50'ye düşürdüğünü gösterir. Bu doğruluğu geri kazanmak için ImageSharp veya SkiaSharp'ta bir ön işleme hattı kurmak ve ayarlamak, 8-20 saat geliştirme süresi alır ve ek bir bağımlılığı getirir. İlk entegrasyondan altı ay sonra "yüksek kaliteli tarama" varsayımlarının yanlış olduğunu keşfeden ekipler tipikTesseractOCRgeçiş vakasıdır. Ön işleme boşluğu, bir kez çözülen bir kurulum sorunu değildir — ne zaman yeni bir belge türü veya yakalama yöntemi hataya girse ortaya çıkar.
PDF Belgeleri Giriş İş Akışının Parçasıdır
PDF OCR için Docnet.Core +TesseractOCRkombinasyonu çalışır, ancak üç yerine yaklaşık 100 satır kod gerektirir. Daha pratik olarak, Docnet'in lisansını (MIT), platformlar arası davranışını, hatalı PDF'lerin yönetimini ve mevcut tessdata ve ön işleme koduyla etkileşimini değerlendirmeyi gerektirir. PDF'lerin birincil giriş olarak geldiği belgelerin yönetim sistemlerini, fatura işleyicilerini veya herhangi bir iş akışında yer alan ekipler, zamanı içe doğru sürtünmeye biriktiğini fark ederler: sayfa boyutu yönetimi, işleme için DPI seçimi, geçici dosya temizlik mantığı ve aranabilir PDF çıktı eksikliği. Tarama girdilerinden aranabilir PDF'ler üretmeleri gereken bir ekibin, yalnızcaTesseractOCRile bir yolu yoktur.
Thread Yapısı Bellek Sınırlarına Ulaşıyor
TesseractOCR'de dört eş zamanlı OCR işçisi, tek bir görüntü işlenmeden önce motor belleğinde 200-400MB tüketir. Bu, düşük geçişli arka plan işleri için bir problem değil. Çoklu eşzamanlı belge yüklemelerini işleten ASP.NET Core uç noktası veya geçişi ileri iten bir yığın işlemcisi için bir sorundur. Thread başına motor modeli ayrıca her yeni thread'in ilk belgesini işlemeye başlamadan önce ~500ms başlangıç maliyetini ödemesi anlamına gelir. Arka plan hizmeti amacıylaTesseractOCRseçen ve ardından geçiciğiliğe ölçeklemek zorunda kalan ekipler bu sınıra ulaşır. Thread-güvenli bir motora geçmek, tüm thread başına yükü tamamen ortadan kaldırır.
Başlangıç Geliştirmesinden Sonra Dağıtım Ortamı Değişiklikleri
TesseractOCR, uygulama ile birlikte tessdata dosyalarına eş eklenmesini gerektirir. Geliştiricinin yerel ortamında bu yönetilebilirdir. Docker konteynerinde, bu ya tessdata dosyalarını imaja dahil etmek (imaj boyutuna dil başına 15-50MB ekleme) ya da belirli bir dizine bir birim monte etmek anlamına gelir (iş operasyonları karmaşıklığı ekleyerek). Bir CI/CD boru hattında, bu, indirmeleri betik olarak yazmak ve önbelleğe almak demektir. Azure Uygulama Hizmeti veya AWS Lambda'da, tessdata yol konfigürasyonu geliştirmeden farklı olabilecek bir ortama özgü bir ayardır. Sadece yerel kanıt konseptiyle işe başlayan ve sonra konteynerleştirilmiş veya bulut dağıtımına geçen ekipler, tessdata gereksiniminin her ortamda farklı davrandığını keşfederler. IronOCR'un NuGet tabanlı dil paketleri, paket nerdeyse geri yükleniyorsa, her yere aynı şekilde dağıtılır.
Cemaat Desteği Çatal Sınırına Ulaşıyor
TesseractOCR yaklaşık 200K NuGet indirmeye sahiptir. charlesw/tesseract yaklaşık 8M'a sahiptir. Stack Overflow soruları, blog gönderileri ve GitHub sorunları, ezici çoğunlukla Tesseract .NET kılıflarında charlesw'nin API'sini — TesseractEngine, Engine'den değil — referans alır. Pix.LoadFromFile, TesseractOCR.Pix.Image.LoadFromFile değil. charlesw için çalışan çözümler TesseractOCR'un API farklılıkları için uyarlama gerektirir. Birincil destek modeli topluluk kaynakları olan ekipler için bu gerçek bir sürtünme çarpanıdır.
Genel Geçiş Dikkat Edilmesi Gereken Hususlar
Ad Alanı ve Sınıf Değiştirme
Temel değiştirme Engine ile IronTesseract ve TesseractOCR.Pix.Image.LoadFromFile() ile OcrInput'dir. Ad alanı değişimi (using TesseractOCR ile using IronOcr) çoğu referansı yakalar.TesseractOCR'Language.English|Dil.French(bitwise OR on a flags enum),IronOCR usesOcrLanguage.English + OcrLanguage.French(toplama operatörü). Güven ölçeği de farklıdır: TesseractOCR, float olarak 0.0-1.0page.MeanConfidencedöndürür; IronOCR, double olarak 0-100result.Confidence` döndürür. Güvenmeyle ilgili herhangi bir eşik mantığı güncellenmelidir.
// Before (TesseractOCR)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
float confidence = page.MeanConfidence; // 0.0 to 1.0
// After (IronOCR)
var ocr = new IronTesseract();
using var input = new OcrInput("document.png");
var result = ocr.Read(input);
double confidence = result.Confidence; // 0 to 100
// Before (TesseractOCR)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
float confidence = page.MeanConfidence; // 0.0 to 1.0
// After (IronOCR)
var ocr = new IronTesseract();
using var input = new OcrInput("document.png");
var result = ocr.Read(input);
double confidence = result.Confidence; // 0 to 100
Imports TesseractOCR
Imports IronOcr
' Before (TesseractOCR)
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile("document.png")
Using page As Page = engine.Process(image)
Dim confidence As Single = page.MeanConfidence ' 0.0 to 1.0
End Using
End Using
End Using
' After (IronOCR)
Dim ocr As New IronTesseract()
Using input As New OcrInput("document.png")
Dim result As OcrResult = ocr.Read(input)
Dim confidence As Double = result.Confidence ' 0 to 100
End Using
Ön İşleme Bağımlılıklarını Kaldırma
MevcutTesseractOCRentegrasyonu zaten bir ImageSharp veya SkiaSharp ön işleme hattına sahipse, bu kodun taşınma sonrasında silinmesi mümkündür. IronOCR'nin yerleşik Deskew(), DeNoise(), Contrast() ve EnhanceResolution() yöntemleri, dış filtre zincirinin yerini alır. Ön işlenmiş görüntü etrafındaki geçici dosya oluşturma ve temizleme kodu da ortadan kalkar — OcrInput bir dosya yolunu, bayt dizisini, akışı veya doğrudan Bitmap kabul eder, ara dosya yazma olmadan. görüntü filtreleri örneği mevcut filtreleri ve eşdeğerlerini kapsar.
PDF Dış Kütüphaneyi Kaldırma
PDF işleme için Docnet.Core veya PdfiumViewer kullanan ekipler, bu paketleri tamamen kaldırabilirler. Tüm PDF işleme döngüsünü değiştir — DocLib.Instance, GetDocReader, GetPageReader, GetImage, SaveBgraAsPng, geçici dosya oluşturma, Pix.Image.LoadFromFile, engine.Process — input.LoadPdf(pdfPath) ile. PDF giriş kılavuzu ve PDF OCR kullanım durumu sayfasıIronOCR PDF API'sinin tamamını kapsamaktadır. Projeden tessdata klasörünü silin, tessdata dosyaları için <CopyToOutputDirectory> yapılandırmasını kaldırın ve herhangi bir apt-get install tesseract-ocr adımını çıkarmak için Docker görüntülerini güncelleyin.
Hata Yönetimi Yüzeyi Küçülür
TesseractOCR, motor başlatma hataları için TesseractOCR.Exceptions.TesseractException yakalamayı, eksik yerel kütüphaneler için DllNotFoundException ve mimari uyumsuzluklar için BadImageFormatException yakalamayı gerektirir. IronOCR, yerel bağımlılıklarını bünyesinde bulundurur ve başlatmayı dahili olarak yönetir, bu yüzden bu istisna türleri geçerli olmaz. Kalan hata yüzeyi, dosya erişim problemleri için standart IOException ve OCR'ye özgü hatalar için IronOcr.Exceptions.OcrException durumudur.
Ek IronOCR Yetenekleri
Bu karşılaştırmada ele alınmayan alanların ötesinde, IronOCR'un TesseractOCR'de eşdeğeri olmayan özellikleri mevcuttur:
- Aranabilir PDF çıktısı —
result.SaveAsSearchablePdf()bir taranmış belgeyi gömülü, seçilebilir metin ile bir PDF'ye dönüştürür;TesseractOCRherhangi bir türde PDF çıktısı üretmez - Bölge tabanlı OCR —
input.LoadImage("invoice.jpg", new CropRectangle(0, 0, 600, 100))işlemleri belirli bir alana kısıtlar; form alanı çıkarımı ve yapılandırılmış belge ayrıştırması için kullanışlıdır - Barkod okuma sırasında OCR —
ocr.Configuration.ReadBarCodes = true, metin çıkarımıyla aynı geçişte belgelerde yerleşik barkodları ve QR kodlarını okur - Yapılandırılmış sonuç verileri —
result.Pages,result.Paragraphs,result.Lines, veresult.Words, kelime başına koordinat verisi ile belge yapısını açığa çıkarır; TesseractOCR, tek bir güven değeriyle düz bir metin dizisi döndürür - hOCR ihracatı —
result.SaveAsHocrFile(), dökümanyükleme işleme hatları için hOCR-format çıktısı üretir - Async OCR — manuel
Task.Runsarıcılara gerek kalmadan ASP.NET Core entegrasyonu için yerel async/await desteği - Kelime başına güven puanı — kelime düzeyinde güven, belirsiz çıkışları filtrelemeye olanak tanır;TesseractOCRyalnızca belge düzeyinde ortalama güven sağlar
- Özel belge okuma — pasaport, MICR çek ve plaka okuma, genel OCR'nin ötesinde alan-özel optimizasyonlarla
.NET Uyumluluğu ve Geleceğe Hazırlık
TesseractOCR, mevcut aktif LTS ve STS sürümlerini kapsayan .NET 6.0, 7.0 ve 8.0'ı hedefler. IronOCR, aynı modern .NET sürümlerini destekler ve çerçeve geçişlerini tamamlamamış ekipler için geriye dönük uyumluluğu .NET Framework 4.6.2+'ya kadar uzatır. Her iki kütüphane de Windows, Linux ve macOS üzerinde çalışır. IronOCR, tüm desteklenen platformlar için platforma özgü yapılandırma gerektirmeyen NuGet paketinde donanım tabanlı optimizasyonları gönderir; TesseractOCR, yaygın platformlar için yerel ikili dosyaları içerir, ancak alışılmadık Linux dağıtımları ve özel Docker temel imgeler için ek yerel kütüphane yapılandırması gerektirir. IronOCR, Docker, Linux, Azure ve AWS için doğrulanmış konfigürasyonlarla dağıtım kılavuzları yayınlar.
Sonuç
TesseractOCR gerçek bir niş tutar: Modern bir çerçeve Tesseract bağlayıcısını gerektiren, Apache 2.0 lisansı isteyen, yüksek kaliteli temiz görüntüleri işleyen ve ön işleme hattını oluşturmak için dahili görüntü işleme uzmanlığı olan bir proje için doğru seçimdir. Sicos1977 çatalı, yeni .NET 6+ işler için arşivlenmiş charlesw projesi kullanmaktan anlamlı derecede daha iyidir — daha yeni motor, aktif hata düzeltmeleri, gerçek çapraz platform yerel paketleme. Temiz giriş, yalnızca açık kaynak profilini kapsayan projeler için bu yeterlidir.
Bu karşılaştırmanın argümanı daha özeldir: Sarıcıyı güncellemek, Tesseract'ın kendisinin sağlamadığı şeyleri düzeltmez. tessdata gerekliliği değişmemiştir. Thread-güvenli olmayan motor değişmemiştir. Ön işleme eksikliği değişmemiştir. Yerel PDF desteği eksikliği değişmemiştir. Modern .NET hedefleme için TesseractOCR'u seçen bir ekip, yine charlesw ile aynı bütçe olan ilk kurulum, ön işleme uygulaması ve PDF entegrasyonu için 26-56 saatlik bir ayırma yapmalıdır. Modern çatal, sürüm sürtünmesini azaltır; entegrasyon işini azaltmaz.
IronOCR, dört açığı doğrudan ele alır: diller NuGet paketleri olarak yüklenir, IronTesseract thread-safe'dir, ön işleme otomatik olup, PDF yereldir. Dezavantaj, Lite lisansı için $999'dir. Çoğu üretim uygulaması için, bu karşılıklı yatırım hızla çözülür: rekabetçi herhangi bir ücretle geliştirici zamanı, yalnızca ilk kurulum çalışmasının ilk haftasında, sürekli bakım hesaba katılmadan lisans maliyetini aşar.
TesseractOCR'u değerlendiren herhangi bir ekip için açık soru, çatala aktif ve iyi bakım edilip edilmediği değil — öyle. Soru, temel Tesseract mimarisinin üretim gereksinimlerine uyup uymadığıdır. Cevap değişken kalitede belgeler, PDF girişi, ölçeklenebilir geçiş veya tessdata yönetiminin sürtünme olduğu bir dağıtım modeli içeriyorsa, IronOCR'un yaklaşımı bu sorunları bir kerelik lisans ücreti maliyetiyle ortadan kaldırır.
Sıkça Sorulan Sorular
TesseractOCR.Net nedir?
TesseractOCR.Net, geliştiriciler ve işletmeler tarafından görüntü ve belgelerden metin çıkarmak için kullanılan bir OCR çözümüdür. .NET uygulama geliştirmesinde IronOCR ile birlikte değerlendirilen birkaç OCR seçeneğinden biridir.
IronOCR, .NET geliştiricileri için TesseractOCR.Net ile nasıl karşılaştırılır?
IronOCR, IronTesseract'ı çekirdek motor olarak kullanan bir NuGet yerel .NET OCR kütüphanesidir. TesseractOCR.Net ile karşılaştırıldığında, daha basit bir dağıtım (SDK yükleyicileri yok), sabit oranlı fiyatlandırma ve COM etkileşimi veya bulut bağımlılığı olmadan temiz bir C# API sunar.
IronOCR'un TesseractOCR.Net'ten daha kolay kurulumu var mı?
IronOCR, tek bir NuGet paketi aracılığıyla yüklenir. SDK kurulumları, kopyalamak için lisans dosyaları, kaydedilecek COM bileşenleri veya yönetilecek ayrı çalışma zamanı ikili dosyaları yoktur. Tüm OCR motoru paket içinde yer alır.
TesseractOCR.Net ile IronOCR arasında hangi doğruluk farkları vardır?
IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranmış formlar için yüksek tanıma doğruluğu sağlar. Çok kötü durumda olan belgeler ya da nadir yazılar için ise doğruluk, kaynak kalitesine göre değişiklik gösterebilir. IronOCR, düşük kaliteli girişlerde tanımayı geliştirmek için görüntü ön işleme filtreleri içerir.
IronOCR, PDF metin çıkarma desteği sunuyor mu?
Evet. IronOCR, tek bir çağrıda hem yerel PDF'lerden hem de taranmış PDF görüntülerinden metin çıkarır. Çok sayfalı TIFF dosyaları, görüntüler ve akıntılar da desteklenir. Taranmış PDF'ler için, OCR sayfa bazında uygulanır ve her sayfa için sonuç nesneleri sağlanır.
TesseractOCR.Net lisanslaması, IronOCR ile nasıl karşılaştırılır?
IronOCR, sayfa veya tarama başına ücret içermeyen sabit oranlı bir süresiz lisans kullanır. Yüksek belge hacmi işleyen kuruluşlar, hacme rağmen aynı lisans maliyetini öder. Ayrıntılar ve hacim fiyatlandırması IronOCR lisans sayfasında mevcuttur.
IronOCR hangi dilleri destekliyor?
IronOCR, ayrı NuGet dil paketleri aracılığıyla 127 dili destekler. Bir dil eklemek için tek bir 'dotnet add package IronOcr.Languages.{Language}' komutu gerekir. Manuel dosya yerleştirme veya yol yapılandırması gerekmez.
.NET projesine IronOCR'yi nasıl kurarım?
NuGet üzerinden kurun: 'Install-Package IronOcr' Package Manager Console'da veya 'dotnet add package IronOcr' CLI'de. Ek dil paketleri aynı şekilde yüklenir. Yerel SDK kurucusu gerekmez.
IronOCR, TesseractOCR.Net'ten farklı olarak Docker ve kapsayıcılı dağıtımlar için uygun mu?
Evet. IronOCR, NuGet paketi aracılığıyla Docker konteynerlerinde çalışır. Lisans anahtarı, bir ortam değişkeni aracılığıyla ayarlanır. Lisans dosyaları, SDK yolları veya OCR motoru için hacimlerin bağlanmasına gerek yoktur.
IronOCR'u, TesseractOCR.Net ile kıyaslandığında satın almadan önce deneyebilir miyim?
Evet. IronOCR deneme modu, belgeleri işler ve çıkış üzerine bir filigran eklemeli OCR sonuçları döndürür. Lisans satın almadan önce kendi belgeleriniz üzerinde doğruluğu kontrol edebilirsiniz.
IronOCR, metin çıkarma yanında barkod okuma desteği sunar mı?
IronOCR, metin çıkarma ve OCR'ye odaklanır. Barkod okuma için Iron Software, eşlik eden bir kütüphane olan IronBarcode'u sağlar. Her ikisi de ayrı ayrı veya Iron Suite paketi olarak mevcuttur.
TesseractOCR.Net'ten IronOCR'a geçiş kolay mı?
TesseractOCR.Net'ten IronOCR'a geçiş genellikle başlangıç dizilerini IronTesseract örneklemesiyle değiştirmeyi, COM yaşam döngüsü yönetimini kaldırmayı ve API çağrılarını güncellemeyi içerir. Çoğu geçiş kod karmaşıklığını önemli ölçüde azaltır.

