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

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 .traineddata dosyaları 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 motorEngine ö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
$vbLabelText   $csharpLabel

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üklemesidotnet 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'ler result.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
$vbLabelText   $csharpLabel

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

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

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

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

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

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

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

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

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

Ö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.Processinput.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ı OCRinput.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 OCRocr.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ç verileriresult.Pages, result.Paragraphs, result.Lines, ve result.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.Run sarı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.

Lütfen dikkate alınPDFium, PDFSharp, Tesseract ve iText kendi sahiplerinin tescilli markalarıdır. Bu site, Chromium Projesi, Google, empira Software GmbH veya iText Group ile bağlantılı değil, onlardan onay almış ya da destekçi değildir. Tüm ürün adları, logolar ve markalar, ilgili sahiplerinin mülküdür. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.

Sıkça Sorulan Sorular

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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

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