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

IronOCR ve Azure OCR PDF: Hangi Çözüm Daha İyi Metin Çıkarır?

TesseractOcrMaui, mimarinize platform sınırını sert kodluyor: kütüphane yalnızca .NET MAUI uygulamaları içinde var olur ve başka herhangi bir proje türünden referanslanamaz. Bir MAUI mobil uygulamasınıASP.NET CoreAPI, Azure Function ya da Docker barındırılan bir backend ile çalıştıran herhangi bir ekip, uygulama için bir, her şey için başka bir olmak üzere iki tamamen ayrı OCR uygulaması yazmalı ve sürdürmelidir. Bu, bir yol haritasında eksik bir özellik değil; kütüphane böyle tasarlandığı için. Bu karşılaştırma bu kısıtın pratikte maliyetini ve IronOCRnin bunu nasıl kaldırdığını inceler.

TesseractOcrMaui'yi Anlama

TesseractOcrMaui, Tesseract 5.3.3'ün .NET MAUI etrafında Henri Vainio tarafından tek başına geliştirilen açık kaynak bir sarmalayıcıdır. Paket net8.0-ios, net8.0-android ve net8.0-windows — tümü MAUI hedef çerçevelerini hedefliyor. Mevcut Tesseract sarmalayıcılarının masaüstü .NET için mobil platformlararası gereksinimleri karşılayamaması nedeniyle gerçek bir boşluğu doldurmak için oluşturuldu, bu yüzden MAUI geliştiricilerinin Tesseract'a doğrudan bir yolu yoktu bu kütüphane görünene kadar.

Kütüphanenin mimarisi MAUI'ye özgü bağımlılık enjeksiyonuna dayanır. OCR motorunu builder.Services.AddTesseractOcr() üzerinden MauiProgram.cs'da kaydedersiniz, ardından ITesseract'u sayfalara ve hizmetlere enjekte edersiniz. Bu MAUI DI kapsayıcısına sıkı sarılma, onu bir sınıf kütüphanesi, bir konsol aracı ya da bir web projesinden referans edilmesini imkansız kılar.

Ana mimari özellikler:

  • MAUI'ye özel hedef çerçeveler: Sadece net8.0-ios, net8.0-android ve net8.0-windowsnet8.0 yok, netstandard2.1 yok, sunucu hedefi yok
  • Zorunlu AddTesseractOcr() kaydı: Motor, MAUI hizmet sağlayıcısı aracılığıyla bağlanır; bağımsız bir başlatma yolu yoktur.
  • Traineddata pakete dahil değil: Dil dosyaları (her biri 10–50 MB) manuel olarak indirilmelidir, Resources/Raw/tessdata/ konumuna yerleştirilmeli ve proje dosyasında <MauiAsset> öğeleri olarak tanımlanmalıdır
  • Tek geliştirici: Henri Vainio tek geliştiricidir; ~33.900 toplam NuGet indirme 2026 itibariyle
  • Apache 2.0 lisansı: Sıfır lisanslama maliyeti ile kullanım özgürlüğü
  • Async-first API yüzeyi: InitAsync(language) ve RecognizeTextAsync(imagePath) iki ana çağrıdır; eş zamanlı bir yol sağlanmamıştır.

Kodda MAUI Bağımlılığı

AddTesseractOcr() çağırdığınız anda, OCR mantığı MAUI uygulaması ana bilgisayarına bağlanır. Bunu paylaşılan bir kütüphaneye çıkarmanın bir yolu yoktur.

// MauiProgram.cs — this registration only compiles inside a MAUI project
public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder.UseMauiApp<App>();

    // Registers ITesseract — MAUI DI only, no standalone equivalent
    builder.Services.AddTesseractOcr();

    return builder.Build();
}

// OCR service — ITesseract injected from MAUI container
public class MobileOcrService
{
    private readonly ITesseract _tesseract;

    public MobileOcrService(ITesseract tesseract)
    {
        _tesseract = tesseract; // Cannot be constructed outside MAUI host
    }

    public async Task<string> ExtractTextAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng"); // traineddata must be bundled
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.Success ? result.RecognizedText : string.Empty;
    }
}
// MauiProgram.cs — this registration only compiles inside a MAUI project
public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder.UseMauiApp<App>();

    // Registers ITesseract — MAUI DI only, no standalone equivalent
    builder.Services.AddTesseractOcr();

    return builder.Build();
}

// OCR service — ITesseract injected from MAUI container
public class MobileOcrService
{
    private readonly ITesseract _tesseract;

    public MobileOcrService(ITesseract tesseract)
    {
        _tesseract = tesseract; // Cannot be constructed outside MAUI host
    }

    public async Task<string> ExtractTextAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng"); // traineddata must be bundled
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.Success ? result.RecognizedText : string.Empty;
    }
}
Imports Microsoft.Maui
Imports Microsoft.Extensions.DependencyInjection

' MauiProgram.vb — this registration only compiles inside a MAUI project
Public Module MauiProgram
    Public Function CreateMauiApp() As MauiApp
        Dim builder = MauiApp.CreateBuilder()
        builder.UseMauiApp(Of App)()

        ' Registers ITesseract — MAUI DI only, no standalone equivalent
        builder.Services.AddTesseractOcr()

        Return builder.Build()
    End Function
End Module

' OCR service — ITesseract injected from MAUI container
Public Class MobileOcrService
    Private ReadOnly _tesseract As ITesseract

    Public Sub New(tesseract As ITesseract)
        _tesseract = tesseract ' Cannot be constructed outside MAUI host
    End Sub

    Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
        Await _tesseract.InitAsync("eng") ' traineddata must be bundled
        Dim result = Await _tesseract.RecognizeTextAsync(imagePath)
        Return If(result.Success, result.RecognizedText, String.Empty)
    End Function
