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

OCR API Microsoft Azure Vision ile IronOCR: Hangisi Belge Görüntülerini Daha İyi İşler?

Tesseract'tan tek bir OCR sonucu okumadan önce, bir ön işleme hattı yazdınız — gri tonlama dönüşümü, kontrast geliştirme, binarizasyon, gürültü giderme, devirme düzenlemesi, DPI ölçekleme — metin tanıma ile ilgili olmayan yaklaşık 180 satırlık bir resim manipülasyon kodu. charlesw Tesseract sarıcının gerçek maliyeti: sıfır dolar lisans ücreti değil, motoru sıfırdan kurulmamış belgeler üzerinde güvenilir bir şekilde çalıştırmak için 20-40 saat mühendislik. Ardından, uygulamanızın PDF'ler aldığını keşfedersiniz ve boru hattının bir PDF dönüştürme kütüphanesiyle önden başlaması gerekir.

Tesseract'ı Anlamak

NuGet paketi Tesseract (charlesw wrapper), yerel Tesseract OCR motorunu .NET uygulamalarına açan bir P/Invoke köprüsüdür. Leptonica görüntü işleme kütüphanesini ve Tesseract motoru binarylerini sarar, C# geliştiricilerine mevcut en yetenekli açık kaynak kodlu OCR motorlarından birine doğrudan erişim sağlar.

Tesseract'ın kendisi, açık kaynak dünyasındaki OCR omurgasıdır. İlk olarak 1980'lerde Hewlett-Packard tarafından geliştirilen ve 2005'te Google tarafından açık kaynak yapılan motor, charlesw sarıcı üzerinden yalnızca yaklaşık 8 milyon NuGet indirimi biriktirdi. Bu sayı, niş bir proje değil, gerçek bir kullanım sağlar. Görüntüler temiz ve iyi biçimlendirilmiş olduğunda, Tesseract, minimum yapılandırma ile %95+ doğruluğa ulaşır.

Bu kütüphanenin her üretim kullanımını şekillendiren kritik mimari gerçekler:

  • Yalnızca resim girişi: Tesseract resimleri işler. Dahili bir PDF görüntüleyicisine sahip değildir. Her PDF iş akışı, her sayfayı Tesseract'ın dokunabileceği bir resime çevirmek için ayrı bir kütüphane (PdfiumViewer, PDFtoImage, Docnet.Core, GhostScript) gerektirir.
  • Manuel ön işleme gereklidir: Tesseract, temiz, yüksek çözünürlüklü, düzgün bir şekilde yönlendirilmiş görüntüler bekler. Dahili filtreler sağlamaz. Değişiklik yapılmadan sapma, gürültü, düşük DPI ve renk arka planları doğruluğu azaltır ve bu düzeltme tamamen geliştiricinin sorumluluğundadır.
  • Tessdata dosya yönetimi: Dil tanıma, GitHub'dan indirilen ve tessdata klasörüne yerleştirilen .traineddata dosyalarına bağlıdır. Her dil 15-100 MB. Her ortam - geliştirme, CI, aşama, üretim,Docker- doğru dosyaların doğru yol üzerinde olmasını gerektirir.
  • Yerel ikili dağıtım: Wrapper, platforma özgü yerel kütüphaneleri beraberinde getirir (tesseract50.dll, leptonica-1.82.0.dll Windows'ta; Linux'ta .so dosyaları). Bunlar, hedef mimariye eşleştirilmeli ve uygulamanın yanında dağıtılmalıdır.
  • İş parçacığı güvenli olmayan motor: Bir TesseractEngine örneği iş parçacıkları arasında paylaşılamaz. Paralel işleme, iş parçacığı başına bir motor oluşturulmasını gerektirir, motor başlatmanın 40-100 MB bellek yükünü paralellik derecesine göre çarpar.
  • Tesseract sürümü 4.1.1'e sabitlendi: charlesw sarıcı Tesseract 4.1.1'i izler, 2019'da piyasaya sürüldü. Geliştirilmiş LSTM doğruluğuna sahip Tesseract 5.x bu paket aracılığıyla mevcut değildir.

Ön İşleme Boşluğu

Ön işleme gereksinimi, atlayabileceğiniz bir yapılandırma seçeneği değildir. Bu, üretim doğruluğu ile gerçek dünya belgelerinde kullanılamaz çıktı arasındaki farktır. Bu wrapper için image-preprocessing-tesseract.cs kaynak dosyası tam el kitabı işlem hatlarını belgeliyor:

// Tesseract requires every one of these steps to be written manually
public static string ExtractWithPreprocessing(string imagePath)
{
    using (var original = new Bitmap(imagePath))
    {
        // Step 2: Convert to grayscale (~25 lines)
        using (var grayscale = ConvertToGrayscale(original))
        {
            // Step 3: Apply contrast enhancement (~15 lines)
            using (var enhanced = EnhanceContrast(grayscale))
            {
                // Step 4: Binarize — convert to black and white (~15 lines)
                using (var binarized = Binarize(enhanced, 128))
                {
                    // Step 5: Remove noise (~25 lines)
                    using (var denoised = RemoveNoise(binarized))
                    {
                        // Step 6: Deskew if rotated (~50 lines, simplified)
                        using (var deskewed = Deskew(denoised))
                        {
                            // Step 7: Scale to 300 DPI (~20 lines)
                            using (var scaled = ScaleToDpi(deskewed, 300))
                            {
                                return RunTesseract(scaled);  // Save to temp file, load Pix, process
                            }
                        }
                    }
                }
            }
        }
    }
}
// Tesseract requires every one of these steps to be written manually
public static string ExtractWithPreprocessing(string imagePath)
{
    using (var original = new Bitmap(imagePath))
    {
        // Step 2: Convert to grayscale (~25 lines)
        using (var grayscale = ConvertToGrayscale(original))
        {
            // Step 3: Apply contrast enhancement (~15 lines)
            using (var enhanced = EnhanceContrast(grayscale))
            {
                // Step 4: Binarize — convert to black and white (~15 lines)
                using (var binarized = Binarize(enhanced, 128))
                {
                    // Step 5: Remove noise (~25 lines)
                    using (var denoised = RemoveNoise(binarized))
                    {
                        // Step 6: Deskew if rotated (~50 lines, simplified)
                        using (var deskewed = Deskew(denoised))
                        {
                            // Step 7: Scale to 300 DPI (~20 lines)
                            using (var scaled = ScaleToDpi(deskewed, 300))
                            {
                                return RunTesseract(scaled);  // Save to temp file, load Pix, process
                            }
                        }
                    }
                }
            }
        }
    }
}
Imports System.Drawing

