IRONSOFTWAREHOME
DIĞER BILEŞENLERLE KARŞILAŞTIRIN

ABBYY FineReader vs Tesseract: OCR Karşılaştırması

Curtis Chau
Curtis Chau
Updated: 28 Haziran 2026

OCR.space'in NuGet paketi yok. Bu tek gerçek, bir .NET geliştiricisinin onu seçerken yaptığı her entegrasyon kararını tanımlar: kendi özel HttpClient kodunuzu yazarsınız, belgelerinizi base64 kodlar, https://api.ocr.space/parse/image POST edersiniz, JSON yanıtını elle işler, HTTP 429'larını yakalarsınız, üstel geri alma uygularsınız, oran sınırlayıcı defter tutucusu oluşturur ve uygulamanıza bir metin karakteri gelmeden önce kendi özel hata türlerinizi belirlersiniz. Bu makale, bu DIY yükün kod, zaman ve üretim güvenilirliğinde ne maliyeti olduğunu incelemekte ve bunu, tek bir NuGet paketi olarak teslim edilen IronOCR ile doğrudan karşılaştırmaktadır.

OCR.space Anlama

OCR.space, OCR.space tarafından işletilen uzak sunucular üzerinde görüntü ve PDF işleyen freemium bir REST API'dir. Hizmet, kredi kartı gerektirmeyen aylık 25.000 talebi içeren ücretsiz katman etrafında konumlanıyor, bu da OCR ile denemeler yapan geliştiricilere veya kişisel projelerini geliştirenlere hitap ediyor. NuGet paketi yok, resmi .NET SDK yok ve herhangi bir dilde güçlü bir şekilde uyarlanmış istemci kütüphanesi yok. Her .NET entegrasyonu el yapımıdır ve HttpClient üzerine inşa edilmiştir.

.NET geliştiricileri için mimari gerçeklik:

  • NuGet paketi yok: İlk sınıf .NET desteği sıfır. IntelliSense yok, uyarlanmış modeller yok, entegre hata işleme yok.
  • Sadece bulutta işleme: Her belge altyapınızı terk eder. Yerinde (on-premise) bir seçenek ve kendi barındırılan dağıtım yolu yok.
  • Manuel REST entegrasyonu: Geliştiriciler dosyaları base64'e kodlar, FormUrlEncodedContent veya MultipartFormDataContent oluşturur ve ham JSON yanıtlarını işler.
  • DIY hız sınır yapısı: Ücretsiz katman, IP başına dakikada 60 istek ve günlük 500 istek zorlar. Üretim uygulamaları bu mantığı kendileri inşa etmelidir.
  • Dosya boyutu sınırlamaları: Ücretsiz katman, 5 MB üzeri dosyaları reddeder. Çok sayfalı PDF'ler genellikle bu limiti aşar.
  • Ücretsiz katmanda düz PDF çıktısı: Ücretsiz katmandaki aranabilir PDF oluşturma, OCR.space filigranlarını yerleştirir, çıktının müşteri teslimatı veya belge arşivleme için kullanılmaz hale getirir.
  • SLA yok: Ücretsiz katman, çalışma zamanı taahhüdü taşımaz. Ücretli planlar daha yüksek sınırlar sunar, ancak aynı mimari kısıtlamalara sahiptir.

REST Entegrasyonu Geliştiriciler Yazmalıdır

OCR.space'in belgeleri, geliştiricileri REST uç noktasına yönlendirir ve diğer her şeyi inşa etmeleri için bırakır. Minimum sürdürülebilir .NET istemcisi — üretim sertleştirmesi düşüncesi öncesinde — böyle görünür:

// OCR.space: what you build before the first line of your actual application
public class OcrSpaceApiClient : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;
    private readonly SemaphoreSlim _rateLimiter;
    private const string ApiEndpoint = "https://api.ocr.space/parse/image";
    private const int MaxFileSizeFree = 5 * 1024 * 1024; // 5MB — hard limit on free tier
    private const int RateLimitPerMinute = 60;

    public OcrSpaceApiClient(string apiKey)
    {
        _apiKey = apiKey ?? throw new ArgumentNullException(nameof(apiKey));
        _httpClient = new HttpClient();
        _httpClient.Timeout = TimeSpan.FromSeconds(120);
        _rateLimiter = new SemaphoreSlim(RateLimitPerMinute, RateLimitPerMinute);
    }

    public async Task<OcrResult> ExtractTextFromFileAsync(
        string filePath,
        string language = "eng",
        CancellationToken cancellationToken = default)
    {
        if (!File.Exists(filePath))
            throw new FileNotFoundException("Image file not found", filePath);

        var fileInfo = new FileInfo(filePath);
        if (fileInfo.Length > MaxFileSizeFree)
        {
            throw new InvalidOperationException(
                $"File size {fileInfo.Length / 1024 / 1024}MB exceeds free tier limit of 5MB.");
        }

        await _rateLimiter.WaitAsync(cancellationToken);

        try
        {
            // Document leaves your infrastructure here
            byte[] imageBytes = await File.ReadAllBytesAsync(filePath, cancellationToken);
            string base64Image = Convert.ToBase64String(imageBytes);
            string mimeType = GetMimeType(filePath);

            var formContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("apikey", _apiKey),
                new KeyValuePair<string, string>("base64Image", $"data:{mimeType};base64,{base64Image}"),
                new KeyValuePair<string, string>("language", language),
                new KeyValuePair<string, string>("isOverlayRequired", "false"),
                new KeyValuePair<string, string>("filetype", Path.GetExtension(filePath).TrimStart('.')),
                new KeyValuePair<string, string>("detectOrientation", "true"),
                new KeyValuePair<string, string>("scale", "true"),
                new KeyValuePair<string, string>("OCREngine", "2")
            });

            var response = await _httpClient.PostAsync(ApiEndpoint, formContent, cancellationToken);

            if (!response.IsSuccessStatusCode)
            {
                string errorBody = await response.Content.ReadAsStringAsync(cancellationToken);
                throw new OcrSpaceException(
                    $"OCR.space API returned {response.StatusCode}: {errorBody}",
                    (int)response.StatusCode);
            }

            string jsonResponse = await response.Content.ReadAsStringAsync(cancellationToken);
            return ParseOcrResponse(jsonResponse);
        }
        finally
        {
            _ = Task.Run(async () =>
            {
                await Task.Delay(60000 / RateLimitPerMinute);
                _rateLimiter.Release();
            });
        }
    }

    private OcrResult ParseOcrResponse(string jsonResponse)
    {
        using var doc = JsonDocument.Parse(jsonResponse);
        var root = doc.RootElement;

        if (root.TryGetProperty("IsErroredOnProcessing", out var isErrored) && isErrored.GetBoolean())
        {
            string errorMessage = "OCR processing failed";
            if (root.TryGetProperty("ErrorMessage", out var errorMessages))
            {
                // Parse the array of error strings manually
                var messages = new List<string>();
                if (errorMessages.ValueKind == JsonValueKind.Array)
                {
                    foreach (var msg in errorMessages.EnumerateArray())
                        messages.Add(msg.GetString() ?? "Unknown error");
                }
                errorMessage = string.Join("; ", messages);
            }
            throw new OcrSpaceException(errorMessage, 500);
        }

        var result = new OcrResult();

        if (root.TryGetProperty("ParsedResults", out var parsedResults))
        {
            foreach (var parsedResult in parsedResults.EnumerateArray())
            {
                if (parsedResult.TryGetProperty("ParsedText", out var parsedText))
                    result.ParsedText += parsedText.GetString();

                if (parsedResult.TryGetProperty("FileParseExitCode", out var exitCode))
                    result.ExitCodes.Add(exitCode.GetInt32());
            }
        }

        return result;
    }

    private string GetMimeType(string filePath) =>
        Path.GetExtension(filePath).ToLowerInvariant() switch
        {
            ".png"          => "image/png",
            ".jpg" or ".jpeg" => "image/jpeg",
            ".bmp"          => "image/bmp",
            ".tiff" or ".tif" => "image/tiff",
            ".pdf"          => "application/pdf",
            _               => "application/octet-stream"
        };

    public void Dispose()
    {
        _httpClient?.Dispose();
        _rateLimiter?.Dispose();
    }
}

// Custom models — no SDK means you define these yourself
public class OcrResult
{
    public string ParsedText { get; set; } = string.Empty;
    public List<string> Warnings { get; } = new();
    public List<int> ExitCodes { get; } = new();
}

public class OcrSpaceException : Exception
{
    public int StatusCode { get; }
    public OcrSpaceException(string message, int statusCode) : base(message)
        => StatusCode = statusCode;
}

Bu, ilk iş mantığı yönteminden önce var olan 90+ satır altyapı kodudur. Her OCR.space entegrasyonu bu şablonu (veya eşdeğer bir şeyi) gönderir ve bunu yazan her ekip aynı sorunu çözüyor, OCR.space onların adına çözmemeyi seçmiştir.

IronOCR'u Anlamak

IronOCR, .NET için ticari bir OCR kütüphanesidir ve IronOcr NuGet paketi aracılığıyla yüklenir. Bu, otomatik ön işleme, yerel PDF girişi, aranabilir PDF çıkışı, 125+ dil paketi ve yapılandırılmış sonuç çıkarımı ile optimize edilmiş bir Tesseract 5 motorunu kapsar — hepsi bulut bağımlılığı, API anahtarları veya istek başına ücretler olmadan. Belgeler, .NET uygulamasını çalıştıran herhangi bir altyapı üzerinde yerel olarak işlenir.

Anahtar özellikler:

  • Tek NuGet paketi: dotnet add package IronOcr tam kurulumdur. Yönetilecek yerel ikililer yok, tessdata dizinleri yok, ortam değişkenleri yok.
  • Güçlü tipte API: IronTesseract, OcrInput, OcrResult ve CropRectangle, tam IntelliSense desteğine sahip birinci sınıf .NET türleridir.
  • Otomatik ön işleme: Deskew, DeNoise, Kontrast, Binarize ve EnhanceResolution filtreleri, harici kütüphaneler olmadan otomatik olarak veya isteğe bağlı olarak uygulanır.
  • Yerel PDF desteği: Hem taranmış PDF'leri okuma hem de aranabilir PDF'ler oluşturma yerleşiktir. Kullanılabilir belleğin ötesinde boyut sınırlaması yok.
  • Yerel yürütme: OCR sırasında hiçbir ağ çağrısı gerçekleşmez. Kütüphane tamamen sürecin içinde çalışır. İzole ortamlarda yapılandırma değişiklikleri olmaksızın çalışır.
  • İş parçacığı güvenli: Birden fazla IronTesseract örneği kilitleme veya çekişme yönetimi olmadan aynı anda çalışır.
  • Süresiz lisanslama: $999 Lite / $1,499 Plus / $2,399 Professional. Herhangi bir hacimde istek başına ücret yok.