End Class
$vbLabelText   $csharpLabel

Ürününüz büyüyüp aynı OCR mantığına sahip bir arka uç API'yi içerse — yüklenen belgeleri işlemek, taranmış formları doğrulamak ya da sunucu tarafında aranabilir PDF'ler oluşturmak için — bu kod yeniden kullanılabilir değildir. MAUI projeleri dışında hiçbiri derlenemez. Farklı bir kütüphane kullanarak baştan tekrar yazılır.

IronOCR'u Anlamak

IronOCR, optimize edilmiş bir Tesseract 5 motorunu otomatik görüntü ön işleme, yerel PDF girdisi ve iş parçacığı güvenli paralel işlemeyle saran ticari bir .NET OCR kütüphanesidir. Tek bir NuGet paketi (IronOcr) olarak gönderilir, net8.0, netstandard2.0 ve tüm standart .NET hedeflerini hedefleyerek, herhangi bir çözümdeki herhangi bir proje türünden referans alınabilir.

Anahtar özellikler:

  • Evrensel .NET hedefleme: MAUI'de, ASP.NET Core'da, konsol uygulamalarında, WPF'de, WinForms'da, Azure Functions'da, AWS Lambda'da, Docker kapsayıcılarında ve paylaşılan sınıf kütüphanelerinde çalışır — hepsi aynı paket ve aynı API'den
  • Tessdata yönetimi yok: Dil verileri ayrı NuGet dil paketleri (IronOcr.Languages.French, vb.) içerisinde toplanmıştır; dosya indirme, yol yapılandırması, sürüm eşleşmesi yok
  • Otomatik ön işleme: Deskew(), DeNoise(), Contrast(), Binarize() ve EnhanceResolution(), okumadan önce OcrInput üzerinde birer satır çağrıdır
  • Yerel PDF desteği: input.LoadPdf(), taranmış PDF'leri doğrudan işler; result.SaveAsSearchablePdf() indeksli çıktı üretir
  • Özel mobil paketler: IronOcr.Android ve IronOcr.iOS, çözümdeki diğer tüm proje türleriyle birlikte MAUI'de kullanılabilir aynı API'nin platform için optimize edilmiş varyantlarıdır
  • Ticari destek: SLA destekli e-posta, sohbet ve telefon desteği; süresiz lisanslama $999'den başlar

Özellik Karşılaştırması

Özellik TesseractOcrMaui IronOCR
Platform desteği .NET MAUI yalnızca Tüm .NET platformları
Paylaşılan sınıf kütüphanesi desteği Hayır Evet
PDF girdisi Hayır Evet (yerleşik)
Otomatik ön işlem Hayır Evet (40+ filtre)
Dil verisi yönetimi Manuel dosya demetleme NuGet dil paketleri
Bakımcı Tek topluluk geliştiricisi Iron Software (şirket)
Toplam NuGet indirme ~33.900 Milyonlarca
Lisans Apache 2.0 (ücretsiz) $999+ süresiz

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

Özellik TesseractOcrMaui IronOCR
Platform Kapsamı
.NET MAUI (iOS) Evet Evet (IronOcr.iOS)
.NET MAUI (Android) Evet Evet (IronOcr.Android)
.NET MAUI (Windows) Evet Evet
.NET MAUI (macOS) Hayır Evet
ASP.NET Core Hayır Evet
Konsol uygulamaları Hayır Evet
WPF / WinForms Hayır Evet
Azure Functions Hayır Evet
Docker / Linux Hayır Evet
AWS Lambda Hayır Evet
Paylaşılan .NET sınıf kütüphanesi Hayır Evet
Giriş Kaynakları
Görüntü dosyaları (JPEG, PNG, TIFF) Evet Evet
PDF belgeleri Hayır Evet
Şifre korumalı PDF'ler Hayır Evet
Akımlar Hayır Evet
Bayt dizileri Hayır Evet
Ön işlem
Hizalama Hayır Evet
Gürültü azaltma Hayır Evet
Kontrast artırma Hayır Evet
Binarizasyon Hayır Evet
Çözünürlük ölçekleme Hayır Evet
Ters Çevir / Keskinleştir / Büyüt Hayır Evet
Çıktı
Düz metin Evet Evet
Aranabilir PDF Hayır Evet
hOCR içeri aktarma Hayır Evet
Kelime düzeyinde koordinatlar Hayır Evet
Güven skoru Evet (sonuç başına) Evet (kelime başına)
Mimari
İş parçacığı güvenli Yönerge Yerleşik
OCR sırasında barkod okuma Hayır Evet
Çoklu dil aynı anda Hayır (her çağrı başına bir init) Evet
Destek
Ticari SLA Hayır Evet
Güvenlik yaması garantisi Topluluğa bağlı Evet
Dokümantasyon Temel README 100+ sayfa

Platform Kapsamı: Yalnızca MAUI vs. Evrensel .NET

TesseractOcrMaui değerlendirilirken temel soru, OCR'ye bir MAUI projesi dışında gereksinim duyulup duyulmayacağıdır. Çoğu üretim uygulaması için cevap evettir.

TesseractOcrMaui Yaklaşımı

TesseractOcrMaui bir MAUI ana bilgisayarı dışında derlenemez. ITesseract arayüzü, MAUI DI konteynerinden çözülür; bir fabrika yoktur, statik giriş noktası yoktur ve bağımsız bir kurucu yoktur. Aşağıdaki model tek desteklenen modeldir:

// MAUI-only: will not compile in ASP.NET Core, console, or class library
public class DocumentScanService
{
    private readonly ITesseract _tesseract;