Public Class ImageProcessor
    ' Tesseract requires every one of these steps to be written manually
    Public Shared Function ExtractWithPreprocessing(imagePath As String) As String
        Using original As New Bitmap(imagePath)
            ' Step 2: Convert to grayscale (~25 lines)
            Using grayscale As Bitmap = ConvertToGrayscale(original)
                ' Step 3: Apply contrast enhancement (~15 lines)
                Using enhanced As Bitmap = EnhanceContrast(grayscale)
                    ' Step 4: Binarize — convert to black and white (~15 lines)
                    Using binarized As Bitmap = Binarize(enhanced, 128)
                        ' Step 5: Remove noise (~25 lines)
                        Using denoised As Bitmap = RemoveNoise(binarized)
                            ' Step 6: Deskew if rotated (~50 lines, simplified)
                            Using deskewed As Bitmap = Deskew(denoised)
                                ' Step 7: Scale to 300 DPI (~20 lines)
                                Using scaled As Bitmap = ScaleToDpi(deskewed, 300)
                                    Return RunTesseract(scaled)  ' Save to temp file, load Pix, process
                                End Using
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Using
    End Function

    ' Placeholder methods for conversion
    Private Shared Function ConvertToGrayscale(original As Bitmap) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function EnhanceContrast(grayscale As Bitmap) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function Binarize(enhanced As Bitmap, threshold As Integer) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function RemoveNoise(binarized As Bitmap) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function Deskew(denoised As Bitmap) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function ScaleToDpi(deskewed As Bitmap, dpi As Integer) As Bitmap
        ' Implementation here
        Return Nothing
    End Function

    Private Shared Function RunTesseract(scaled As Bitmap) As String
        ' Implementation here
        Return Nothing
    End Function
End Class
$vbLabelText   $csharpLabel

O iç içe using yapısı önemsiz değil — her adım gerçek bir uygulamadır: gri tonlama için bir renk matrisi, kontrast için piksel döngüsü, binarizasyon için başka bir piksel döngüsü, gürültü için bir medyan filtre ve düzeltme için bir Hough dönüşümü yedeği. image-preprocessing-tesseract.cs kaynağı doğrudan belirtir: 'Basitleştirilmiş düzeltme — gerçek uygulama Hough dönüşümü gerektirir. Bu genellikle OpenCV veya benzeri bir kütüphane gerektirir.'

Toplam: tek bir kelime okunmadan önce yaklaşık 180 satır. Aynı dosyadaki doğruluk tablosu yatırımı neden gerekli gösterir — Tesseract ön işlem olmadan 5 derecelik sapma belgesi üzerinde %60-70 doğruluk üretir, uygun şekilde ön işlenmiş giriş %90+ ulaşır.

IronOCR'u Anlamak

IronOCR, optimize edilmiş Tesseract 5 LSTM motorunu yerleşik bir ön işleme hattı, doğal PDF desteği ve yerel binary yönetimi gerektirmeyen bir yönetilen API ile entegre eden ticari bir .NET OCR kütüphanesidir. Kütüphane, tessdata klasörleri, platforma özel DLL dağıtım adımları ve ek PDF dönüştürme kütüphaneleri olmadan tek bir NuGet paketi olarak kurulur.

IronOCR'nin tasarımını belirleyen anahtar özellikler:

  • Otomatik ön işlem: Deskew, DeNoise, Contrast, Binarize ve EnhanceResolution OcrInput üzerinde tek satırlık yöntem çağrılarıdır. Motor, ayrıca OCR başlamadan önce varsayılan olarak akıllı otomatik ön işleme uygular.
  • Yerel PDF girişi: input.LoadPdf() taranmış PDF'leri, dijital PDF'leri ve karışık PDF'leri hiçbir harici bağımlılık olmadan kabul eder. Parola korumalı PDF'ler için bir ek parametre gereklidir.
  • NuGet üzerinden 125+ dil: Dil paketleri standart NuGet paketleri olarak kurulur — IronOcr.Languages.French, IronOcr.Languages.Arabic — ve hiçbir klasör yönetimi veya yol yapılandırması gerektirmez.
  • İş parçacığı güvenli IronTesseract örneği: Tek bir örnek tüm iş parçacıklarına eş zamanlı hizmet eder. Paralel toplu işleme, iplik başına motor başlatmayı gerektirmez.
  • Çapraz platform tek paket: Windows, Linux, macOS, Docker, Azure ve AWS hepsi platforma özel yapılandırma olmadan aynı NuGet paketinden dağıtılır.
  • Aranabilir PDF çıktısı: OCR sonuçlarını tek bir yöntem çağrısında aranabilir PDF'ye dönüştürür.
  • Fiyatlandırma: $999 Lite süresiz / $1,499 Plus / $2,999 Professional / $5,999 Unlimited — tek seferlik satın alma, doküman başına ücret yok.

Özellik Karşılaştırması

Özellik Tesseract (charlesw) IronOCR
Lisans Apache 2.0 (ücretsiz) Ticari ($999+ süresiz)
PDF girişi Hiçbiri - dış kütüphane gerektirir Doğal yerleşik
Görüntü ön işleme Elle - 100+ satırlık kod Otomatik + tek satırlık yöntemler
Dil yönetimi Manuel tessdata dosya indirimi NuGet paketi kurulum
Thread güvenliği İplik güvenli değil (iplik başına motor) İplik güvenli tekil örnek
Dağıtım Doğal DLL'ler + tessdata klasörü Tek bir NuGet paketi
Tesseract sürümü 4.1.1 (2019) 5.x optimize edilmiş

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

Kategori / Özellik Tesseract (charlesw) IronOCR
Kurulum ve Yükleme
NuGet yükle Install-Package Tesseract Install-Package IronOcr
Ek kurulum adımları tessdata indir + yol yapılandırma None
Yerel binar dağıtımı Gereklidir Paket içinde
Docker kurulum apt-get + tessdata kopyalama Ek adımlar yok
Kurulum süresi tahmini 2-4 saat 5 dakika
Ön işlem
Hizalama Elle (50+ satır) input.Deskew()
Gürültü giderme Elle (25+ satır) input.DeNoise()
Kontrast artırma Elle (15+ satır) input.Contrast()
Binarizasyon Elle (15+ satır) input.Binarize()
Çözünürlük ölçekleme Elle (20+ satır) input.EnhanceResolution(300)
Toplam ön işleme LOC ~180 satır 1-10 satır
PDF Desteği
Taralı PDF'leri Oku Yerel olarak desteklenmez Yerel
Dijital PDF'leri Oku Yerel olarak desteklenmez Yerel
Şifre korumalı PDF'ler Şifre çözme kütüphanesi gerekir Bir parametre
Sayfa aralığı seçimi Elle (PDF kütüphanesi aracılığıyla) input.LoadPdfPages()
Aranabilir PDF'ler oluştur Desteklenmiyor result.SaveAsSearchablePdf()
Dil Desteği
İngilizce Dahil (dosya gereklidir) Dahil
Ek diller Elle .traineddata indirme NuGet paketi
Dil sayısı 100+ (manuel yönetim) 125+ (NuGet)
Çok dilli tek çağrıda "eng+fra+deu" dizesi AddSecondaryLanguage()
Konu İşleme
İş parçacığı güvenli motor Hayır Evet
Paralel işleme İş parçacığı başına motor oluşturma Paylaşılan tek örnek
İplik başına bellek Her biri 40-100 MB Paylaşılan havuz
Çıktı ve Sonuçlar
Düz metin page.GetText() result.Text
Kelime düzeyi sınırlayıcı kutular ResultIterator döngü result.Words LINQ
Güven skoru page.GetMeanConfidence() result.Confidence
Aranabilir PDF Desteklenmiyor result.SaveAsSearchablePdf()
hOCR içeri aktarma page.GetHOCRText() result.SaveAsHocrFile()
Barkod tespiti Desteklenmiyor ocr.Configuration.ReadBarCodes = true
Platform Desteği
Windows Evet Evet
Linux Derleme/apt-get gerektirir Evet
macOS Elle kurulum gerektirir Evet
Docker Çok adımlı kurulum Kutudan çıkar çıkmaz çalışır