Özellik Karşılaştırması

ÖzellikOCR.spaceIronOCR
NuGet paketiYok — REST API sadeceIronOcr — tam .NET desteği
İşleme yeriOCR.space bulut sunucularıYerel — altyapınız
Ücretsiz katman25.000 istek/ay (sınırlı)Deneme mevcut
Ücretli fiyatlandırmaGüncel fiyatlandırma için OCR.space ile iletişime geçin$2,399 bir kerelik süresiz
Hız sınırlama60 istek/dak, 500/gün (ücretsiz)None
Çevrimdışı yetenekHayırEvet — tamamen izole
Veri gizliliğiBelgeler üçüncü tarafa gönderilirBelgeler sunucularınızda kalır

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

ÖzellikOCR.spaceIronOCR
Entegrasyon
NuGet paketiNoneEvet (IronOcr)
Kuvvetli-tipli modellerYok — elle JSON çözümülemeEvet (OcrResult, OcrInput)
IntelliSense desteğiNoneTam
Özel istisna türleriKendiniz tanımlamalısınızYerleşik
Yeniden deneme mantığıKendiniz inşa etmelisinizYerleşik
İşleme
İşleme yeriBulut sunucularYerel işlem içinde
İnternet gerekliEvet — her çağrıHayır
İzole destekHayırEvet
Oran sınırlamalarıEvet — tüm planlarNone
Dosya boyutu sınırları5 MB (ücretsiz katman)Sadece bellek
OCR Yetenekleri
Görüntü OCREvetEvet
PDF OCREvet (sınırlı)Evet (yerel, boyut sınırı yok)
Aranabilir PDF çıktısıÜcretsiz katmanda filigranlıTemiz çıktı, filigran yok
Otomatik ön işlemYok (sadece sunucu tarafı)Deskew, DeNoise, Contrast, Binarize, EnhanceResolution
Elle ön işleme kontrolüNoneTam filtre API'si
Dil desteği~25 dil125+ NuGet dil paketleri aracılığıyla
Her belge için çoklu dilSınırlıEvet — birincil + ikincil diller
Yapılandırılmış çıktı (kelimeler/satırlar/sayfalar)Yok — sadece düz metinEvet — sayfalar, paragraflar, satırlar, kelimeler koordinatlarla
Güven skoruHayırEvet — her sonuç ve kelime başına
Bölge bazlı OCRHayırEvet — CropRectangle
OCR sırasında barkod okumaHayırEvet — ReadBarCodes = true
Dağıtım
DockerDışa doğru internet gerektirirKutudan çıkar çıkmaz çalışır
LinuxDışa doğru internet gerektirirTam destekli
HIPAA uyumluRisk — belgeler kontrolünüzden çıkarEvet — dışa aktarım yok
GDPR uyumluRisk — AB veri transferi belirsizEvet — üçüncü taraf veri işleme yok
Fiyatlandırma
Fiyatlandırma modeliAylık abonelikTek seferlik süresiz lisans
Giriş fiyatıGüncel fiyatlandırma için OCR.space ile iletişime geçin$999 bir kerelik
Ölçekli belge başına maliyetEvetNone
SLAYok (ücretsiz), değişir (ücretli)KurumsalSLAmevcut

SDK Derinliği vs. Ham HTTP: Entegrasyon Maliyeti

OCR.space ile yerel bir SDK arasındaki fark bir stil tercihi değildir. Geliştirme süresinde, hata alanı yüzeyinde ve her dağıtımda bakım yükünde ölçülür.

OCR.space Yaklaşımı

OCR.space'i kullanan her .NET geliştiricisi kendi HTTP istemcisini yazar. En basit olası uygulama — yeniden deneme mantığı olmadan, toplu destek olmadan ve ön işleme yapmadan — hala50+satırdır:

// OCR.space: minimum viable extraction —50+lines before business logic
public class OcrSpaceBasicExtraction
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;

    public OcrSpaceBasicExtraction(string apiKey)
    {
        _apiKey = apiKey;
        _httpClient = new HttpClient();
    }

    public async Task<string> ExtractText(string imagePath)
    {
        // Read file and encode — document leaves your infrastructure
        byte[] imageBytes = File.ReadAllBytes(imagePath);
        string base64 = Convert.ToBase64String(imageBytes);

        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("apikey", _apiKey),
            new KeyValuePair<string, string>("base64Image", $"data:image/png;base64,{base64}"),
            new KeyValuePair<string, string>("language", "eng")
        });

        // Send to cloud
        var response = await _httpClient.PostAsync(
            "https://api.ocr.space/parse/image", content);

        if (!response.IsSuccessStatusCode)
            throw new Exception($"API error: {response.StatusCode}");

        // Parse JSON manually — no typed models
        string json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);

        return doc.RootElement
            .GetProperty("ParsedResults")[0]
            .GetProperty("ParsedText")
            .GetString() ?? string.Empty;
    }
}
C#

Toplu işlem ekleyin ve satır sayısı, çünkü her toplu istek hız sınırı daraltması, yeniden deneme mantığı üssel geri adımla ve HTTP 429 yanıtlarına açıkça düzenleme gerektirir. PDF işlemi ekleyin ve her çağrıdan önce 5 MB dosya boyutu kontrolü eklemeniz gerektiği için satır sayısı, çünkü ücretsiz katman, daha büyük dosyaları bir uyarı yerine bir hatayla reddedecektir.