    public DocumentScanService(ITesseract tesseract) // MAUI DI injection only
    {
        _tesseract = tesseract;
    }

    public async Task<string> ProcessAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng");
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.RecognizedText ?? string.Empty;
    }
}
// MAUI-only: will not compile in ASP.NET Core, console, or class library
public class DocumentScanService
{
    private readonly ITesseract _tesseract;

    public DocumentScanService(ITesseract tesseract) // MAUI DI injection only
    {
        _tesseract = tesseract;
    }

    public async Task<string> ProcessAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng");
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.RecognizedText ?? string.Empty;
    }
}
Imports System.Threading.Tasks

' MAUI-only: will not compile in ASP.NET Core, console, or class library
Public Class DocumentScanService
    Private ReadOnly _tesseract As ITesseract

    Public Sub New(tesseract As ITesseract) ' MAUI DI injection only
        _tesseract = tesseract
    End Sub

    Public Async Function ProcessAsync(imagePath As String) As Task(Of String)
        Await _tesseract.InitAsync("eng")
        Dim result = Await _tesseract.RecognizeTextAsync(imagePath)
        Return If(result.RecognizedText, String.Empty)
    End Function
End Class
$vbLabelText   $csharpLabel

BirASP.NET CoreAPI denetleyicisinde yüklenen belgeleri OCR yapması gereken bir takım bu sınıfı çağıramaz. Farklı bir Tesseract sarmalayıcısı veya bir bulut API'sı olan ikinci bir OCR kütüphanesi ekler ve dil yapılandırmalarını, hata yönetimlerini ve hassasiyet ayarlamaları çalışmalarını kopyalarlar. İki kütüphane, iki bakım hattı, düzeltilecek iki hata seti.

IronOCR Yaklaşımı

IronOCR, proje türü üzerinde sınırlama getirmez. Aynı sınıf, bir MAUI uygulaması, birASP.NET Corekontrolcüsü, bir Azure İşlevi ve bir .NET Standard sınıf kütüphanesi içinde değiştirilmeden derlenir:

// Works in every project type — MAUI, ASP.NET Core, console, Azure Functions, Docker
public class SharedOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string imagePath)
    {
        using var input = new OcrInput(imagePath);
        return _ocr.Read(input).Text;
    }

    public string ExtractTextFromBytes(byte[] imageData)
    {
        using var input = new OcrInput(imageData);
        return _ocr.Read(input).Text;
    }
}
// Works in every project type — MAUI, ASP.NET Core, console, Azure Functions, Docker
public class SharedOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string imagePath)
    {
        using var input = new OcrInput(imagePath);
        return _ocr.Read(input).Text;
    }

    public string ExtractTextFromBytes(byte[] imageData)
    {
        using var input = new OcrInput(imageData);
        return _ocr.Read(input).Text;
    }
}
Imports IronTesseract

Public Class SharedOcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractText(imagePath As String) As String
        Using input As New OcrInput(imagePath)
            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ExtractTextFromBytes(imageData As Byte()) As String
        Using input As New OcrInput(imageData)
            Return _ocr.Read(input).Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Bu sınıfı bir .NET Standard 2.1 veya net8.0 sınıf kütüphanesine yerleştirin ve aynı anda MAUI projesinden, API projesinden ve arka plan çalışanından referans alın. Tek bir uygulama, tek bir bakım yüzeyi, tek bir test seti. IronTesseract kurulum kılavuzu tüm hedefler için aynı şekilde geçerli yapılandırma seçeneklerini anlatır.

Mobil özel senaryolar için, IronOcr.Android ve IronOcr.iOS platform için optimize edilmiş yerel ikili dosyalar sağlar ve aynı IronTesseract API'sini açığa çıkarır — dolayısıyla paylaşılan sınıf kitaplığı mobilde değişmeden çalışır. Sunucu dağıtımları için, Docker dağıtım kılavuzu ve Linux dağıtım kılavuzu konteyner yapılandırmasını kapsar. Mobil için özel kurulumun nasıl yapılacağını gösteren özel bir MAUI OCR öğreticis de vardır.

Sunucu-Taraflı Yetenek

Sunucu-taraflı OCR, TesseractOcrMaui'yi tamamen bozan senaryodur. Sunucuda belgeleri işleme gereksinimi — toplu işler, API uç noktaları, sunucusuz fonksiyonlar — tamamen farklı bir kütüphane gerektirir.

TesseractOcrMaui Yaklaşımı

TesseractOcrMaui ile sunucu-taraflı bir yaklaşım yoktur. Kütüphane sadece net8.0-ios, net8.0-android ve net8.0-windows (MAUI) hedef alır. TesseractOcrMaui referans alan birASP.NET Coreprojesi derlenemez. Bu bir yapılandırma sorunu değildir; paket sadece sunucu çalıştırma zamanlarının yükleyebileceği hedeflere sahip değildir.

Kütüphanenin kendi belgelerindeki ProcessPdfAsync yöntemi bu boşluğu açıkça doğrular:

// TesseractOcrMaui: PDF processing throws NotSupportedException
public async Task<List<string>> ProcessPdfAsync(string pdfPath)
{
    // Cannot process PDFs at all — requires manual conversion to images first
    // AND requires a separate PDF library you must add yourself
    throw new NotSupportedException(
        "TesseractOcrMaui does not support PDF processing. " +
        "You must manually convert PDF pages to images first.");
}
// TesseractOcrMaui: PDF processing throws NotSupportedException
public async Task<List<string>> ProcessPdfAsync(string pdfPath)
{
    // Cannot process PDFs at all — requires manual conversion to images first
    // AND requires a separate PDF library you must add yourself
    throw new NotSupportedException(
        "TesseractOcrMaui does not support PDF processing. " +
        "You must manually convert PDF pages to images first.");
}
Imports System
Imports System.Threading.Tasks