Ön İşleme Boşluğu

Ön işleme gereksinimi, 20-40 saatlik zaman tahmininin kaynağıdır. Bu abartı değildir. Tesseract ile sıfırdan güvenilir bir ön işleme hattı oluşturmak, IronOCR'nin yerleşik olarak sunduğu her dönüşümü uygulamak anlamına gelir.

Tesseract Yaklaşımı

image-preprocessing-tesseract.cs'de gösterilen tam ön işleme hattı, System.Drawing.Common (yalnızca Windows) ya da ImageSharp gibi ek bir platformlar arası kütüphaneyi gerektirir. Yalnızca düzeltme uygulaması basitleştirilmiş olduğunu belirtir — üretim düzeyindeki bir kayma algılama algoritması, genellikle OpenCvSharp4'ün ek bir bağımlılık olarak dahil edilmesini gerektiren bir Hough hattı dönüşümü gerektirir.

// image-preprocessing-tesseract.cs — the actual implementation pattern
private static Bitmap ConvertToGrayscale(Bitmap original)
{
    var result = new Bitmap(original.Width, original.Height);
    using (var graphics = Graphics.FromImage(result))
    {
        var colorMatrix = new ColorMatrix(new float[][]
        {
            new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
            new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
            new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
            new float[] { 0, 0, 0, 1, 0 },
            new float[] { 0, 0, 0, 0, 1 }
        });
        using (var attributes = new ImageAttributes())
        {
            attributes.SetColorMatrix(colorMatrix);
            graphics.DrawImage(original,
                new Rectangle(0, 0, original.Width, original.Height),
                0, 0, original.Width, original.Height,
                GraphicsUnit.Pixel, attributes);
        }
    }
    return result;
}

private static Bitmap EnhanceContrast(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    float contrast = 1.5f;
    for (int y = 0; y < image.Height; y++)
    {
        for (int x = 0; x < image.Width; x++)
        {
            var pixel = image.GetPixel(x, y);
            int r = Clamp((int)((pixel.R - 128) * contrast + 128));
            int g = Clamp((int)((pixel.G - 128) * contrast + 128));
            int b = Clamp((int)((pixel.B - 128) * contrast + 128));
            result.SetPixel(x, y, Color.FromArgb(r, g, b));
        }
    }
    return result;
}

private static Bitmap RemoveNoise(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    int kernelSize = 3;
    int radius = kernelSize / 2;
    for (int y = radius; y < image.Height - radius; y++)
    {
        for (int x = radius; x < image.Width - radius; x++)
        {
            var pixels = new List<int>();
            for (int ky = -radius; ky <= radius; ky++)
                for (int kx = -radius; kx <= radius; kx++)
                    pixels.Add(image.GetPixel(x + kx, y + ky).R);
            pixels.Sort();
            int median = pixels[pixels.Count / 2];
            result.SetPixel(x, y, Color.FromArgb(median, median, median));
        }
    }
    return result;
}