IronOCR Yaklaşımı

IronOCR'yi NuGet'ten yüklemek, var olan yöntem çağrıları ile tüm bu altyapı kodunu değiştirir:

// IronOCR: complete implementation
var result = new IronTesseract().Read("invoice.png");
Console.WriteLine(result.Text);

IronTesseract sınıfı, dosya okuma, ön işleme, motor çalıştırma ve sonuç yapımı işlemlerini yönetir. Hiçbir HTTP istemcisi yok. Base64 kodlama yok. JSON çözümleme yok. API anahtarı yok. Hız sınırlandırıcı yok. Giriş varyasyonlarını kapsayan görüntülerden metin okuma eğitimi, - dosya yolları, bayt dizileri, akışlar, bit eşlemeler - aynı tek çağrı desenini takip eder.

Kaynak dosyalardaki kod karmaşıklığı sayıları varsayımsal değildir:

SenaryoOCR.space SatırlarıIronOCR Satırları
Temel çıkarım50+3
PDF işlemi60+12
Toplu işlem80+15
Hata işleme70+15
Tam istemci altyapısı200+0 (NuGet sağlar)

Toplu İşleme ve Hız Sınırları

Hız sınırı sorunu, OCR.space'in ücretsiz katmanının gerçek üretim koşulları altında açıkça bozulduğu yerdir.

OCR.space Yaklaşımı

OCR.space altında yığın işleme, 60 istek-dakika başı kısıtlaması içinde kalmak için bir SemaphoreSlim oluşturmayı ve yönetmeyi gerektirir, artı semafor mantığı hassas olmadığında veya paylaşılan altyapı bir IP adresi paylaştığında gönderilen HTTP 429 yanıtları için üstel geri alma deneme mantığı eklenmelidir:

// OCR.space batch:80+lines of rate-limit plumbing before actual work
public class OcrSpaceBatchProcessing
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;
    private readonly SemaphoreSlim _rateLimiter;

    public OcrSpaceBatchProcessing(string apiKey)
    {
        _apiKey = apiKey;
        _httpClient = new HttpClient();
        _rateLimiter = new SemaphoreSlim(60, 60); // Free tier: 60/minute
    }

    public async Task<Dictionary<string, string>> ProcessBatch(string[] imagePaths)
    {
        var results = new Dictionary<string, string>();

        foreach (var imagePath in imagePaths)
        {
            await _rateLimiter.WaitAsync();

            try
            {
                string text = await ProcessWithRetry(imagePath);
                results[imagePath] = text;
            }
            finally
            {
                _ = Task.Run(async () =>
                {
                    await Task.Delay(1000); // 1 second spacing
                    _rateLimiter.Release();
                });
            }
        }

        return results;
    }

    private async Task<string> ProcessWithRetry(string imagePath, int maxRetries = 3)
    {
        for (int attempt = 0; attempt < maxRetries; attempt++)
        {
            try
            {
                byte[] imageBytes = File.ReadAllBytes(imagePath);
                string base64 = Convert.ToBase64String(imageBytes);

                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("apikey", _apiKey),
                    new KeyValuePair<string, string>("base64Image", $"data:image/png;base64,{base64}"),
                    new KeyValuePair<string, string>("language", "eng")
                });

                var response = await _httpClient.PostAsync(
                    "https://api.ocr.space/parse/image", content);

                if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
                {
                    // Rate limited — exponential backoff
                    await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
                    continue;
                }

                response.EnsureSuccessStatusCode();

                string json = await response.Content.ReadAsStringAsync();
                using var doc = JsonDocument.Parse(json);

                return doc.RootElement
                    .GetProperty("ParsedResults")[0]
                    .GetProperty("ParsedText")
                    .GetString() ?? string.Empty;
            }
            catch (HttpRequestException) when (attempt < maxRetries - 1)
            {
                await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
            }
        }

        throw new Exception($"Failed to process {imagePath} after {maxRetries} attempts");
    }
}
C#

Ücretsiz katmandaki 500 günlük isteği daha fazla sınırlar. Tek bir günde 600 belge işleyen bir uygulama, ertesi takvim günü otomatik devir olmaksızın yarı yolda başarısız olacak.

IronOCR Yaklaşımı

IronOCR'de hız sınırları yoktur. Toplu işlem bir döngüdür:

//IronOCR batch: 8 lines, no rate limits, no retries needed
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
    var results = new Dictionary<string, string>();
    var ocr = new IronTesseract();

    foreach (var imagePath in imagePaths)
    {
        //Hayırrate limits, no retries, no cloud dependency
        var result = ocr.Read(imagePath);
        results[imagePath] = result.Text;
    }

    return results;
}
C#

Yığın boyunca IronTesseract örneğini yeniden kullanmak, tekrar eden motor başlatma maliyetinden kaçınır. İşleme hızı uzak bir API'nin kısıtlama politikası ile değil, yerel CPU ve disk I/O ile sınırlıdır. Çok iş parçacıklı örnek, yığın söz konusu olduğunda çekirdekler arasında paralel nasıl çalışılacağını gösterir.

PDF İşleme

PDF desteği ikinci ana yapısal boşluğu illüstre eder.

OCR.space Yaklaşımı