Public Class TesseractOcrMaui
    Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of List(Of String))
        ' Cannot process PDFs at all — requires manual conversion to images first
        ' AND requires a separate PDF library you must add yourself
        Throw New NotSupportedException("TesseractOcrMaui does not support PDF processing. " &
                                        "You must manually convert PDF pages to images first.")
    End Function
End Class
$vbLabelText   $csharpLabel

Hatta bir MAUI uygulaması içinde bile PDF belgeleri doğrudan geçirilemez. Her sayfa, ikinci bir kütüphane tarafından geçici bir görüntü dosyasına dönüştürülmeli, cihaz önbelleğine kaydedilmeli, RecognizeTextAsync'a teslim edilmeli, ardından temizlenmelidir. Yüzlerce belgenin işlendiği sunucu iş yüklerinde bu mimari uygun değildir.

IronOCR Yaklaşımı

IronOCR, sunucu-taraflı OCR'yi mobilde kullanılan aynı API ile ele alır. PDF girişi yereldir — ara resim dönüşümü, geçici dosyalar veya ikinci bir kütüphane yoktur:

//ASP.NET Corecontroller — handles PDF uploads directly
[HttpPost("ocr")]
public async Task<IActionResult> ProcessUpload(IFormFile file)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();

    if (file.ContentType == "application/pdf")
    {
        using var stream = file.OpenReadStream();
        input.LoadPdf(stream); // direct PDF stream — no temp files
    }
    else
    {
        using var stream = file.OpenReadStream();
        input.LoadImage(stream);
    }

    input.Deskew();   // handle scanned document skew
    input.DeNoise();  // mobile camera noise
    var result = ocr.Read(input);
    return Ok(new { text = result.Text, confidence = result.Confidence });
}
//ASP.NET Corecontroller — handles PDF uploads directly
[HttpPost("ocr")]
public async Task<IActionResult> ProcessUpload(IFormFile file)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();

    if (file.ContentType == "application/pdf")
    {
        using var stream = file.OpenReadStream();
        input.LoadPdf(stream); // direct PDF stream — no temp files
    }
    else
    {
        using var stream = file.OpenReadStream();
        input.LoadImage(stream);
    }

    input.Deskew();   // handle scanned document skew
    input.DeNoise();  // mobile camera noise
    var result = ocr.Read(input);
    return Ok(new { text = result.Text, confidence = result.Confidence });
}
Imports Microsoft.AspNetCore.Mvc
Imports IronOcr

<HttpPost("ocr")>
Public Async Function ProcessUpload(file As IFormFile) As Task(Of IActionResult)
    Dim ocr As New IronTesseract()

    Using input As New OcrInput()
        If file.ContentType = "application/pdf" Then
            Using stream = file.OpenReadStream()
                input.LoadPdf(stream) ' direct PDF stream — no temp files
            End Using
        Else
            Using stream = file.OpenReadStream()
                input.LoadImage(stream)
            End Using
        End If

        input.Deskew() ' handle scanned document skew
        input.DeNoise() ' mobile camera noise
        Dim result = ocr.Read(input)
        Return Ok(New With {Key .text = result.Text, Key .confidence = result.Confidence})
    End Using
End Function
$vbLabelText   $csharpLabel

MAUI uygulamasına güç veren aynı IronTesseract örneği bu uç noktaya güç veriyor. Bir defa kurulan dil paketleri her iki hedefi kapsar. Azure İşlevleri veyaAWS Lambdadağıtımları için Azure dağıtım kılavuzu ve AWS dağıtım kılavuzu yapılandırmayı belgeler. PDF girişi nasıl yapılır kılavuzu, sayfa aralıkları, parola korumalı dosyalar ve akış girişleri dahil tüm PDF yükleme modellerini kapsar.

Tek Geliştirici Bakım Riski

2026 itibarıyla toplam ~33.900 indirme ile TesseractOcrMaui, .NET OCR ekosisteminin dar bir köşesini tutar. Küçük indirme sayısı sadece bir popülarite metriği değildir — bug raporları, çözümler, Stack Overflow cevapları ve katkılı düzeltmeler için mevcut topluluğun büyüklüğünün bir göstergesidir.

TesseractOcrMaui Yaklaşımı

TesseractOcrMaui'nin bakımının her yönü, Henri Vainio'nun mevcut ve motive kalmasına bağlıdır. Projenin arkasında ticari bir kuruluş yoktur, SLA yoktur, güvenlik yamaları için garanti edilmiş bir zaman çizelgesi yoktur ve bir GitHub sorunu açmaktan öte bir tırmanma yolu yoktur. Proje aktif olmuştur, ancak yapısal risk gerçektir.

Eğitilmiş veri yönetim modeli, bu riski operasyonel olarak artırır. Geliştiriciler dil dosyalarını indirmeli, onları <MauiAsset> öğeleri olarak tanımlamalı, iOS ve Android arasındaki platforma özgü yol farklarını çalışma zamanında çözmeli ve dosyaların başlangıçta mevcut olduğunu doğrulamalıdır:

// Required startup validation — common crash source
public async Task<bool> ValidateTraineddataAsync()
{
    try
    {
        // Fails if eng.traineddata is missing, path-resolved incorrectly,
        // or mismatched with the Tesseract engine version
        await _tesseract.InitAsync("eng");
        return true;
    }
    catch (FileNotFoundException)
    {
        // Need to diagnose: missing file, wrong path, or wrong bundling config?
        Console.WriteLine("ERROR: eng.traineddata not found in bundle");
        return false;
    }
    catch (DllNotFoundException)
    {
        // Native library resolution failure — platform-specific debugging
        Console.WriteLine("Native Tesseract library missing");
        return false;
    }
}
// Required startup validation — common crash source
public async Task<bool> ValidateTraineddataAsync()
{
    try
    {
        // Fails if eng.traineddata is missing, path-resolved incorrectly,
        // or mismatched with the Tesseract engine version
        await _tesseract.InitAsync("eng");
        return true;
    }
    catch (FileNotFoundException)
    {
        // Need to diagnose: missing file, wrong path, or wrong bundling config?
        Console.WriteLine("ERROR: eng.traineddata not found in bundle");
        return false;
    }
    catch (DllNotFoundException)
    {
        // Native library resolution failure — platform-specific debugging
        Console.WriteLine("Native Tesseract library missing");
        return false;
    }
}
Imports System
Imports System.IO
Imports System.Threading.Tasks

Public Class Validator
    ' Required startup validation — common crash source
    Public Async Function ValidateTraineddataAsync() As Task(Of Boolean)
        Try
            ' Fails if eng.traineddata is missing, path-resolved incorrectly,
            ' or mismatched with the Tesseract engine version
            Await _tesseract.InitAsync("eng")
            Return True
        Catch ex As FileNotFoundException
            ' Need to diagnose: missing file, wrong path, or wrong bundling config?
            Console.WriteLine("ERROR: eng.traineddata not found in bundle")
            Return False
        Catch ex As DllNotFoundException
            ' Native library resolution failure — platform-specific debugging
            Console.WriteLine("Native Tesseract library missing")
            Return False
        End Try
    End Function

    Private _tesseract As Tesseract ' Assuming Tesseract is a defined class elsewhere
End Class
$vbLabelText   $csharpLabel

Bu, üretimde çalışmadığında — belirli bir Android API seviyesinde, bir iOS güncellemesinden sonra veya bir uygulama mağazası başvurusu sonrası — hata ayıklama yolunu tek bir geliştirici projesi için GitHub sorunları üzerinden yürütülür. Destek e-postası, sohbet kanalı ve telefon üzerinden tırmanma yoktur.

IronOCR Yaklaşımı

IronOCR, Iron Software tarafından geliştirilen ve bakım yapılan, adanmış bir mühendislik ekibi olan ve ticari destek sözleşmeleri olan bir şirket tarafından geliştirilip bakım yapılmaktadır. Dil verileri NuGet paketleri içinde gönderilir — dotnet add package IronOcr.Languages.French tüm kurulum sürecidir. Yönetilecek dosya yoktur, yapılandırılacak yollar yoktur ve sürdürülmesi gereken paketleme beyanları yoktur.

Hata yüzeyi buna göre küçülür. Hiçbir eğitilmiş veri kaybolmaz, çalışma zamanı hatalarının tüm bir kategorisi ortadan kalkar.IronOCR başlatım modeli başlangıçta tek bir lisans anahtarıdır:

// Application startup — the entire configuration
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Then OCR works anywhere, any project type, any file format
var text = new IronTesseract().Read("document.jpg").Text;
// Application startup — the entire configuration
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Then OCR works anywhere, any project type, any file format
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr

' Application startup — the entire configuration
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

' Then OCR works anywhere, any project type, any file format
Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

Destek sorunları, işletme saatlerinde e-posta ile, canlı sohbet ile ve kurumsal katmanlar için telefonla ele alınır. Lisanslama sayfası tüm katmanları kapsar; belgeleme merkezi 100'den fazla kılavuz sayfası içerir. Özellik tabanlı sorular için öğreticiler merkezi, yaygın senaryolar üzerinden çalışılan örnekler sunar.

API Eşleme Başvurusu

TesseractOcrMaui IronOCR Karşılığı
dotnet add package TesseractOcrMaui dotnet add package IronOcr
builder.Services.AddTesseractOcr() Gerekli değildir — DI kaydı gerekmez
ITesseract (enjekte edilmiş) new IronTesseract() (doğrudan somutlama)
_tesseract.InitAsync("eng") ocr.Language = OcrLanguage.English; (veya varsayılan)
_tesseract.RecognizeTextAsync(imagePath) ocr.Read(imagePath)
result.RecognizedText result.Text
result.Success İstisna tabanlı; başarı bayrağı gerekmez
result.Status İstisna mesajı
result.Confidence result.Confidence (aynı zamanda result.Words üzerinden kelime başına)
<MauiAsset> traineddata paketi dotnet add package IronOcr.Languages.French
TesseractOcrMaui.Results ad alanı IronOcr ad alanı
PDF desteği yok input.LoadPdf(path)
Ön işleme yok input.Deskew(), input.DeNoise(), input.Binarize()
MediaPicker.CapturePhotoAsync() + RecognizeTextAsync() MediaPicker.CapturePhotoAsync() + ocr.Read(path)

Ekipler TesseractOcrMaui'den IronOCR'ye Geçmeyi Düşündüklerinde

Arka Uç Genişleme Sorunu

Mobil öncelikli bir ekip,TesseractOcrMauikullanarak MAUI belge tarama uygulaması sunar. Özellik çalışır. Ardından ürün yol haritası sunucu-tarafı belge işleme ekler: yüklenmiş PDF'ler dizinlemeden önce OCR gerektirir, bir web portalı aynı çıkarım mantığına ihtiyaç duyar, bir gece toplu işi yüzlerce taranmış formu işlemelidir.TesseractOcrMauibu bağlamların hiçbirinden referans alınamaz. Ekip şimdi iki paralel OCR kod tabanını sürdürme — biri MAUI, biri sunucu — ya da her şeyi her iki yerde de çalışan bir kütüphaneye taşımak arasında bir seçimle karşı karşıya. Taşımanın maliyeti bir defaya mahsus ödenir; iki uygulamanın bakım maliyeti süresiz olarak bileşikleşir.