// After all preprocessing, save to temp file — Tesseract requires a file path
private static string RunTesseract(Bitmap preprocessed)
{
    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        preprocessed.Save(tempPath, ImageFormat.Png);
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        using (var img = Pix.LoadFromFile(tempPath))
        using (var page = engine.Process(img))
            return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
// image-preprocessing-tesseract.cs — the actual implementation pattern
private static Bitmap ConvertToGrayscale(Bitmap original)
{
    var result = new Bitmap(original.Width, original.Height);
    using (var graphics = Graphics.FromImage(result))
    {
        var colorMatrix = new ColorMatrix(new float[][]
        {
            new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
            new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
            new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
            new float[] { 0, 0, 0, 1, 0 },
            new float[] { 0, 0, 0, 0, 1 }
        });
        using (var attributes = new ImageAttributes())
        {
            attributes.SetColorMatrix(colorMatrix);
            graphics.DrawImage(original,
                new Rectangle(0, 0, original.Width, original.Height),
                0, 0, original.Width, original.Height,
                GraphicsUnit.Pixel, attributes);
        }
    }
    return result;
}

private static Bitmap EnhanceContrast(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    float contrast = 1.5f;
    for (int y = 0; y < image.Height; y++)
    {
        for (int x = 0; x < image.Width; x++)
        {
            var pixel = image.GetPixel(x, y);
            int r = Clamp((int)((pixel.R - 128) * contrast + 128));
            int g = Clamp((int)((pixel.G - 128) * contrast + 128));
            int b = Clamp((int)((pixel.B - 128) * contrast + 128));
            result.SetPixel(x, y, Color.FromArgb(r, g, b));
        }
    }
    return result;
}

private static Bitmap RemoveNoise(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    int kernelSize = 3;
    int radius = kernelSize / 2;
    for (int y = radius; y < image.Height - radius; y++)
    {
        for (int x = radius; x < image.Width - radius; x++)
        {
            var pixels = new List<int>();
            for (int ky = -radius; ky <= radius; ky++)
                for (int kx = -radius; kx <= radius; kx++)
                    pixels.Add(image.GetPixel(x + kx, y + ky).R);
            pixels.Sort();
            int median = pixels[pixels.Count / 2];
            result.SetPixel(x, y, Color.FromArgb(median, median, median));
        }
    }
    return result;
}

// After all preprocessing, save to temp file — Tesseract requires a file path
private static string RunTesseract(Bitmap preprocessed)
{
    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        preprocessed.Save(tempPath, ImageFormat.Png);
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        using (var img = Pix.LoadFromFile(tempPath))
        using (var page = engine.Process(img))
            return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
Imports System.Drawing
Imports System.Drawing.Imaging
Imports Tesseract
Imports System.IO

' image-preprocessing-tesseract.vb — the actual implementation pattern
Private Shared Function ConvertToGrayscale(original As Bitmap) As Bitmap
    Dim result As New Bitmap(original.Width, original.Height)
    Using graphics As Graphics = Graphics.FromImage(result)
        Dim colorMatrix As New ColorMatrix(New Single()() {
            New Single() {0.299F, 0.299F, 0.299F, 0, 0},
            New Single() {0.587F, 0.587F, 0.587F, 0, 0},
            New Single() {0.114F, 0.114F, 0.114F, 0, 0},
            New Single() {0, 0, 0, 1, 0},
            New Single() {0, 0, 0, 0, 1}
        })
        Using attributes As New ImageAttributes()
            attributes.SetColorMatrix(colorMatrix)
            graphics.DrawImage(original, New Rectangle(0, 0, original.Width, original.Height), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes)
        End Using
    End Using
    Return result
End Function

Private Shared Function EnhanceContrast(image As Bitmap) As Bitmap
    Dim result As New Bitmap(image.Width, image.Height)
    Dim contrast As Single = 1.5F
    For y As Integer = 0 To image.Height - 1
        For x As Integer = 0 To image.Width - 1
            Dim pixel As Color = image.GetPixel(x, y)
            Dim r As Integer = Clamp(CInt((pixel.R - 128) * contrast + 128))
            Dim g As Integer = Clamp(CInt((pixel.G - 128) * contrast + 128))
            Dim b As Integer = Clamp(CInt((pixel.B - 128) * contrast + 128))
            result.SetPixel(x, y, Color.FromArgb(r, g, b))
        Next
    Next
    Return result
End Function

Private Shared Function RemoveNoise(image As Bitmap) As Bitmap
    Dim result As New Bitmap(image.Width, image.Height)
    Dim kernelSize As Integer = 3
    Dim radius As Integer = kernelSize \ 2
    For y As Integer = radius To image.Height - radius - 1
        For x As Integer = radius To image.Width - radius - 1
            Dim pixels As New List(Of Integer)()
            For ky As Integer = -radius To radius
                For kx As Integer = -radius To radius
                    pixels.Add(image.GetPixel(x + kx, y + ky).R)
                Next
            Next
            pixels.Sort()
            Dim median As Integer = pixels(pixels.Count \ 2)
            result.SetPixel(x, y, Color.FromArgb(median, median, median))
        Next
    Next
    Return result
End Function

' After all preprocessing, save to temp file — Tesseract requires a file path
Private Shared Function RunTesseract(preprocessed As Bitmap) As String
    Dim tempPath As String = Path.GetTempFileName() & ".png"
    Try
        preprocessed.Save(tempPath, ImageFormat.Png)
        Using engine As New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
            Using img As Pix = Pix.LoadFromFile(tempPath)
                Using page As Page = engine.Process(img)
                    Return page.GetText()
                End Using
            End Using
        End Using
    Finally
        If File.Exists(tempPath) Then File.Delete(tempPath)
    End Try
End Function

Private Shared Function Clamp(value As Integer) As Integer
    Return Math.Max(0, Math.Min(255, value))
End Function

Private Const TessDataPath As String = "path_to_tessdata" ' Define the path to tessdata directory
$vbLabelText   $csharpLabel

Bu, kaynak dosyalardan gerçek kod — kurgulanmış bir en kötü durum değil. Kontrast ve gürültü gidermek için piksel-tekrar yaklaşımı her piksel üzerinde O(n²) işletir. Geçici dosya kaydetme ve yükleme isteğe bağlı değildir; Pix.LoadFromFile disk üzerinde bir dosya yolu gerektirir. Günde 1.000 taranmış belge işleyen bir uygulama için bu, OCR zamanına ek olarak ölçülebilir yük bindirir.

IronOCR Yaklaşımı

IronOCR'daki aynı ön işleme, OcrInput üzerinde bir dizi yöntem çağrısından oluşur.

// dotnet add package IronOcr
using IronOcr;

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();           // Detects and corrects skew angle automatically
input.DeNoise();          // Removes scanner artifacts and specks
input.Contrast();         // Enhances contrast for character separation
input.Binarize();         // Converts to black and white with adaptive threshold
input.EnhanceResolution(300);  // Scales to 300 DPI for optimal recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Console.WriteLine(result.Text);
// dotnet add package IronOcr
using IronOcr;

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();           // Detects and corrects skew angle automatically
input.DeNoise();          // Removes scanner artifacts and specks
input.Contrast();         // Enhances contrast for character separation
input.Binarize();         // Converts to black and white with adaptive threshold
input.EnhanceResolution(300);  // Scales to 300 DPI for optimal recognition

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

Dim input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")

input.Deskew()           ' Detects and corrects skew angle automatically
input.DeNoise()          ' Removes scanner artifacts and specks
input.Contrast()         ' Enhances contrast for character separation
input.Binarize()         ' Converts to black and white with adaptive threshold
input.EnhanceResolution(300)  ' Scales to 300 DPI for optimal recognition

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

Geçici dosya yok. Piksel yinelemesi yok. System.Drawing.Common veya OpenCvSharp4 bağımlılığı yok. görüntü kalitesi düzeltme kılavuzu ve görüntü yönlendirme düzeltme kılavuzu tam filtre kataloğunu içerir — 15'ten fazla mevcuttur. görüntü filtreleri örneği, düşük kaliteli tarama hattını baştan sona gösterir.

Çoğu gerçek dünya belgesi için, varsayılan okuma, hiçbir açık filtre çağrısı olmadan akıllı otomatik ön işlem uygular:

// Automatic preprocessing applied internally — no explicit filter calls needed
var text = new IronTesseract().Read("scanned-invoice.jpg").Text;
// Automatic preprocessing applied internally — no explicit filter calls needed
var text = new IronTesseract().Read("scanned-invoice.jpg").Text;
Imports IronTesseract

' Automatic preprocessing applied internally — no explicit filter calls needed
Dim text As String = New IronTesseract().Read("scanned-invoice.jpg").Text
$vbLabelText   $csharpLabel

Temiz, yüksek DPI'lı girdide bu bir maliyet getirmez. 72 DPI'lık bir telefon fotoğrafında, motor ölçeklendirir, geliştirir ve metni tanımaya başlamadan önce normalleştirir.

PDF Boşluğu

PDF, iş belgeleri için standart teslimat formatıdır. Sözleşmeler, faturalar, banka ekstreleri, tıbbi kayıtlar — bunlar PDF olarak gelir. Tesseract bir PDF'yi açamaz. Köprüyü kurmak için başka bir kütüphane, başka bir yerel bağımlılık ve 50-150 satır arası ek bağlantı kodu gerekir.

Tesseract Yaklaşımı

pdf-ocr-processing-tesseract.cs dosyası, üç ayrı PDF render kütüphanesi seçeneğini — PdfiumViewer, PDFtoImage ve Docnet.Core — her biri farklı bağımlılık zincirleri ve takaslarla belgeler. Bu dosyadaki PdfiumViewer örneği temsili:

// Tesseract PDF processing — from pdf-ocr-processing-tesseract.cs
// Requires: PdfiumViewer NuGet + pdfium native DLL deployed to application directory
// NuGet: PdfiumViewer, PdfiumViewer.Native.x64

using PdfiumViewer;

public static string ExtractFromPdfWithPdfium(string pdfPath)
{
    var results = new List<string>();

    using (var document = PdfDocument.Load(pdfPath))
    {
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        {
            for (int pageIndex = 0; pageIndex < document.PageCount; pageIndex++)
            {
                // Render page to image at 300 DPI
                using (var pageImage = document.Render(pageIndex, 300, 300,
                    PdfRenderFlags.CorrectFromDpi))
                {
                    // Tesseract requires a file path — must write to disk first
                    string tempPath = Path.GetTempFileName() + ".png";
                    try
                    {
                        pageImage.Save(tempPath);
                        using (var img = Pix.LoadFromFile(tempPath))
                        using (var page = engine.Process(img))
                            results.Add(page.GetText());
                    }
                    finally
                    {
                        File.Delete(tempPath);  // Must clean up or disk fills
                    }
                }
            }
        }
    }

    return string.Join("\n\n--- Page Break ---\n\n", results);
}
// Tesseract PDF processing — from pdf-ocr-processing-tesseract.cs
// Requires: PdfiumViewer NuGet + pdfium native DLL deployed to application directory
// NuGet: PdfiumViewer, PdfiumViewer.Native.x64

using PdfiumViewer;

public static string ExtractFromPdfWithPdfium(string pdfPath)
{
    var results = new List<string>();

    using (var document = PdfDocument.Load(pdfPath))
    {
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        {
            for (int pageIndex = 0; pageIndex < document.PageCount; pageIndex++)
            {
                // Render page to image at 300 DPI
                using (var pageImage = document.Render(pageIndex, 300, 300,
                    PdfRenderFlags.CorrectFromDpi))
                {
                    // Tesseract requires a file path — must write to disk first
                    string tempPath = Path.GetTempFileName() + ".png";
                    try
                    {
                        pageImage.Save(tempPath);
                        using (var img = Pix.LoadFromFile(tempPath))
                        using (var page = engine.Process(img))
                            results.Add(page.GetText());
                    }
                    finally
                    {
                        File.Delete(tempPath);  // Must clean up or disk fills
                    }
                }
            }
        }
    }

    return string.Join("\n\n--- Page Break ---\n\n", results);
}
Imports PdfiumViewer
Imports Tesseract

Public Shared Function ExtractFromPdfWithPdfium(pdfPath As String) As String
    Dim results As New List(Of String)()

    Using document = PdfDocument.Load(pdfPath)
        Using engine = New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
            For pageIndex As Integer = 0 To document.PageCount - 1
                ' Render page to image at 300 DPI
                Using pageImage = document.Render(pageIndex, 300, 300, PdfRenderFlags.CorrectFromDpi)
                    ' Tesseract requires a file path — must write to disk first
                    Dim tempPath As String = Path.GetTempFileName() & ".png"
                    Try
                        pageImage.Save(tempPath)
                        Using img = Pix.LoadFromFile(tempPath)
                            Using page = engine.Process(img)
                                results.Add(page.GetText())
                            End Using
                        End Using
                    Finally
                        File.Delete(tempPath)  ' Must clean up or disk fills
                    End Try
                End Using
            Next
        End Using
    End Using

    Return String.Join(vbCrLf & vbCrLf & "--- Page Break ---" & vbCrLf & vbCrLf, results)
End Function
$vbLabelText   $csharpLabel

pdf-ocr-processing-tesseract.cs kaynağı doğrudan bağımlılık zincirini belirtir: 'Tesseract: Apache 2.0, PdfiumViewer: BSD, iText: AGPL veya ticari, GhostScript: AGPL veya ticari.' Bu son öğe, kurumsal bağlamlarda önemlidir — GhostScript'in AGPL lisansı, uygulamanızın açık kaynak olmasını gerektirir, eğer bir ticari GhostScript lisansı satın almazsanız.

Parola korumalı PDF'ler bir başka katman ekler. Aynı dosyadaki PasswordProtectedPdf sınıfı, 'Şifreleme desteği olan bir PDF kütüphanesi gerektirir (iText, PDFSharp).' yorumu ile NotImplementedException fırlatır. Tesseract PDF'leri şifre çözemez.' Yani parola koruması, kendi lisanslama değerlendirmeleri ile dördüncü bir bağımlılık anlamına gelir.

IronOCR Yaklaşımı

IronOCR, taranmış PDF'ler, dijital metin PDF'leri, karışık içerikli PDF'ler ve parola korumalı PDF'ler dahil olmak üzere PDF'leri doğal olarak okur:

// dotnet add package IronOcr
using IronOcr;

// Scanned PDF — direct load, no rendering library required
var result = new IronTesseract().Read("scanned-contract.pdf");
Console.WriteLine(result.Text);

// Password-protected PDF — one additional parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var protectedResult = new IronTesseract().Read(input);

// Specific page range from a 200-page document
using var rangeInput = new OcrInput();
rangeInput.LoadPdfPages("large-report.pdf", 1, 10);
var rangeResult = new IronTesseract().Read(rangeInput);

// Create searchable PDF with embedded text layer
var searchable = new IronTesseract().Read("scanned-invoice.pdf");
searchable.SaveAsSearchablePdf("searchable-invoice.pdf");
// dotnet add package IronOcr
using IronOcr;

// Scanned PDF — direct load, no rendering library required
var result = new IronTesseract().Read("scanned-contract.pdf");
Console.WriteLine(result.Text);

// Password-protected PDF — one additional parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var protectedResult = new IronTesseract().Read(input);

// Specific page range from a 200-page document
using var rangeInput = new OcrInput();
rangeInput.LoadPdfPages("large-report.pdf", 1, 10);
var rangeResult = new IronTesseract().Read(rangeInput);

// Create searchable PDF with embedded text layer
var searchable = new IronTesseract().Read("scanned-invoice.pdf");
searchable.SaveAsSearchablePdf("searchable-invoice.pdf");
Imports IronOcr

' Scanned PDF — direct load, no rendering library required
Dim result = New IronTesseract().Read("scanned-contract.pdf")
Console.WriteLine(result.Text)

' Password-protected PDF — one additional parameter
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim protectedResult = New IronTesseract().Read(input)
End Using

' Specific page range from a 200-page document
Using rangeInput As New OcrInput()
    rangeInput.LoadPdfPages("large-report.pdf", 1, 10)
    Dim rangeResult = New IronTesseract().Read(rangeInput)
End Using

' Create searchable PDF with embedded text layer
Dim searchable = New IronTesseract().Read("scanned-invoice.pdf")
searchable.SaveAsSearchablePdf("searchable-invoice.pdf")
$vbLabelText   $csharpLabel

PDF oluşturma kütüphanesi yok. Geçici dosya yok. AGPL lisans değerlendirmeleri yok. PDF giriş nasıl yapılır kılavuzu, tüm PDF giriş varyasyonlarını kapsar. aranabilir PDF nasıl yapılır metin katmanı çıktısını açıklar. Belge işleme boru hatları oluşturan ekipler için, PDF OCR kullanım sayfası, üretim mimarisi kalıplarını sağlar.

Ön işleme yöntemleri PDF girdisinde aynen çalışır, taranmış PDF'lerde hiçbir ara dönüştürme adımı olmadan aynı input.Deskew(), input.DeNoise(), input.EnhanceResolution() çağrılarına izin verir.

Tessdata Yönetimi

Her Tesseract dağıtımı, bir tessdata klasör sorunu içerir. Klasörün var olması, doğru .traineddata dosyaları ile doldurulması ve TesseractEngine başlatma sırasında belirtilen yoldan erişilebilir olması gerekir. Bu, ölçekle birlikte büyüyen bir dağıtım karmaşıklığı yaratır.

Tesseract Yaklaşımı

multi-language-tesseract.cs dosyası, dil dosyalarının boyutlarını ve yönetim sürecini belgeliyor:

// Must exist before initialization:
// ./tessdata/eng.traineddata   (~15 MB)
// ./tessdata/fra.traineddata   (~15 MB)
// ./tessdata/deu.traineddata   (~15 MB)
// ./tessdata/chi_sim.traineddata  (~45 MB)
// ./tessdata/jpn.traineddata   (~40 MB)
// 10 languages = 200-300 MB to download and manage

public string SafeMultiLanguageOcr(string imagePath, string[] languages)
{
    // Check presence before attempting — runtime failures are worse
    foreach (var lang in languages)
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
        {
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
        }
    }

    var langString = string.Join("+", languages);  // e.g., "eng+fra+deu"
    using var engine = new TesseractEngine(TessDataPath, langString, EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    return page.GetText();
}
// Must exist before initialization:
// ./tessdata/eng.traineddata   (~15 MB)
// ./tessdata/fra.traineddata   (~15 MB)
// ./tessdata/deu.traineddata   (~15 MB)
// ./tessdata/chi_sim.traineddata  (~45 MB)
// ./tessdata/jpn.traineddata   (~40 MB)
// 10 languages = 200-300 MB to download and manage

public string SafeMultiLanguageOcr(string imagePath, string[] languages)
{
    // Check presence before attempting — runtime failures are worse
    foreach (var lang in languages)
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
        {
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
        }
    }

    var langString = string.Join("+", languages);  // e.g., "eng+fra+deu"
    using var engine = new TesseractEngine(TessDataPath, langString, EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    return page.GetText();
}
Imports System.IO
Imports Tesseract

Public Function SafeMultiLanguageOcr(imagePath As String, languages As String()) As String
    ' Check presence before attempting — runtime failures are worse
    For Each lang In languages
        If Not File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")) Then
            Throw New FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " &
                "Download from https://github.com/tesseract-ocr/tessdata")
        End If
    Next

    Dim langString = String.Join("+", languages)  ' e.g., "eng+fra+deu"
    Using engine As New TesseractEngine(TessDataPath, langString, EngineMode.Default)
        Using img As Pix = Pix.LoadFromFile(imagePath)
            Using page As Page = engine.Process(img)
                Return page.GetText()
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Koruyucu dosya varlık kontrolü paranoya değildir — eksik bir .traineddata dosyası, eksik dosyanın hangisi olduğunu her zaman net olarak belirtmeyen bir mesajla TesseractException: Failed to initialise tesseract engine fırlatır. basic-text-extraction-tesseract.cs kaynağı, yaygın çalışma zamanı istisnalarını belgeliyor: Eksik Leptonica ikili dosyaları için System.DllNotFoundException, eksik tessdata için TesseractException, 32/64-bit uyumsuzlukları için BadImageFormatException.

Docker dağıtımlarında, tessdata dosyaları konteyner görüntüsüne kopyalanmalıdır. Üç dil için her biri 15 MB artı best modelleri her bir 50-100 MB olacak şekilde, konteyner görüntüleri birkaç yüz megabayt şişer. CI/CD boru hatları bu indirmeleri ya önceden önbelleğe almalı ya da önbellek soğukken yavaş derleme sürelerini kabul etmelidir.

IronOCR Yaklaşımı

IronOCR'de dil desteği bir NuGet paketi referansıdır:

// Install once: dotnet add package IronOcr.Languages.French
// Install once: dotnet add package IronOcr.Languages.German
using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

var result = ocr.Read("multilingual-document.jpg");
// Install once: dotnet add package IronOcr.Languages.French
// Install once: dotnet add package IronOcr.Languages.German
using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

var result = ocr.Read("multilingual-document.jpg");
Imports IronOcr

' Install once: dotnet add package IronOcr.Languages.French
' Install once: dotnet add package IronOcr.Languages.German

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)