OCR.space, ücretli planlarda ve kısmen ücretsiz katmanda PDF yüklemeleri kabul eder, ancak ücretsiz hesaplarda 5 MB dosya boyutu tavanı çoğu çok sayfalı belgeyi dışlar. Ücretsiz katmanla aranabilir PDF çıkışı filigran içerir. Uygulama, her talep öncesinde sayfa başına sonuç çıkışını ve açık dosya boyutu kontrolü gerektirir:

// OCR.space PDF: size check required, watermarks on free tier
public async Task<List<string>> ExtractTextFromPdf(string pdfPath)
{
    var pageTexts = new List<string>();

    // Reject before wasting a request quota entry
    var fileInfo = new FileInfo(pdfPath);
    if (fileInfo.Length > 5 * 1024 * 1024)
        throw new InvalidOperationException("File exceeds 5MB free tier limit. Upgrade or split PDF.");

    byte[] pdfBytes = File.ReadAllBytes(pdfPath);
    string base64 = Convert.ToBase64String(pdfBytes);

    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("apikey", _apiKey),
        new KeyValuePair<string, string>("base64Image", $"data:application/pdf;base64,{base64}"),
        new KeyValuePair<string, string>("language", "eng"),
        new KeyValuePair<string, string>("filetype", "PDF"),
        new KeyValuePair<string, string>("isCreateSearchablePdf", "false") // Watermarked on free tier
    });

    var response = await _httpClient.PostAsync("https://api.ocr.space/parse/image", content);

    if (!response.IsSuccessStatusCode)
        throw new Exception($"API error: {response.StatusCode}");

    string json = await response.Content.ReadAsStringAsync();
    using var doc = JsonDocument.Parse(json);

    if (doc.RootElement.TryGetProperty("ParsedResults", out var results))
    {
        foreach (var result in results.EnumerateArray())
        {
            if (result.TryGetProperty("ParsedText", out var text))
                pageTexts.Add(text.GetString() ?? string.Empty);
        }
    }

    return pageTexts;
}

IronOCR Yaklaşımı

IronOCR, PDF'leri yerel olarak okur. Limit, keyfi bir dosya boyutu eşiği değil, mevcut bellektir. Aranabilir PDF çıktısı, her lisans katmanında filigransız temiz dosyalar üretir:

//IronOCR PDF: native support, no size limit, no watermarks
public List<string> ExtractTextFromPdf(string pdfPath)
{
    var pageTexts = new List<string>();

    using var input = new OcrInput();
    input.LoadPdf(pdfPath); //Hayır5MB ceiling

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

    foreach (var page in result.Pages)
        pageTexts.Add(page.Text);

    return pageTexts;
}

// Generate searchable PDF — no watermarks
public void CreateSearchablePdf(string inputPath, string outputPath)
{
    var result = new IronTesseract().Read(inputPath);
    result.SaveAsSearchablePdf(outputPath);
}
C#

Şifre korumalı PDF'ler tek bir parametredir: input.LoadPdf("encrypted.pdf", Password: "secret"). PDF OCR nasıl yapılır kılavuzu, sayfa aralığı seçimi ve şifre işlemini ayrıntılı olarak ele almaktadır. Aranabilir PDF oluşturma kalıpları için aranabilir PDF nasıl yapılır kılavuzuna bakın.

Hata Yönetimi

OCR.space, hataları iki ayrı kanal üzerinden iletir: HTTP durum kodları ve bir JSON IsErroredOnProcessing bayrağı. Üretim kodu her ikisini de kontrol etmeli, IsErroredOnProcessing doğru olduğunda JSON hata dizisini parçalara ayırmalı ve kısmi arızalar için sayfa başına FileParseExitCode değerlerini incelemelidir. Bunların hiçbiri tiplenmiş değildir — her şey JsonDocument üzerinden metin ayrımıdır:

// OCR.space: two error layers, all string-based
public async Task<string> SafeExtract(HttpClient client, string apiKey, string imagePath)
{
    try
    {
        byte[] imageBytes = File.ReadAllBytes(imagePath);
        string base64 = Convert.ToBase64String(imageBytes);

        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("apikey", apiKey),
            new KeyValuePair<string, string>("base64Image", $"data:image/png;base64,{base64}")
        });

        var response = await client.PostAsync("https://api.ocr.space/parse/image", content);

        if (!response.IsSuccessStatusCode)
        {
            switch (response.StatusCode)
            {
                case System.Net.HttpStatusCode.Unauthorized:
                    throw new Exception("Invalid API key");
                case System.Net.HttpStatusCode.TooManyRequests:
                    throw new Exception("Rate limit exceeded — wait and retry");
                case System.Net.HttpStatusCode.PaymentRequired:
                    throw new Exception("Quota exceeded — upgrade plan");
                default:
                    throw new Exception($"API error: {response.StatusCode}");
            }
        }

        // Second error layer: JSON-level failures
        string json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);

        if (doc.RootElement.TryGetProperty("IsErroredOnProcessing", out var isError)
            && isError.GetBoolean())
        {
            var messages = new List<string>();
            if (doc.RootElement.TryGetProperty("ErrorMessage", out var errors))
            {
                foreach (var e in errors.EnumerateArray())
                    messages.Add(e.GetString() ?? "Unknown error");
            }
            throw new Exception(string.Join("; ", messages));
        }

        // Third layer: per-page exit codes
        if (doc.RootElement.TryGetProperty("ParsedResults", out var results))
        {
            foreach (var result in results.EnumerateArray())
            {
                if (result.TryGetProperty("FileParseExitCode", out var exitCode)
                    && exitCode.GetInt32() != 1)
                    throw new Exception($"Page parse failed: exit code {exitCode.GetInt32()}");
            }
        }

        return doc.RootElement
            .GetProperty("ParsedResults")[0]
            .GetProperty("ParsedText")
            .GetString() ?? string.Empty;
    }
    catch (JsonException ex)
    {
        throw new Exception($"Invalid API response: {ex.Message}");
    }
    catch (HttpRequestException ex)
    {
        throw new Exception($"Network error: {ex.Message}");
    }
}