Mobilde PDF Gereksinimleri

Gerçek dünya mobil belge iş akışları PDF'leri içerir. Kullanıcılar sözleşmeleri fotoğraflar, PDF olarak gelen makbuzları tarar veya kimlik belgelerini PDF biçiminde alır. TesseractOcrMaui, her PDF girdiğinde NotSupportedException verir — kaynak kod bunu açıkça belgeler. PDF sayfalarını resimlere dönüştürmek için ikinci bir kütüphane eklemek, cihaz önbelleğinde geçici dosyaları yönetmek ve temizliği doğru şekilde yapmak, mobil bir uygulamaya önemli karmaşıklık ve kırılganlık ekler. İlk MAUI sürümünü gönderildikten sonra bu kısıtlamayı keşfeden ekipler, kullanıcılarının gerçekten gönderdiği belge türlerini işlemek için önemli bir yeniden çalışma ile karşılaşır.

Gerçek Mobil Çekimlerde Doğruluk

TesseractOcrMaui fotoğraf makinesinden gelen görüntüye karşı ham Tesseract doğruluğunu sunar. Mobil kamera görüntüleri nadiren idealdir: el açısı nedeniyle hafif dönüş, düşük ışıkta sensör gürültüsü, cihaz modelleri arasında değişen çözünürlük.TesseractOcrMauiherhangi bir ön işleme sağlamaz — elle deskewing, denoising ve kontrast iyileştirme eklemek SkiaSharp veya ImageSharp'u çekmek, algoritmaları uygulamak, geçici dosyaları kaydetmek ve hattı yönetmek gerektirir. Çoğu ekip bunu geçiştirir. Sonuç, fakir aydınlatma koşullarında %40–60 doğruluk, ön işleme uygulandığında %85–92 olmasıdır. Kullanım durumu sözleşmeler, makbuzlar veya kimlik belgelerini içeriyorsa, bu fark kabul edilemez.

Tek Geliştiricinin Bant Genişliğinin Ötesine Ölçekleme

Üretim uygulamaları zaman zaman aynı gün yanıtlanması gereken hatalarla karşılaşır. Bir platform güncellemesi Android'de yerel kütüphane çözümünü kırar. Bir iOS uygulama mağazası başvurusu, paketleme değişikliği nedeniyle başarısız olur. TesseractOcrMaui'nin 33,900 indirmelik topluluğu sınırlı Stack Overflow kapsamı ve tek bir bakım kişinin GitHub sorunları kuyruğu sunar. Üretim SLA yükümlülüğü olan ekipler — özellikle düzenlenmiş endüstrilerde — tanımlı bir tırmanma yoluna ihtiyaç duyarlar. Gönüllü tabanlı destek bir tırmanma yolu sağlamaz.

Karışık Bir Portföyün Üzerinde Kod Paylaşımı

Kurumsal geliştirme ekipleri nadiren tek bir uygulama sürdürür. Bir MAUI mobil uygulaması, birASP.NET Coreweb portalı, bir konsol toplu işlemcisi ve bir Azure İşlevi hattı içeren bir ürün paketi,TesseractOcrMauimobil seçim olduğunda OCR mantığını paylaşamaz. Her proje kendi OCR entegrasyonunu alır. Doğruluk gereksinimleri değiştiğinde — yeni bir dil eklemek, yeni bir belge türü için ön işlemeyi ayarlamak — değişiklik her bir entegrasyon ayrı ayrı yapılmalıdır. IronOCR'un evrensel .NET hedefleme özelliği, netstandard kütüphanesinde eşzamanlı olarak tüm projeler tarafından referans alınacak tek bir SharedOcrService sınıfı sağlar.

Genel Geçiş Dikkat Edilmesi Gereken Hususlar

ITesseract'ı IronTesseract ile Değiştirme

TesseractOcrMaui'nin ITesseract'ü MAUI DI konteyneri aracılığıyla çözülür ve enjekte edilmelidir. IronOCR'un IronTesseract'ı düz bir somutlaştırılabilir sınıftır. Kurucu parametresini ve InitAsync çağrısını kaldırın; RecognizeTextAsync'u Read ile değiştirin:

// Before — MAUI DI required
public class OcrService
{
    private readonly ITesseract _tesseract;
    public OcrService(ITesseract tesseract) { _tesseract = tesseract; }

    public async Task<string> ProcessAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng");
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.Success ? result.RecognizedText : string.Empty;
    }
}

// After — works in any project type
public class OcrService
{
    public string Process(string imagePath)
    {
        var ocr = new IronTesseract();
        using var input = new OcrInput(imagePath);
        return ocr.Read(input).Text;
    }
}
// Before — MAUI DI required
public class OcrService
{
    private readonly ITesseract _tesseract;
    public OcrService(ITesseract tesseract) { _tesseract = tesseract; }

    public async Task<string> ProcessAsync(string imagePath)
    {
        await _tesseract.InitAsync("eng");
        var result = await _tesseract.RecognizeTextAsync(imagePath);
        return result.Success ? result.RecognizedText : string.Empty;
    }
}

// After — works in any project type
public class OcrService
{
    public string Process(string imagePath)
    {
        var ocr = new IronTesseract();
        using var input = new OcrInput(imagePath);
        return ocr.Read(input).Text;
    }
}
Imports System.Threading.Tasks