Dim result = ocr.Read("multilingual-document.jpg")
$vbLabelText   $csharpLabel

Dil verileri NuGet paketine yerleştirilmiştir. Oluşturulacak klasör yok, yapılandırılacak yol yok, GitHub'dan indirilecek ve doğrulanacak dosya yok. Docker'a bir dil eklemek, .csproj'a bir PackageReference satırı eklemek anlamına gelir. Çoklu diller nasıl yapılır kılavuzu 125'ten fazla dil kataloğunu kapsar ve çok dilli blog yazısı, üretim çok dilli boru hatlarını CJK karakter setleri dahil gösterir.

API Eşleme Başvurusu

Tesseract (charlesw)API IronOCR Karşılığı
new TesseractEngine(tessDataPath, "eng", EngineMode.Default) new IronTesseract()
Pix.LoadFromFile(path) input.LoadImage(path) veya ocr.Read(path)
Pix.LoadFromMemory(bytes) input.LoadImage(bytes)
engine.Process(img) ocr.Read(input)
page.GetText() result.Text
page.GetMeanConfidence() result.Confidence
page.GetHOCRText(0) result.SaveAsHocrFile(path)
engine.Process(img, tessRect) input.LoadImage(path, new CropRectangle(...))
iter.GetText(PageIteratorLevel.Word) result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word) result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds) result.Words[i].X, .Y, .Width, .Height
"eng+fra+deu" dil dizesi ocr.AddSecondaryLanguage(OcrLanguage.French)
Uygun değil — PdfiumViewer veya benzeri gerektirir input.LoadPdf(path)
Uygun değil — PDF kütüphanesi gerektirir input.LoadPdf(path, Password: "secret")
Uygun değil — desteklenmiyor result.SaveAsSearchablePdf(outputPath)
Manuel önişleme boru hattı input.Deskew(), input.DeNoise(), input.Binarize()
Her iş parçacığı başına manuel çoklu iş parçacığı motoru İş parçacığı güvenli tek IronTesseract örneği