IronOCR, açık mesajlarla standart .NET istisnalarını yükseltir. JSON ayrıştırma yok, HTTP durum kodu değiştirme yok, katmanlı hata çıkarımı yok:

// IronOCR: standard .NET exceptions
public string SafeExtract(string imagePath)
{
    try
    {
        var result = new IronTesseract().Read(imagePath);
        return result.Text;
    }
    catch (FileNotFoundException)
    {
        throw; // File not found — straightforward
    }
    catch (Exception ex) when (ex.Message.Contains("corrupt"))
    {
        throw new Exception($"Image file is corrupt: {imagePath}");
    }
    //HayırJSON errors.HayırHTTP errors.Hayırrate limit errors.
}
C#

IronTesseract API referans dokümanı ve OcrResult API referans dokümanı, çıkarım kalitesinin değerlendirilmesi için Confidence özelliği de dahil olmak üzere tiplenmiş sonuç yapısını belgeler.

API Eşleme Başvurusu

OCR.space KonseptiIronOCR Karşılığı
POST https://api.ocr.space/parse/imagenew IronTesseract().Read(path)
FormUrlEncodedContent / MultipartFormDataContentOcrInput
base64Image parametresiinput.LoadImage(path) veya input.LoadImage(bytes)
language parametresiocr.Language = OcrLanguage.English
OCREngine parametresiMotor dahili olarak yönetiliyor
isOverlayRequired parametresiresult.Words / result.Lines (her zaman mevcut)
isCreateSearchablePdf parametresiresult.SaveAsSearchablePdf(outputPath)
filetype=PDF parametresiinput.LoadPdf(path)
ParsedResults[0].ParsedTextresult.Text
ParsedResults[n] (sayfa başına)result.Pages[n].Text
IsErroredOnProcessing JSON bayrağıStandart .NET istisnası
FileParseExitCode sayfa başına bayrakStandart .NET istisnası
ProcessingTimeInMillisecondsVarsayılan – ekstra ayrıştırma gerekmez
HTTP 429 / oran limitiGeçerli değil — hız sınırları yok
Özel OcrResult POCO (kullanıcı tanımlı)IronOcr.OcrResult (NuGet tarafından sağlanır)
Özel OcrSpaceException (kullanıcı tanımlı)Standart .NET istisna türleri
SemaphoreSlim hız sınırlayıcı (kullanıcı tarafından yapılmış)Gerekli değil
Her istekte API anahtarıIronOcr.License.LicenseKey (başlangıçta bir kez)

Takımlar OCR.space'den IronOCR'ye Geçmeyi Düşündüklerinde

Yük Testi Sırasında Ücretsiz Katmanı Aşmak

OCR.space'in IP başına günlük 500 istek tavanı, yumuşak bir öneri değil, katı bir duvardır. Ekipler bunu, bir ofis IP adresini paylaşan birden çok geliştiricinin olduğu yük testi veya sahne dağıtımlarında keşfeder. OCR.space'e karşı entegrasyon testleri yürüten paylaşılan bir CI/CD hattı, iş günü bitmeden günlük kotayı tüketecektir. Bu noktada uygulama hata verir, çünkü kod yanlış olduğu için değil, üçüncü bir tarafın sayacı keyfi bir eşik seviyesine ulaştığı için. Yerel işleme geçmek, bu hata kategorisini tamamen ortadan kaldırır – işleme işlemi yerinde çalıştığı için tükenilecek bir kota yoktur.

Uyumluluk ve Veri Sınıflandırması İncelemeleri

Belgeleri PII, PHI veya finansal olarak hassas olarak sınıflandıran güvenlik incelemeleri, OCR.space için ikili bir sorun yaratır: hizmetin dahili dağıtım yolu yoktur. HIPAA senaryoları için belgelenmiş bir İş Ortağı Anlaşması (BAA) eşdeğeri, GDPR altında AB veri aktarımlarını net bir şekilde yöneten bir Veri İşleme Anlaşması yapısı ve belgenin gönderilmesini engelleyecek bir teknik mekanizma, sözleşme kontrolleri olsa bile, yoktur. Bulut üzerinden aktarılan belge işlemeye karşı uyumluluk bulguları alan ekiplerin yerel bir çözüme ihtiyacı vardır. IronOCR, bu gereksinimi tasarım gereği karşılar – belgeler asla uygulama sunucusunu terk etmez. Lisansa ilişkin sayfa, bulut-sağlayıcı incelemesini kapsamdan çıkararak uyumluluk dokümantasyonunu basitleştiren süresiz lisans yapısını belgeliyor.

Entegrasyon Kodu Bakım Yükü