' Before — MAUI DI required
Public Class OcrService
    Private ReadOnly _tesseract As ITesseract

    Public Sub New(tesseract As ITesseract)
        _tesseract = tesseract
    End Sub

    Public Async Function ProcessAsync(imagePath As String) As Task(Of String)
        Await _tesseract.InitAsync("eng")
        Dim result = Await _tesseract.RecognizeTextAsync(imagePath)
        Return If(result.Success, result.RecognizedText, String.Empty)
    End Function
End Class

' After — works in any project type
Public Class OcrService
    Public Function Process(imagePath As String) As String
        Dim ocr = New IronTesseract()
        Using input = New OcrInput(imagePath)
            Return ocr.Read(input).Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

TesseractOcrMaui'nin asenkron kalıbı, hesaplamalarda UI iş parçacığı endişeleri için gerekirse Task.Run(() => ocr.Read(input)) kullanılarak korunabilir, ancak eşzamanlı yol sunucu senaryoları için temiz ve yeterlidir. Görüntü girişi nasıl yapılır, tüm OcrInput yükleme varyantlarını belgeliyor.

Eğitilmiş Veri Altyapısını Kaldırma

TesseractOcrMaui, Resources/Raw/tessdata/ klasörüne, indirilmiş .traineddata dosyalarına, <MauiAsset> proje dosyası bildirimlerine, platforma özgü yol çözümleme koduna ve başlangıç doğrulama kontrolüne ihtiyaç duyar. Tüm bunlar IronOCR'ye geçirildiğinde silinir. Dil paketleri NuGet aracılığıyla kurulur:

dotnet remove package TesseractOcrMaui

dotnet add package IronOcr
dotnet add package IronOcr.Android   # for MAUI Android target
dotnet add package IronOcr.iOS       # for MAUI iOS target
dotnet add package IronOcr.Languages.French  # if French was needed
dotnet remove package TesseractOcrMaui

dotnet add package IronOcr
dotnet add package IronOcr.Android   # for MAUI Android target
dotnet add package IronOcr.iOS       # for MAUI iOS target
dotnet add package IronOcr.Languages.French  # if French was needed
SHELL

Resources/Raw/tessdata/ klasörünü silin ve proje dosyasından <MauiAsset> girişlerini kaldırın. builder.Services.AddTesseractOcr()'yi MauiProgram.cs'dan kaldırın. Eğitilmiş veri dosyalarının eksik olup olmadığını kontrol eden başlangıç doğrulama sınıfının IronOCR'de eşdeğeri yoktur çünkü kaybolacak hiçbir şey yoktur. IronTesseract kurulum kılavuzu eşdeğer başlatım adımını kapsar.

Doğruluk Eşitliği için Ön-İşleme Ekleme

TesseractOcrMaui hiçbir ön işleme uygulamaz. Mevcut uygulama ham Tesseract doğruluğuna göre ayarlanmışsa,IronOCR ön işleme eklemek zayıf kalitede görüntülerde sonuçları iyileştirir. Özellikle mobil kamera girişi için, üç filtreli bir boru hattı en yaygın başarısızlık modlarını kapsar:

using var input = new OcrInput(imagePath);
input.Deskew();            // camera angle correction
input.DeNoise();           // sensor noise from low light
input.EnhanceResolution(300); // normalize DPI across device models

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using var input = new OcrInput(imagePath);
input.Deskew();            // camera angle correction
input.DeNoise();           // sensor noise from low light
input.EnhanceResolution(300); // normalize DPI across device models

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

Using input As New OcrInput(imagePath)
    input.Deskew()            ' camera angle correction
    input.DeNoise()           ' sensor noise from low light
    input.EnhanceResolution(300) ' normalize DPI across device models

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

görüntü kalitesi düzeltme nasıl yapılır ve görüntü yönlendirme düzeltme nasıl yapılır her filtreyi ayrıntılı olarak açıklar. Düşük kalite taramanın örneği zorlu gerçek dünya belgeleri için tam bir boru hattını gösterir.

OCR Mantığını Paylaşılan Bir Kütüphaneye Taşıma

MAUI'ye özel ITesseract bağımlılığı kaldırıldıktan sonra, OCR hizmet sınıfı taşınabilir hale gelir. Yeni bir netstandard2.1 veya net8.0 sınıf kütüphanesi oluşturun, hizmeti oraya taşıyın ve çözümdeki MAUI projesi ve her sunucu tarafı projesinden referans alın. Bu, TesseractOcrMaui'nin yapısal olarak olanaksız hale getirdiği ve IronOCR'nin kolaylaştırdığı mimari adımdır. .NET OCR kütüphanesi genel bakışı hedefleme hususlarını kapsar.

Ek IronOCR Yetenekleri

Yukarıda bahsedilen yeteneklerin ötesinde,IronOCR daha önceki bölümlerde bahsedilmeyen özellikleri içerir:

  • Async OCR: Yüksek verim sunucu senaryoları için yerel async desteği, sonuçların paralel boru hatlarına yönlendirildiği yerlerde
  • Bölge tabanlı OCR: new CropRectangle(x, y, width, height) işlemi tanımlanmış bir alanla sınırlar, gürültüyü azaltır ve yapılandırılmış formlarda hızı artırır
  • Taranmış belge işleme: Çok sayfalı taranmış belgeler için otomatik döndürme algılaması ve her sayfaya uygulanan deskew
  • Pasaport ve kimlik belgesi okuma: Seyahat belgeleri üzerindeki makine okunabilir alanlar için özel olarak geliştirilmiş çıkarım
  • Tablo çıkarma: Taranmış belgelerden yapısal satır ve sütun farkındalığı ile tablo verisi çıkarır

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