Takımlar Tesseract'tan IronOCR'a Geçmeyi Düşündüklerinde

Önişleme Dönüm Noktası Geldiğinde

Her Tesseract projesi, temiz test görüntüleri ile başlar. Örnek faturalar, net taranmış belgeler, ilk okumada çalışan 300 DPI'da PNG dosyaları. Önişleme sorusu ertelenir. Sonra ilk üretim partisi gelir: 150 DPI'da fakslanmış satın alma siparişleri, 3 derece eğimle taranmış sözleşmeler, floresan ışık altında çekilmiş fişlerin fotoğrafları. Doğruluk %60-70 seviyelerine düşer. Takım şimdi ertelenmiş olan önişleme boru hattını uygulamak zorunda kalır, gri tonlamaya dönüştürme ve kontrast iyileştirmenin yönetilebilir olduğunu, ancak uyumun bir Hough dönüşümü gerektirdiğini ve gürültüsüzleştirme için bir medyan filtre gerektiğini ve bunların hiçbirinin iki saatlik iş olmadığını keşfeder. Bu kilometre taşında olan ekipler — ön işleme borcu bir sprint birikimi öğesi haline geldiğinde — IronOCR'u sık sık değerlendirir çünkü lisans maliyeti, onlar için kiralanmadıkları görüntü işleme işinin iki geliştiricinin haftasına göre daha ucuzdur.