OCR.space entegrasyonları, özellik gereksinimlerine orantılı olarak teknik borç biriktirir. Başlangıçtaki HTTP istemcisi yönetilebilir. Sonrasında ekip, tekrar deneme mantığını ekler. Sonra ekip, bir adresi paylaşan birden fazla hizmet nedeniyle, toplam IP oranı limiti izlemeyi ekler. Daha sonra dosya boyutu ön-doğrulama adımını eklerler. Ardından JSON hata yapısının Motor 1 ve Motor 2 yanıtları arasında farklılık gösterdiğini keşfederler ve bir dal eklerler. Altı ay sonra, OCR.space entegrasyonu, OCR ile ilgili herhangi bir şeye dokunmadan önce her yeni ekip üyesinin anlaması gereken 400 satır altyapı kodu olur. O ekip, bakım maliyetini bir $999 bir kerelik IronOCR lisansına karşı değerlendirirken aritmetik basittir.

Yapılandırılmış Çıktı Gereksinimleri

OCR.space yalnızca düz metin döndürür ve başka hiçbir şey sağlamaz. Yanıtta kelime koordinatları, satır sınırları, paragraf segmentasyonu veya kelime başına güven skorları yoktur. Fatura alanlarından belirli alanları çıkartmak isteyen uygulamalar – bilinen bir bölgede satıcı ismi, sağ alt köşede toplam tutar – OCR.space'in çıktısından oluşturmak için yapılandırılmış bir temele sahip değildir. IronOCR, her ayrıntı düzeyinde koordinatlar ve güvenlik değerleriyle tam bir belge hiyerarşisini açığa çıkarır: sayfalar, paragraflar, satırlar ve bireysel kelimeler. Bölgeye dayalı işleme, tüm sayfa çıktısını sonradan işlemeye gerek kalmadan, belirli belge bölgelerini hedefleme imkanı sağlar. Sonuç okuma nasıl yapılır ve bölgeye dayalı OCR rehberi bu kalıpları ayrıntılı olarak ele almaktadır.

Ücretsiz Katmanın Ötesinde Hacim Büyümesi

Ayda 25.000 istek için ücretsiz katman, düşük hacimli senaryolar için işlevseldir. Bunun ötesinde, ücretli katmanlar uygulanır — güncel fiyatlandırma için OCR.space ile iletişime geçin. Bu maliyetler zamanla birikir ve karşılaştırma, bir $999 ile sürekli bir lisans ile, asla istek başına ücretlendirilmeden yapılır. Aylık 25.000'den fazla belge hacmi büyümesi projeksiyonu yapan ekipler için yerel işlemeye yönelik basit bir maliyet durumu vardır.

Genel Geçiş Dikkat Edilmesi Gereken Hususlar

HTTP İstemcisini Bir Yöntem Çağrısıyla Değiştirme

OCR.space'den IronOCR'ya geçiş, belgelerden gelen metni her ikisi de döndürdüğü için mimari olarak basittir. HTTP istemcisi, JSON ayrıştırıcısı, oran sınırlayıcı ve özel istisna türleri ortadan kalkar. Yerine geçen tek şey bir NuGet paketi ve yöntem çağrılarıdır. Hizmet sınırındaki önce/sonra:

// Before: OCR.space service (simplified — actual implementation is200+lines)
public class OcrSpaceService : IDisposable
{
    private readonly HttpClient _client = new();
    private readonly string _apiKey;

    public OcrSpaceService(string apiKey) => _apiKey = apiKey;

    public async Task<string> ProcessDocument(string path)
    {
        byte[] bytes = File.ReadAllBytes(path);
        string base64 = Convert.ToBase64String(bytes);

        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("apikey", _apiKey),
            new KeyValuePair<string, string>("base64Image", $"data:image/png;base64,{base64}")
        });

        var response = await _client.PostAsync("https://api.ocr.space/parse/image", content);
        response.EnsureSuccessStatusCode();

        string json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);
        return doc.RootElement.GetProperty("ParsedResults")[0].GetProperty("ParsedText").GetString()!;
    }

    public void Dispose() => _client.Dispose();
}

// After:IronOCR service — no HttpClient, no JSON, no API key
public class IronOcrService
{
    private readonly IronTesseract _ocr = new();

    public string ProcessDocument(string path)
    {
        return _ocr.Read(path).Text;
    }
    //HayırDispose — no external connections to close
}
C#

IDisposable uygulaması ortadan kalkar çünkü yönetilecek HttpClient yoktur.

API Anahtarının Kaldırılması

OCR.space her HTTP isteğinde bir API anahtarı gerektirir. Bu anahtar güvenli bir şekilde saklanmalı, ifşa edildiğinde döndürülmeli ve kaynak denetiminden hariç tutulmalıdır. IronOCR, genellikle bir ortam değişkeni veya yapılandırma sistemi üzerinden, uygulama başlatıldığında bir kez ayarlanan bir lisans anahtarı kullanır:

// At application startup — once, not per request
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

Geçişten sonra, API anahtar döndürme süreci, gizli yönetim yapılandırması ve istek başına anahtar enjeksiyon mantığı tümüyle gereksiz hale gelir.

Göçten Sonra Ön İşleme

OCR.space, sonuçları geri göndermeden önce sunucu tarafında işleme uygular, ancak geliştiricilerin o işlemenin neyi içerdiği veya içermediği konusunda kontrolü yoktur. IronOCR, açık ön işleme yöntemleri sağlar. Belge kalitesi bir endişe ise — eğimli taramalar, düşük kontrastlı fotokopiler, gürültülü faks çıktıları — ön işleme boru hattı üç ila beş yöntem çağrısıdır:

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);