IronOCR, netstandard2.0, net6.0, net8.0'u hedefler ve aktif .NET sürümlerine karşı korunur. IronOcr.Android ve IronOcr.iOS paketleri MAUI yayın temposunu takip eder. Iron Software her yeni .NET büyük sürümü için güncellemeler yayımlar; kütüphane bugün .NET 9 ile uyumludur ve gemisi çıktığında .NET 10'u destekleyecektir. TesseractOcrMaui, net8.0-* MAUI çerçevelerini hedef alır ve tek bir sürdürücünün takdirine bağlı olarak ilan edilmiş bir yol haritası yoktur — bir geliştiricinin sürekli mevcudiyetine bağımlılık, .NET sürümleri biriktikçe ileri uyumluluk riski yaratır.

Sonuç

TesseractOcrMaui belirli bir koşullar dizisinde gerçek bir problemi çözüyor: Arka uç bileşenleri olmayan bir MAUI-uygulamalı uygulama, sıfır bütçe, basit görüntü girişleri ve eğitilmiş veri yönetimi yükünü ve tek geliştirici bakım riskini üstlenmeye istekli bir ekip. O özel kombinasyon için, platforma özgü yerel kod gerektirmeden mobilde ücretsiz Tesseract erişimi sağlar.

MAUI kilitleme bir nüans değildir — tanımlayıcı kısıtlamadır. Her gerçek dünya ürün değerlendirmesi şu soruya cevap vermelidir: OCR'nin MAUI uygulaması dışında bir noktada gerekip gerekmeyeceği. Cevap evet ise,TesseractOcrMauiherhangi bir özellik karşılaştırması başlamadan önce diskalifiye edilir. Arka uç API'ı, web portalı, bir Azure İşlevi veya bir toplu işleyici ekleyen ekipler o projelerle tek birTesseractOcrMauikod satırını paylaşamazlar. İki OCR entegrasyonu yazarlar ve her ikisini süresiz olarak sürdürürler.

IronOCR platform sınırını kaldırır. Aynı IronTesseract sınıfı, aynı OcrInput ön işleme hattı ve aynı dil yapılandırması bir MAUI mobil uygulamasında ve Docker'a dağıtılmış birASP.NET CoreAPI'sinde tam olarak aynı çalışır. Paylaşılan bir sınıf kütüphanesi, tüm çözüm boyunca OCR mantığını taşır. Ürün büyüdüğünde — ve ürünler büyür — OCR katmanı herhangi bir yeniden yazma olmaksızın büyür. $999 süresiz lisans, bu mimari özgürlüğü yerleşik PDF desteği, gerçek dünya mobil görüntülerini işleyen ön işleme ve üretim sorunları ortaya çıktığında ticari destek ile birlikte satın alır.

İndirme sayısı farkı —TesseractOcrMauiiçin yaklaşık 33,900'e karşıIronOCR için milyonlarla karşılaştırıldığında — niş bir deneysel araç ile geniş ölçekte üretime dağıtılan bir kütüphane arasındaki farkı yansıtır. Sunucu-tarafı gereksinimlerine giden bir yolu olmayan, yalnızca MAUI-projesinde kanıt-of-konsept çalışması için,TesseractOcrMauimakul bir ücretsiz başlangıç noktasıdır. Üretim uygulamaları için getirdiği mimari kısıtlama,IronOCR lisansının edinme maliyetinden daha fazla iş çevresel maliyet doğuracaktır.

Lütfen dikkate alınTesseract, ilgili sahibinin tescilli ticari markasıdır. Bu site, Google ile bağlantılı, 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.

Sıkça Sorulan Sorular

Tesseract.MAUI nedir?

Tesseract.MAUI, geliştiriciler ve işletmeler tarafından görüntülerden ve belgelerden metin çıkarmak için kullanılan bir OCR çözümüdür. IronOCR for .NET uygulama geliştirme ile birlikte değerlendirilen birkaç OCR seçeneğinden biridir.

IronOCR, .NET geliştiricileri için Tesseract.MAUI ile nasıl karşılaştırılır?

IronOCR, IronTesseract'i çekirdek motoru olarak kullanan bir NuGet-yerel .NET OCR kütüphanesidir. Tesseract.MAUI ile karşılaştırıldığında, daha basit bir dağıtım (SDK yükleyiciler yok), sabit fiyatlandırma ve COM uyumluluğu veya bulut bağımlılıkları olmadan temiz bir C# API sunar.

IronOCR, Tesseract.MAUI'den daha kolay mı kuruluyor?

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.MAUI ve IronOCR arasında hangi doğruluk farkları vardır?

IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranmış formlar için yüksek tanıma doğruluğu sağlar. Çok kötü durumda olan belgeler ya da nadir yazılar için ise doğruluk, kaynak kalitesine göre değişiklik gösterebilir. IronOCR, düşük kaliteli girişlerde tanımayı geliştirmek için görüntü ön işleme filtreleri içerir.

IronOCR, PDF metin çıkarma desteği sunuyor mu?

Evet. IronOCR, tek bir çağrıda hem yerel PDF'lerden hem de taranmış PDF görüntülerinden metin çıkarır. Çok sayfalı TIFF dosyaları, görüntüler ve akıntılar da desteklenir. Taranmış PDF'ler için, OCR sayfa bazında uygulanır ve her sayfa için sonuç nesneleri sağlanır.

Tesseract.MAUI lisansı 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.MAUI'nin aksine Docker ve containerize 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 satın almadan önce Tesseract.MAUI ile karşılaştırarak 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.MAUI'den IronOCR'a geçiş yapmak kolay mı?

Tesseract.MAUI'den IronOCR'a geçiş genellikle başlangıç dizilerini IronTesseract örnekleme ile 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