PDF Gereksinimi Belirdiğinde

Belge işleme uygulamaları neredeyse her zaman sonunda PDF desteğine ihtiyaç duyar. İlk yanıt genellikle 'PdfiumViewer ekle' olur — bu, iyi belgelenmiştir ve birçok durumda iyi çalışır. Sorunlar üretimde ortaya çıkar: yerel pdfium.dll uygulama dizininde doğru bit boyutunda mevcut olmalı, konteyner görüntüleri Dockerfile'larda açık COPY adımları gerektirir,Linuxdağıtımları ilgili .so dosyasını gerektirir ve şifre korumalı PDF'ler için kendi lisansına sahip ayrı bir şifre çözme kütüphanesi gereklidir. Tesseract yerel kütüphaneleri, Leptonica ve pdfium — dört ortamda (Windows, Linux, Docker, CI) — üç ayrı bağımlılık zincirini yöneten ekipler tek bir paket alternatifi değerlendirmenin değerli hale geldiği bir bakım eşiğine ulaşır.

Ölçekte Paralel İşleme

500 faturayı işleyen bir toplu OCR işi paralellikten yararlanır. charlesw sarmalayıcı ile güvenli paralel işleme deseni, her iş parçacığı için bir motor örneği oluşturur ve her biri 40-100 MB dil modeli verisi yükler. Sekiz iş parçacığında, belgeler yüklenmeden önce bu, 320-800 MB motor belleğidir. OCR hizmetlerini profilleyen ekipler ve bellek baskısının belge içeriği yerine motor başlatma sırasında yoğunlaştığını bulanlar, IronOCR'nin iş parçacığı güvenli tek örnek modeli doğrudan kök nedeni çözdüğünü görürler. çok iş parçacıklı örnek deseni gösterir.

Dağıtım Ortamları Çoğalıyor

Windows'ta başlayan bir proje, bulut dağıtımı için birLinuxkonteyner ekler. Dockerfile artık yerel kütüphane kurulum adımlarına ihtiyaç duyar, tessdata dosyaları konteyner içine kopyalanmalı ve tessdata yol ortam değişkeni doğru ayarlanmalıdır. Sonra birmacOSgeliştirici ekibe katılır. Sonra biri AWS Lambda'ya dağıtım yapmak ister. Her platform sessizce başarısız olabilen başka bir yapılandırma yüzeyi ekler - üretim konteynerında çalışma zamanı eksik olan yerel bir kütüphane, biraz daha yüksek bir NuGet paketi maliyetinden daha kötü bir sonuçtur. IronOCR Dockerdağıtım kılavuzu karşıtlığı gösterir: sistem paketleri yok, tessdata kopyalama adımı yok, ortam değişkeni yok.

Tesseract Versiyon Paritesi Önemlidir

Tesseract 5.x, belirli belge türlerinde ölçülebilir olan LSTM doğruluğunda iyileştirmeler getirmiştir. charlesw sarmalayıcı Tesseract 4.1.1'i hedefler. OCR doğruluğunun zor belgelerde bir ürün kalitesi metriği olduğu ekipler için, versiyon farkı gerçek bir değerlendirme konusudur — özellikle alternatif, mevcut motor sürümünü takip eden ticari olarak sürdürülen bir paket olduğunda.

Genel Geçiş Dikkat Edilmesi Gereken Hususlar

Tessdata Klasörünün Kaldırılması

IronOCR'ye geçtikten sonraki ilk temizlik adımı, tessdata klasörünü silmek ve proje dosyasından ilgili <Content Include="tessdata\**"> öğelerini kaldırmaktır. Sabit kodlanmış yol doğrulama kodu — Directory.Exists(TessDataPath) güvencesi basic-text-extraction-tesseract.cs 'da mevcut — da ortadan kalkar. using Tesseract; ad alanı referansları ve TesseractEngine, Pix ve Page tip referanslarının tümü, using IronOcr;, IronTesseract, OcrInput ve OcrResult ile değiştirilmelidir.

PDF Kütüphanesinin Kaldırılması

Yalnızca Tesseract PDF işleme desteği için eklenen herhangi bir PDF işleme kütüphanesi — PdfiumViewer, PDFtoImage, Docnet.Core — kaldırılabilir. Bu paketlerin gerektirdiği yerel ikili bağımlılıklar (pdfium.dll, GhostScript ikili dosyaları) da ortadan kalkar. Dockerfile COPY ve apt-get bu bağımlılıklar için satırlara artık ihtiyaç yok. IronOCR PDF giriş kılavuzu, bu kütüphanelerin ele aldığı her PDF giriş varyasyonunu, sayfa aralığı seçimini ve şifreyle korunmuş belgeler dahil ele alır. Tüm render-sonrası-OCR bloğu — tipik olarak üç kütüphaneyi kapsayan 50-80 satır — input.LoadPdf(path) ardından tek bir Read() çağrısına kadar küçülür.

Önişleme Kodunun Değiştirilmesi

Mevcut ön işleme yöntemleri — ConvertToGrayscale, EnhanceContrast, Binarize, RemoveNoise, Deskew, ScaleToDpi — doğrudan IronOCR filtre yöntemleriyle eşleşir. Geçici dosya kaydet-ve-yükle düzeni tamamen ortadan kalkar. Renk özgül dönüşümler için görüntü renk düzeltme kılavuzuna ve çözünürlük yönetimi için DPI ayarları kılavuzuna başvurun.

İş Parçacığı Modeli Değişikliği

Kod, her iş parçacığı için bir TesseractEngine oluşturduğu Parallel.ForEach döngüsünde — bir IronTesseract oluşturup tüm iş parçacıkları arasında paylaşmaya dönüştürülür. Bu bir doğruluk değişikliği, yalnızca bir yeniden düzenleme değil: eski düzen, iş parçacığı güvenli olmayan bir API etrafında savunmacı programlama idi; yeni düzen, iş parçacığı güvenli bir API'nin amaçlanan kullanımıdır. Her iş parçacığı başına motor başlatma yükü — iş parçacığı başına 40-100 MB dil modeli verisi — değişiklikle birlikte ortadan kalkar çünkü IronOCR, motor örneği başına tam model durumu yüklemek yerine paylaşılan bir iç havuz tutar.

Ek IronOCR Yetenekleri

Önişlemeyi ve PDF desteğini aşan IronOCR, çapraz karşılaştırmayı çok aşan yetenekler içerir:

  • Bölge tabanlı OCR: Tam görüntüyü işlemeye gerek kalmadan bir tanımlanmış kırpma dikdörtgeninden metin çıkarın. bölge OCR kılavuzu ve kırpma örneği, fatura başlığı çıkarımını ve form alanı izolasyonunu kapsar.
  • Güven bazlı kalite yönlendirme: result.Confidence, belgeleme düzeyinde bir doğruluk tahmini sunar ve düşük güven sonuçlarının iki kez OCR çalıştırmak zorunda kalmadan insan inceleme kuyruğuna yönlendirilmesini sağlar. güven puanları kılavuzunu inceleyin.
  • Async OCR: Bir CPU-bağımlı işlemde istek iş parçacığını engellemenin kabul edilemez olduğu ASP.NET Core uygulamaları için async OCR kılavuzu kapsar.
  • Özel belge türleri: Pasaport okuma, MICR/çek okuma, ve plaka okuma, özel eğitim modelleri gerektirmeden hedeflenen özellikler olarak mevcuttur.
  • Hız yapılandırması: hız optimizasyon kılavuzu ve hız ayarı örneği yüksek yüksek-throughput toplu işlem durumunda belgeler arası gecikmenin önemli olduğu yerlerde yapılandırma seçeneklerini belgelemektedir.

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

IronOCR, .NET 6, .NET 7, .NET 8 ve .NET 9'u hedefler, ve 2026 sürümünde .NET 10 için aktif destek verir. Kütüphane ayrıca modern .NET'e henüz geçiş yapmamış projeler için .NET Standard 2.0'ı destekler. charlesw Tesseract sarımı, .NET Standard 2.0'ı hedefler ve 2019'dan Tesseract motor sürümü 4.1.1'e sabitlenmiştir, bu paket aracılığıyla Tesseract 5.x desteği için herhangi bir duyurulmuş yol haritası yoktur. Yeni başlayan projeler ve çok yıllı bakım pencereleri planlayan ekipler için, motor sürümü farkı ve sarımın yavaşlayan bakım temposu, sıfır maliyetli lisansın yanında değerlendirmeye değer faktörlerdir.

Sonuç

charlesw NuGet sarımı aracılığıyla Tesseract, sahici bir OCR motorudur, oyuncak değildir. 8 milyon indirme sayısı, gerçek uygulamalarda gerçek kullanımı yansıtır ve temiz, iyi biçimlendirilmiş görüntülerde popülaritesini haklı çıkaran doğruluk seviyelerine ulaşır. Dürüst karşılaştırma, OCR kalitesi ile ilgili değil — üretim koşullarında bu kalitenin sağlanması için gereken mühendislik çalışmasının yüzeyi ile ilgilidir.

Önişleme boşluğu, merkezi bir değiş tokuştur. Gerçek dünyadaki belgelerde iyi doğruluğu kötü doğruluktan ayıran yaklaşık 180 satır görüntü manipülasyonu kodu küçümsenecek bir engel değildir. Bu, görüntü işleme bilgisi, ek bağımlılıklar ve yeni belge türleri çıktıkça devam eden bakım gerektiren bir mühendislik görevidir. PDF boşluğu başka bir katman ekler: ikinci bir kütüphane, ikinci bir yerel ikili seti, başka bir dağıtım yüzeyi ve GhostScript veya iText ile potansiyel lisans karmaşıklıkları. Bir prototipi bir üretim sisteminden ayıran 20-40 saatlik kurulum tahmininin nedeni birlikte, bu iki boşluktur.

IronOCR, her iki boşluğu doğrudan ele alır: önişleme, tek bir satır yöntem çağrısıdır, PDF yerel bir giriş formatıdır ve tüm çözüm tek bir NuGet paketi olarak dağıtılır. $999 süresiz lisansı, iki hafta boyunca görüntü işleme kodu ve bağımlılık zinciri yönetimi üzerine harcama yapmamanın maliyetidir. Geliştirici zamanının lisans fiyatından daha pahalıya mal olduğu ekipler için, matematik açıktır. Açık kaynak lisans gereklilikleri veya sıfır bütçeli ekipler için, Tesseract, onunla birlikte gelen mühendislik yatırımı hakkında açık bir görüşe sahip olarak ilerleme yoludur.

Karar, belge türlerine ve operasyonel bağlama temiz bir şekilde haritalanır: tek ortam dağıtımında temiz, kontrol edilmiş görüntüler Tesseract'ın ücretsiz lisansını destekler. Gerçek dünya taramaları, PDF iş akışları, çoklu ortam dağıtımı ve ölçekte paralel işleme, hesaplamayı IronOCR'yi yönlendiren sürtüşmeyi her biri ekler. Çoğu üretim belge işleme sistemleri en az iki bu durumla karşılaşır.

Lütfen dikkate alınGhostscript, PDFium, PDFSharp, Tesseract ve iText, ilgili sahiplerinin tescilli markalarıdır. Bu site, Artifex Software, Chromium Project, Google, empira Software GmbH veya iText Group ile bağlantılı, onaylanmış veya desteklenmiş değildir. Tüm ürün adları, logolar ve markalar, ilgili sahiplerinin malı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

Tesseract OCR nedir?

Tesseract OCR, 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ğerlendirilmiştir.

IronOCR, Tesseract OCR ile nasıl karşılaştırılır?

IronOCR, IronTesseract'ı çekirdek motor olarak kullanan bir NuGet yerel .NET OCR kütüphanesidir. Tesseract OCR 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 Tesseract OCR'den 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.

Tesseract OCR ile IronOCR arasında ne tür 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.

Tesseract OCR 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, Tesseract OCR'dan 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, Tesseract OCR 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.

Tesseract OCR'dan IronOCR'a geçiş kolay mı?

Tesseract OCR'dan 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