Görüntü kalitesi düzeltme rehberi ve görüntü renk düzeltme rehberi mevcut filtrelerin tümünü ve doğruluk farklarını gösteren örneklerle belgelemektedir.

Async vs. Senkron

OCR.space aramaları, HTTP turu içerdiği için doğası gereği asenkroniktir.IronOCR aramaları varsayılan olarak senkroniktir, bu da web dışı bağlamlarda kodu basitleştirir. ASP.NET ve engellemeyen yürütme gerektiren sunucu senaryoları için, IronOCR, Task.Run saran veya doğrudan bir async API üzerinden asenkron çalışmayı destekler. Asenkron OCR rehberi kalıpları kapsar. Önceden bir bulut çağrısı bekleyen bir hizmet yönteminden await kaldırmak, async yalnızca OCR.space gerektirdiği için benimsendiği bağlamlarda çağrı yığınını basitleştirir.

Ek IronOCR Yetenekleri

Yukarıdaki bölümlerde ele alınmayan, OCR.space ile eşdeğer fonksiyonellik taşımayan her bir özellik:

  • hOCR dışa aktarma: result.SaveAsHocrFile("output.hocr") downstream belge işleme boru hatları için standartlara uygun hOCR çıkışı üretir.
  • İlerleme takibi: Uzun süreli çok sayfalı toplu işlem operasyonları için ilerleme olaylarına abone olun, UI uygulamalarında ilerleme çubukları ve ETA hesaplamalarına olanak tanır.
  • Tablo çıkarımı: Yapılandırılmış tablo verilerine sonuç modeli ile erişilebilir, kolon hizalamasını gerektiren fatura kalem çıkarılması gibi kullanım senaryolarını destekler.
  • Özelleşmiş belge okuma: Pasaport MRZ alanları, plaka, MICR çek yatay çizgileri ve el yazısı tanıma gibi amaç için geliştirilmiş özellikler, aynı IronTesseract API aracılığıyla erişilebilir.

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

IronOCR, .NET 6, .NET 7, .NET 8 ve .NET 9 hedef alır, her LTS ve STS sürümü için etkin destek sağlar. Kütüphane Windows x64, Windows x86,Linuxx64, macOS, Docker, AWS Lambda ve Azure App Service üzerinde çalışır — hepsi tek bir NuGet paketi üzerinden işletim sistemine özgü bir yapılandırma olmadan. OCR.space, her dağıtım ortamından çıkış yönlü HTTPS gerektirir, bu da hava boşluklu ağları, kısıtlayıcı kurumsal proxy'leri ve politika gereğince üçüncü taraf API'lere çıkış yönlü trafiğin engellendiği altyapıyı hariç tutar. IronOCR'nin çalışma zamanı ağ gereksinimleri yoktur; yürütmeyi tamamen yerinde yapar. .NET 10'un 2026 sonlarına doğru yayına girmesiyle birlikte, IronOCR'nin .NET büyük sürümlerindeki uygunluğunu koruma geçmişi entegrasyon değişiklikleri olmadan süreklilik sağlar.

Sonuç

OCR.space, gerçek ve yararlı bir nişi işgal eder: bir hafta sonu boyunca bir OCR özelliği prototiplemek isteyen geliştiriciler, metin çıkarımı kavramlarını araştıran öğrenciler veya aylık 25.000 belgenin altında hacmi olan uyumluluk gereksinimi olmayan kişisel araçlar için. Bu kitle için, ücretsiz katman gerçek bir değer sunar.

Sorun, .NET geliştiricilerinin genellikle hafta sonu prototipleri oluşturmuyor olmasıdır. Onlar faturalama sistemleri, tıbbi kayıt işlemcileri, belge arşivleme boru hatları ve uyumluluk duyarlı iş uygulamaları geliştirir. Bu bağlamlar için, OCR.space'in mevcut olmayan NuGet paketi bir rahatsızlık değildir — yapısal bir uyumsuzluktur. HTTP istemcisi, oran sınırlayıcı, JSON ayrıştırıcısı ve tekrar deneme altyapısını kurmak için harcanan her saat, uygulamanın gerçek gereksinimlerini karşılamaya harcanmayan bir saattir. Bu maliyet önden yüklü, ancak entegrasyonun ömrü boyunca bakım maliyeti devam eder.

IronOCR, her OCR.space entegrasyonunu tanımlayan spesifik hata modunu ele alır: gerçek bir SDK'nın yokluğu. Bir NuGet paketi, bir yöntem çağırma, HTTP tesisatı yok, oran sınırlamaları yok, dış sunuculara belge aktarma yok. $999 giriş fiyatı tek seferlik bir maliyettir; artan OCR.space abonelik maliyetleri, özellikle hacim arttıkça zaman içinde bunu aşacaktır. Uyum gereksinimleri olan ekipler için, yerel işlem maliyeti ne olursa olsun tek seçenektir.

Karşılaştırma sonunda tek bir soruya indirgenir: uygulama, harici bir REST bağımlılığı olarak mı yoksa bir kütüphane işlevi olarak mı OCR gerektirir? .NET üretim uygulamaları için cevap neredeyse her zaman ikincisidir.

Lütfen dikkate alın: OCR.space ve Tesseract, ilgili sahiplerinin tescilli ticari markalarıdır. Bu site, Google veya OCR.space ile ilişkili, onaylanmış veya sponsorlu değildir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.
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ılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez