RapidOCR.NET'den IronOCR'ye geçiş yapma
Bu kılavuz, .NET geliştiricileri için OCR hattındaki ONNX model dosyası yönetimini ortadan kaldırması gerekenler için RapidOCR.NET (RapidOcrNet) 'ten IronOCR'a geçiş yolunun tamamını kapsar. Paket değişimini, kod çevirisini ve dış model bağımlılıkları tamamen kaldırıldığında meydana gelen operasyonel değişiklikleri adım adım açıklar.
RapidOCR.NET'ten Neden Geçiş Yapılmalı?
RapidOCR.NET çalışır — ancak sınırlı bir dizi kullanım durumu için, kontrollü ortamlarda, biri model dağıtım sorununu zaten çözdüğünde. Bu koşulların herhangi biri değiştiğinde, kütüphanenin mimari sınırlamaları mühendislik maliyetlerine dönüşür.
ONNX Model Dosyaları Bir Dağıtım Artifaktıdır, Paket Değildir. RapidOCR.NET, tek bir karakter tanınmadan önce — det.onnx, cls.onnx, rec.onnx ve bir karakter sözlüğü — olmak üzere dört harici dosya gerektirir. Bu dosyalar NuGet paketinde paketlenmemiştir. GitHub sürüm sayfalarında yaşarlar, manuel indirme gerektirirler, kodda açık yolu gerektirirler ve derleme sırasında kopyalamak için özel MSBuild kuralları gerektirirler. Her yeni geliştirici, her CI boru hattı, her dağıtım ortamı bu töreni tekrarlar.
Dil Değiştirmek Dosya Değiştirmek Demektir, Yapılandırma Değil. RapidOCR.NET'te İngilizce OCR'den Çince OCR'ye değiştirmek, farklı bir tanıma modeli ve farklı bir karakter sözlüğü indirilmesini, ardından motor örneğini yeniden inşa etmeyi gerektirir. İspanyolca, Fransızca, Almanca, Rusça, Arapça ve 100'den fazla başka dilin RapidOCR model kataloğunda hiç mevcut bile modeli yoktur. Bir dizi dil karışımı içinde belgeleri işlemeyi karşılaması gereken bir uygulama, RapidOCR.NET içinde desteklenmeyenler için uygulanabilir bir yol sahip değildir.
Model Sürüm Güncellemeleri Manuel Müdahale Gerektirir. Üst akışı RapidOCR projesi iyileştirilmiş model ağırlıkları yayınladığında, ekiplerin yeni dosyaları indirmesi, her ortamda değiştirmesi, yolları doğrulaması ve yeniden dağıtması gerekir. Bunu otomatik olarak ele alan bir paket geri yükleme adımı yoktur. Geliştirme, aşama ve üretim içeren çok ortamlı bir yapılandırmada, o yayılım her seferinde manuel bir operasyondur.
ONNX Runtime Bağımlılığı Platform Karmaşıklığını Arttırır. RapidOCR.NET, platforma özgü yerel ikili dosyalar içeren Microsoft.ML.OnnxRuntime adlı bir pakete bağımlıdır. CPU ve GPU varyantları farklı paketler gerektirir. linux/amd64 için oluşturulan bir kapsayıcı görüntüsü, linux/arm64 için oluşturulan bir görüntüden farklı ikili dosyalar gerektirir. Her dağıtım hedefinin, doğru çalışma zamanı varyantının mevcut olduğunu ve yüklenmiş model dosyalarıyla uyumlu olduğunu doğrulaması gerekir.
Soğuk Başlangıç Gecikmesi ve Bellek Ayak İzi Sabit Maliyetlerdir. Üç ONNX modeli başlangıçta yüklemek 2–5 saniye sürer ve işlem süresince bellekte 300–500 MB tutar. Bu maliyet, OCR hacminden bağımsız olarak ödenir ve kütüphaneyi sunucusuz işlevler, hafif kapsayıcılar veya başlangıç cezasının verimle orantısız olduğu düşük trafikli hizmetler için kötü bir uyum sağlar.
Hiçbir Ticari Destek Yolu Yok. RapidOCR.NET, Apache 2.0 lisansı altında tek bir topluluk geliştiricisi tarafından bakım yapılmaktadır. Üretim olayları — ONNX Çalışma Süresi sürüm çakışmaları, sıra dışı görüntü formatlarında çıkarım hataları, sürekli yük altında bellek büyümesi — yanıt tarihi ve SLA garantisi olmayan bir GitHub sorunları kuyruğuna gider.
Temel Sorun
Üç ONNX model dosyası artı bir karakter sözlüğü, ayrı ayrı indirilen, yol ile yapılandırılan:
// RapidOcrNet: 4 external files required before any OCR can execute
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "./models/det.onnx", // ~3 MB — downloaded from GitHub
ClsModelPath = "./models/cls.onnx", // ~1 MB — downloaded from GitHub
RecModelPath = "./models/rec_en.onnx", // ~2-10 MB — language-specific download
KeysPath = "./models/en_keys.txt" // character dictionary — language-specific
});
IronOCR'un model dosyaları yok, yol yapılandırması yok ve indirme adımı yoktur:
// IronOCR: install the NuGet package, write one line
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
##IronOCR ve RapidOCR.NET: Özellik Karşılaştırması
IronOCR ve RapidOCR.NET temel görüntü OCR üzerinde örtüşür. Her çevresel endişenin üzerinde bir açıklık açılır.
| Özellik | RapidOCR.NET | IronOCR |
|---|---|---|
| NuGet yükleme | Evet (RapidOcrNet) | Evet (IronOcr) |
| Dış model dosyaları gerekli | Evet (4 dosya, manuel indirme) | Hayır |
| Yol yapılandırması gerekli | Evet | Hayır |
| MSBuild kopyalama kuralları gerekli | Evet | Hayır |
| NuGet yüklemesinden hemen sonra çalışır | Hayır | Evet |
| ONNX Çalışma Süresi bağımlılığı | Evet (~30–50 MB) | Hayır |
| Desteklenen diller | ~5 (CJK + yalnızca İngilizce) | 125+ NuGet dil paketleri aracılığıyla |
| Dil değiştirme | Dosya değişimi + motor yeniden inşa | Özellik atama |
| Avrupa dili desteği | Hayır | Evet (30+) |
| Arapça / İbranice desteği | Hayır | Evet |
| Kiril (Rusça, Ukraynaca) desteği | Hayır | Evet |
| Yerel PDF girişi | Hayır | Evet |
| Şifre ile korunan PDF girişi | Hayır | Evet |
| Aranabilir PDF çıktısı | Hayır | Evet |
| Çok sayfalı TIFF girişi | Hayır | Evet |
| Akış ve bayt dizisi girdisi | Sınırlı | Evet |
| Dahili resim ön işleme | Hayır | Evet (otomatik + manuel filtreler) |
| Eğiklik düzeltme / Gürültü Azaltma / Kontrast filtreleri | Hayır | Evet |
| Yapılandırılmış çıktı (paragraflar, satırlar, kelimeler) | Kısmen (yalnızca bloklar) | Evet, koordinatlarla |
| Kelime başına güvenilirlik puanları | Evet (blok başına) | Evet |
| OCR sırasında barkod okuma | Hayır | Evet |
| hOCR içeri aktarma | Hayır | Evet |
| Thread-safe paralel işleme | Sınırlı | Evet, (iş parçacığı başına bir örnek) |
| Çapraz platform dağıtımı | Her platform için ONNX Çalışma Süresi ikili dosyaları gerektirir | Evet (Windows, Linux, macOS, Docker) |
| Docker dağıtımı | Manuel model KOPYALA talimatları gerekli | Kutudan çıktığı gibi |
| Soğuk başlangıç üst yükü | 2–5 saniye (model yükleme) | Minimal |
| Ticari destek | Hayır | Evet |
| Lisans | Apache 2.0 (ücretsiz) | Süresiz ($999 Lite, $1,499 Pro, $2,999 Enterprise) |
Hızlı Başlangıç: RapidOCR.NET'ten IronOCR'a Geçiş
Adım 1: NuGet Paketini Değiştirin
RapidOCR.NET ve ONNX Çalışma Süresi bağımlılığını kaldırın:
dotnet remove package RapidOcrNet
dotnet remove package Microsoft.ML.OnnxRuntime
NuGet kullanarak IronOCR'u yükleyin:
Adım 2: Ad Alanlarını Güncelleyin
RapidOCR.NET ad alanınıIronOCR ad alanı ile değiştirin:
// Before (RapidOCR.NET)
using RapidOcrNet;
// After (IronOCR)
using IronOcr;
Adım 3: Lisansa İzin Verin
Herhangi bir IronTesseract çağrısından önce, uygulama başlatılırken lisans başlatmasını ekleyin:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Ücretsiz bir deneme anahtarı IronOCR lisanslama sayfasından mevcuttur.
Kod Göç Örnekleri
ONNX Model Yol Yapılandırması Kaldırılması
Bu geçişteki en mekanik değişiklik, RapidOcrOptions yapılandırma bloğunu silmek ve bunun yerine sıfır argümanlı bir yapılandırıcı ile değiştirmektir.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
// Startup validation — written because a missing model crashes at runtime, not at install
private static void EnsureModelsPresent(string modelDir)
{
var required = new[]
{
Path.Combine(modelDir, "det.onnx"),
Path.Combine(modelDir, "cls.onnx"),
Path.Combine(modelDir, "rec_en.onnx"),
Path.Combine(modelDir, "en_keys.txt")
};
var missing = required.Where(f => !File.Exists(f)).ToList();
if (missing.Any())
throw new FileNotFoundException(
$"Missing model files: {string.Join(", ", missing)}\n" +
"Download from: https://github.com/RapidAI/RapidOCR/releases");
}
// Engine factory — called once at startup, held for lifetime of service
public RapidOcrEngine CreateEngine(string modelDir)
{
EnsureModelsPresent(modelDir);
return new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt"),
UseGpu = false,
NumThreads = Environment.ProcessorCount
});
}
IronOCR Yaklaşımı:
using IronOcr;
//Hayırmodel validation, no path configuration, no GPU flags
// IronTesseract is thread-safe; create one per thread or on demand
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
Tüm EnsureModelsPresent doğrulama yöntemi, RapidOcrOptions yapılandırma nesnesi ve motor fabrika sınıfı silinebilir. İronOCR, motorunu bir NuGet paketi olarak dahili olarak gönderdiği için model dosyalarının doğrulanması gerekmez. IronTesseract kurulum rehberi, başlatma seçeneklerini ve lisans anahtarı yerleşimini detaylı olarak kapsar.
Tanıma, Sınıflandırma ve Tanıma Boru Hattının Konsolidasyonu
RapidOCR.NET, algılama, yön sınıflandırması ve ardından tanıma olmak üzere üç aşamalı bir ONNX boru hattı çalıştırır ve çağıranın sıralayıp monte etmesi gereken sırasız düz bir metin blokları listesi döndürür. IronOCR, iç Tesseract 5 motoru tarafından desteklenen tek bir .Read() çağrısını açığa çıkarır ve okuma sırası zaten uygulanmış olarak yapılandırılmış çıktı döndürür.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
public class InvoiceTextExtractor
{
private readonly RapidOcrEngine _engine;
public InvoiceTextExtractor(string modelDir)
{
// Three separate ONNX models run in sequence on every call
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"), // Stage 1: detect text regions
ClsModelPath = Path.Combine(modelDir, "cls.onnx"), // Stage 2: classify direction
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),// Stage 3: recognize characters
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ExtractInvoiceText(string imagePath)
{
var result = _engine.Run(imagePath);
// Blocks are unordered — must sort by vertical position, then horizontal
var orderedBlocks = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left)
.ToList();
// Manual assembly — no paragraph or line structure
return string.Join(Environment.NewLine,
orderedBlocks.Select(b => b.Text));
}
}
IronOCR Yaklaşımı:
using IronOcr;
public class InvoiceTextExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractInvoiceText(string imagePath)
{
// Single call — detection, recognition, reading order all internal
var result = _ocr.Read(imagePath);
return result.Text; // Already in reading order
}
public IEnumerable<string> ExtractInvoiceParagraphs(string imagePath)
{
var result = _ocr.Read(imagePath);
// Structured paragraphs with coordinates — no sorting or assembly needed
foreach (var page in result.Pages)
foreach (var paragraph in page.Paragraphs)
yield return paragraph.Text;
}
}
Üç aşamalı boru hattı, IronOCR'a tamamen dahildir. Manuel OrderBy zinciriyle birlikte result.TextBlocks listesi result.Text ile çakışır. TextBlocks 'den sınır kutusu verisi almak isteyen çağrılar için, result.Pages[i].Paragraphs, .Lines ve .Words koleksiyonları, yapılandırılmış bir API aracılığıyla eşdeğer koordinatlar sağlar. sonuçları okuma kılavuzu ve OCR sonuçları özellikleri sayfası tam yapılandırılmış çıktı modelini belgeler.
Özel Model Yükleme Değiştirme
Çalışma anında farklı OCR yapılandırmalarına geçmek isteyen uygulamalar — örneğin, belgenin türüne göre farklı tanıma parametreleri ile belgeleri yönlendiren — RapidOCR.NET'de tüm RapidOcrEngine inşa etmek zorundadır çünkü yapılandırma yapıcıya bağlanmıştır. IronOCR, motor yapılandırmasını bir örnek üzerinde, okuyuş başına ayarlanabilecek özellikler olarak sunar.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
public class DocumentRouter
{
private readonly string _modelDir;
public DocumentRouter(string modelDir) => _modelDir = modelDir;
// Must create separate engine instances per configuration
// Each engine holds ~300-500 MB of loaded model weights
private RapidOcrEngine BuildEnglishEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "en_rec.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
private RapidOcrEngine BuildChineseEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "ch_rec.onnx"), // separate download
KeysPath = Path.Combine(_modelDir, "ch_keys.txt") // separate download
});
public string ProcessDocument(string imagePath, string language)
{
// Rebuild engine for each language — model reload cost on every switch
using var engine = language == "chinese"
? BuildChineseEngine()
: BuildEnglishEngine();
var result = engine.Run(imagePath);
return string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
}
}
IronOCR Yaklaşımı:
using IronOcr;
public class DocumentRouter
{
// One instance handles all languages — language is a property, not a constructor param
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessDocument(string imagePath, string language)
{
// Language switch requires no model reload, no rebuild
_ocr.Language = language switch
{
"chinese" => OcrLanguage.ChineseSimplified,
"japanese" => OcrLanguage.Japanese,
"arabic" => OcrLanguage.Arabic,
"russian" => OcrLanguage.Russian,
_ => OcrLanguage.English
};
return _ocr.Read(imagePath).Text;
}
}
Motor yeniden inşası, model tekrar yüklemesi, dil başına ayrı indirme yok. İngilizce olmayan hedefler için dil paketleri NuGet — dotnet add package IronOcr.Languages.ChineseSimplified — aracılığıyla yüklenir ve geri yükleme adımı dağıtımı otomatik olarak gerçekleştirir. birden çok dil nasıl yapılır kılavuzu, dil paketi yüklemelerini ve diller dizini, 125'ten fazla mevcudu listeler.
Toplu İşleme Geçişi
RapidOCR.NET, tek bir RapidOcrEngine örneği üzerinde hiçbir iş parçacığı güvenliği garantisi vermez. Toplu işleme, ya tek iş parçacıklı bir sıra ya da kendi 300–500 MB model ayak izi taşıyan iş parçacığı başına motor oluşturumu gerektirir.IronOCR açıkça iş parçacığı güvenlidir: her iş parçacığı için bir IronTesseract oluşturun ve bu işlemleri kilitlemeden eşzamanlı olarak çalıştırın.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
public class BatchOcrProcessor
{
private readonly string _modelDir;
public BatchOcrProcessor(string modelDir) => _modelDir = modelDir;
// Thread-pool processing — each thread needs its own engine copy
// 4 threads × 300-500 MB model footprint = 1.2-2 GB RAM minimum
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Each thread must create its own engine — not safe to share
using var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
var result = engine.Run(imagePath);
results[imagePath] = string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
});
return new Dictionary<string, string>(results);
}
}
IronOCR Yaklaşımı:
using IronOcr;
public class BatchOcrProcessor
{
// Thread-safe: create IronTesseract per thread, no shared state required
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
// Lightweight construction — no model loading overhead per thread
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
results[imagePath] = result.Text;
});
return new Dictionary<string, string>(results);
}
}
İş parçacığı başına RapidOcrEngine örnekleme kaybolur.IronOCR iş parçacığı örnekleri hafiftir — oluşturma sırasında dış model yüklemesi yok. çok iş parçacığı örneği, yüksek geçiş hatları için eşzamanlı işleme desenlerini gözler önüne serer.
Çoklu Çerçeve TIFF İşleme
RapidOCR.NET sadece tek bir görüntü dosyası kabul eder. Çok sayfalı bir TIFF işlemek — faksla alınan belgeler ve taranan arşivler için standart format — ayrı bir görüntüleme kütüphanesi ile bireysel karelere bölünmesini, bu karelerin geçici dosyalara kaydedilmesini, her birine engine.Run() çalıştırılmasını ve sonrasında temizlenmesini gerektirir. IronOCR, OcrInput.LoadImageFrames aracılığıyla çok kareli TIFF'i yerel olarak işler.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
// Also requires: SixLabors.ImageSharp or System.Drawing for TIFF frame extraction
public class TiffOcrProcessor
{
private readonly RapidOcrEngine _engine;
public TiffOcrProcessor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ProcessMultiPageTiff(string tiffPath)
{
var pageTexts = new List<string>();
var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
// External library required to split TIFF frames
var framePaths = SplitTiffIntoFrames(tiffPath, tempDir); // not in RapidOcrNet
foreach (var framePath in framePaths)
{
var result = _engine.Run(framePath);
pageTexts.Add(string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text)));
}
}
finally
{
// Clean up temp frame files
Directory.Delete(tempDir, recursive: true);
}
return string.Join("\n\n", pageTexts);
}
private IEnumerable<string> SplitTiffIntoFrames(string tiffPath, string outputDir)
{
// Requires external library — implementation depends on what is installed
throw new NotImplementedException("Add SixLabors.ImageSharp or similar");
}
}
IronOCR Yaklaşımı:
using IronOcr;
public class TiffOcrProcessor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // All frames loaded — no external library needed
var result = _ocr.Read(input);
return result.Text; // Pages assembled in order automatically
}
public IEnumerable<(int PageNumber, string Text, double Confidence)> ProcessTiffWithPageData(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath);
var result = _ocr.Read(input);
foreach (var page in result.Pages)
yield return (page.PageNumber, page.Text, page.Confidence);
}
}
Dış görüntü işleme kütüphanesi yok, geçici dosyalar yok, temizleme mantığı yok. LoadImageFrames tüm TIFF karelerini bir OcrInput hattına tek bir çağrıda okur. Kare seçimi, sayfa aralığı filtreleme ve büyük çok çerçeveli belgelerin bellek verimli işleme için TIFF ve GIF girdi nasıl yapılır kılavuzunu içermektedir.
Taralı Formlardan Yapılandırılmış Veri Çıkarımı
RapidOCR.NET, daha üst seviye belge yapısı olmadan — paragraflar, satırlar veya kelimeler kavramı olmadan — sınır kutusu ile metin bloklarını döndürür. Taralı formdan bireysel alanları çıkarmak, ham blok listesine karşı koordinat kesişim mantığı yazmayı gerektirir. IronOCR, karakter seviyesine kadar yapılandırılmış bir sonuç ağacı sağlar ve her seviyede koordinatlar içerir.
RapidOCR.NET Yaklaşımı:
using RapidOcrNet;
public class FormFieldExtractor
{
private readonly RapidOcrEngine _engine;
public FormFieldExtractor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
// Extract text within a defined region by filtering block coordinates manually
public string ExtractFieldByRegion(string imagePath, float regionLeft, float regionTop,
float regionRight, float regionBottom)
{
var result = _engine.Run(imagePath);
// Filter blocks whose bounding box intersects the target region
var blocksInRegion = result.TextBlocks
.Where(b =>
b.BoundingBox.Left < regionRight &&
b.BoundingBox.Right > regionLeft &&
b.BoundingBox.Top < regionBottom &&
b.BoundingBox.Bottom > regionTop)
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
return string.Join(" ", blocksInRegion.Select(b => b.Text));
}
}
IronOCR Yaklaşımı:
using IronOcr;
public class FormFieldExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
// Use CropRectangle to OCR only the target region — no post-filter needed
public string ExtractFieldByRegion(string imagePath, int x, int y, int width, int height)
{
var region = new CropRectangle(x, y, width, height);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
return _ocr.Read(input).Text;
}
// Extract all fields with their coordinates from a full-page scan
public IEnumerable<(string Text, int X, int Y, double Confidence)> ExtractAllWords(string imagePath)
{
var result = _ocr.Read(imagePath);
foreach (var page in result.Pages)
foreach (var word in page.Words)
yield return (word.Text, word.X, word.Y, word.Confidence);
}
}
CropRectangle OCR'yi kesin ilgi alanına hapseder, bu tam sayfa OCR çalıştırıp sonuçları daha sonra filtrelemekten daha hızlı ve daha doğrudur. Kelime başına koordinatlar ve güven değerleri, herhangi bir manuel sınır kutusu kesişme kodu olmadan doğrudan result.Pages[i].Words üzerinde mevcuttur. bölgeli tabanlı OCR nasıl yapılır ve dikdörtgen kırpma örneği bu deseni detaylı olarak kapsar.
RapidOCR.NET API ile IronOCR Eşleme Referansı
| RapidOCR.NET | IronOCR Karşılığı |
|---|---|
using RapidOcrNet | using IronOcr |
new RapidOcrEngine(new RapidOcrOptions { ... }) | new IronTesseract() |
RapidOcrOptions.DetModelPath | Gerekli değil — dahili olarak paketlenmiş |
RapidOcrOptions.ClsModelPath | Gerekli değil — dahili olarak paketlenmiş |
RapidOcrOptions.RecModelPath | Gerekli değil — dahili olarak paketlenmiş |
RapidOcrOptions.KeysPath | Gerekli değil — dahili olarak paketlenmiş |
RapidOcrOptions.UseGpu | Uygulanamaz — Dahili olarak CPU-optimizasyonu yapılmış |
RapidOcrOptions.NumThreads | Bir iş parçacığı başına bir IronTesseract ile Parallel.ForEach kullanın |
engine.Run(imagePath) | ocr.Read(imagePath) |
engine.Dispose() | using var ocr = new IronTesseract() |
result.TextBlocks | result.Pages[i].Words / .Lines / .Paragraphs |
result.TextBlocks[i].Text | result.Words[i].Text |
result.TextBlocks[i].Confidence | result.Words[i].Confidence |
result.TextBlocks[i].BoundingBox.Top | result.Words[i].Y |
result.TextBlocks[i].BoundingBox.Left | result.Words[i].X |
Manuel OrderBy(b => b.BoundingBox.Top) sıralama | Gerekli değil — result.Text okuma sırasındadır |
string.Join("\n", result.TextBlocks.Select(b => b.Text)) | result.Text |
| Dil dosyası değişimi (farklı model indirin) | ocr.Language = OcrLanguage.French |
| Dil değişikliği için motorun yeniden derlenmesi | Gerekli değil — her çağrıda ocr.Language ayarlayın |
PDF'ten görüntüye + engine.Run() döngüsü | ocr.Read("document.pdf") |
| Çok çerçeveli TIFF manuel çerçeve ayırma | input.LoadImageFrames("document.tiff") |
| Aranabilir PDF yeteneği yok | result.SaveAsSearchablePdf("output.pdf") |
| Barkod yeteneği yok | ocr.Configuration.ReadBarCodes = true |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Modeller Dizini Taşındıktan Sonra Hâlâ Mevcut
RapidOCR.NET: Projede models/ dizini, derlemede kopyalanan MSBuild <Content> girdileriyle birlikte det.onnx, cls.onnx, rec_en.onnx ve en_keys.txt içerir. IronOCR'a geçtikten sonra, bu dizin ve bu girişler kalır ve hala derleme çıktısını şişirir.
Çözüm: models/ dizinini silin, karşılık gelen <ItemGroup> .csproj 'dan kaldırın ve eksik dosyaları kontrol eden herhangi bir başlangıç doğrulama mantığını kaldırın. Microsoft.ML.OnnxRuntime NuGet referansını ayrı olarak yüklendiyse ayrıca kaldırın.IronOCR kullanan bir .NET uygulamasının yayımlanmış çıktısı herhangi bir harici model dosyası içermez.
<!-- Remove this entire block from .csproj -->
<ItemGroup>
<Content Include="models\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Sorun 2: İş Parçacığı Başına Motor Yapım Deseni
RapidOCR.NET: Paylaşılan durum sorunlarını önlemek için her iş parçacığına yeni bir RapidOcrEngine oluşturan paralel işleme kodu, önemli bir bellek maliyeti taşıdı: her motor örneği bağımsız olarak 300–500 MB ONNX model ağırlığı yükledi.
**Çözüm:**IronOCRIronTesseract örnekleri iş parçacığı güvenlidir ve hafiftir. Her iş parçacığına bir Parallel.ForEach 'de oluşturun ve bir örnek başına model yükleme maliyeti hakkında endişelenmeden oluşturun.IronOCR yaklaşımı yukarıdaki Yığın İşleme Geçiş örneği ile aynıdır — IronTesseract bu senaryoyu, aynı iş parçacığı başına yapı örneği deseni ile işler, ancak her bir RapidOcrEngine örneğinin taşıdığı 300–500 MB model yükleme maliyeti olmadan. Çoklu iş parçacığı örneği yüksek verim hattı için standart deseni gösterir.
Sorun 3: Desteklenmeyen Dil İstisnası
RapidOCR.NET: RapidOCR.NET üzerinden CJK olmayan belgeleri yönlendiren veya var olmayan bir İspanyolca/Fransızca/Almanca modeli ile bir motor oluşturmayı deneyen kod, çalışma zamanında bir dosya bulunamadı hatası verebilir veya boş sonuçlar üretebilir.
Çözüm: Uygun dil paketi NuGet paketini yükleyin ve ocr.Language 'ı hedef OcrLanguage öbek değeri olarak ayarlayın. Hiçbir model indirmesi, motor yeniden derlenmesi, her dil için ek kod yolu yoktur:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.Spanish;
var result = ocr.Read("spanish-document.jpg");
özel dil paketleri kılavuzu standart 125+ paketin ötesinde gelişmiş dil yapılandırmasını kapsamaktadır.
Sorun 4: Metin Bloğu Sıralama Mantığı Taşındıktan Sonra Kopuyor
RapidOCR.NET: result.TextBlocks düz ve sırasız bir liste olduğu için, genellikle kod temelleri arasında, sonuç işleme kodu boyunca yayılmış .OrderBy(b => b.BoundingBox.Top).ThenBy(b => b.BoundingBox.Left) zincirleri vardı.
Çözüm: Bu sıralama mantığını tamamen silin. IronOCR'deki result.Text zaten doğal okuma sırasına göre dizilmiş durumda. Sıralanmış bloklardan da sınır kutusu koordinatlarını tüketen kodlar için, blok referansını result.Pages[i].Words[j] ile değiştirin:
// Before: manual sort + coordinate extraction
var sorted = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
foreach (var block in sorted)
Console.WriteLine($"{block.Text} at ({block.BoundingBox.Left}, {block.BoundingBox.Top})");
// After: structured access, already in order
foreach (var page in result.Pages)
foreach (var word in page.Words)
Console.WriteLine($"{word.Text} at ({word.X}, {word.Y})");
Sorun 5: Model Dosyaları Kaldırıldıktan Sonra CI/CD Hattı Başarısız Oluyor
RapidOCR.NET: Ayrı bir adım olarak bir artifakt depodan, paylaşılan bir S3 kovasından veya bir Git LFS deposundan models/ dizinini önbelleğe alan veya getiren yapı hatları, bu adımlar göçten sonra hiçbir şeyi geri yükleyemediklerinde başarısız olacaktır.
Çözüm: Model dosya getirme ve önbelleğe alma adımlarını CI hattından tamamen kaldırın. IronOCR'un motoru, standart dotnet restore adımının bir parçası olarak geri yüklenir. Ekstra bir hat safhası gerekmez. Kapsayıcılaştırılmış dağıtımlar için, herhangi bir COPY models/ ./models/ Docker talimatını kaldırın — IronOCR'nin Docker dağıtım kılavuzu, Debian/Ubuntu görüntülerinde gereken bir sistem paketini (libgdiplus) ve başka hiçbir şeyi belgelememektedir.
Sorun 6: Kısmi Taşınma Sonrası ONNX Çalışma Zamanı Sürüm Çatışmaları
RapidOCR.NET: Başka ONNX tabanlı ML paketleri (ML.NET, ONNX nesne tanıma, vb.) kullanan uygulamalar, RapidOCR.NET uyumu için belirli bir sürüme sabitlenmiş Microsoft.ML.OnnxRuntime değerine sahip olabilir. RapidOCR.NET'in kaldırılması, bu diğer paketlerde sürüm çatışmalarını ortaya çıkarabilir.
Çözüm: Microsoft.ML.OnnxRuntime 'yi açık paket listesinden kaldırın. IronOCR'un ONNX Runtime bağımlılığı olmadığı için RapidOCR.NET referansının kaldırılması tamamen sürüm sabitlemesini ortadan kaldırır. ONNX Çalışma Zamanına gerçekten ihtiyaç duyan diğer ML paketleri, RapidOCR.NET kısıtlaması olmadan kendi uyumlu sürümlerini standart NuGet bağımlılık çözümü ile çözebilirler.
RapidOCR.NET Taşınma Kontrol Listesi
Geçiş Öncesi Görevler
Değişiklik yapmadan önce tüm RapidOCR.NET kullanımını kod tabanında denetleyin:
# Find all files that reference RapidOcrNet
grep -r "RapidOcrNet\|RapidOcrEngine\|RapidOcrOptions" --include="*.cs" .
# Find model path configuration
grep -r "DetModelPath\|ClsModelPath\|RecModelPath\|KeysPath" --include="*.cs" .
# Find MSBuild model copy entries
grep -r "det\.onnx\|cls\.onnx\|rec.*\.onnx\|keys\.txt" --include="*.csproj" .
# Find model validation logic
grep -r "ValidateModel\|models/" --include="*.cs" .
# Find ONNX Runtime references
grep -r "OnnxRuntime\|Microsoft\.ML" --include="*.csproj" .
# Find language-switching patterns (multiple engine instances per language)
grep -r "CreateEnglishEngine\|CreateChineseEngine\|rec_en\|ch_rec\|en_keys\|ch_keys" --include="*.cs" .
Sonuçları envanterleyin: bir motorun oluşturulduğu her yeri, model yollarının ayarlandığı her yeri, metin bloklarının sıralandığı her yeri ve PDF'ten görüntü dönüşümünün engine.Run() 'ye beslendiği her yeri not edin.
Kod Güncelleme Görevleri
RapidOcrNetNuGet paket referansını tüm.csprojdosyalarından kaldırın.Microsoft.ML.OnnxRuntimeNuGet paket referansını tüm.csprojdosyalarından kaldırın.IronOcrNuGet paketini kurun.- Uygulamanın ihtiyaç duyduğu herhangi bir İngilizce olmayan dil için dil paketi NuGet paketlerini yükleyin.
models/dizinini projeden ve depodan silin.- Tüm
.csprojdosyalarından<Content Include="models\**\*.*">MSBuild girdilerini kaldırın. - Başlangıç model doğrulama yöntemlerini (
EnsureModelsPresenttarzı yöntemler) kaldırın. - Tüm kaynak dosyalarında
using RapidOcrNet'ıusing IronOcrile değiştirin. 9.new RapidOcrEngine(new RapidOcrOptions { ... })withnew IronTesseract()). engine.Run(imagePath)'yuocr.Read(imagePath)ile değiştirin.result.TextBlocksmontaj zincirlerini (.OrderBy().Select(b => b.Text))result.Textile değiştirin.- Koordinat filtreli alan çıkarımı,
CropRectanglebölge girişi ile değiştirin. - İş parçacığı başına motor yapımını, iş parçacığı başına
IronTesseractyapımı ile değiştirin. - Dil belirli motor fabrika yöntemlerini
ocr.Language = OcrLanguage.Xatamaları ile değiştirin. - PDF'ten görüntüye dönüşüm kodunu kaldırın ve doğrudan
ocr.Read("file.pdf")çağrılarıyla değiştirin. - Çok kareli TIFF çerçeve bölme kodunu kaldırın ve
input.LoadImageFrames("file.tiff")ile değiştirin. - Uygulama başlangıcında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"ekleyin. - CI/CD boru hattı tanımlarından model dosya getir ve önbellek adımlarını kaldırın.
- Docker dosyalarından ONNX model
COPYtalimatlarını kaldırın.
Geçiş Sonrası Testler
- Var olan görüntü OCR yollarının, RapidOCR.NET çıktısına eşit veya daha iyi doğrulukla metin döndürdüğünü doğrulayın.
result.Textokuma sırasının her belge türü için beklenen alan sırasıyla eşleştiğini doğrulayın.- Uygulamanın kullandığı her
OcrLanguagedeğeri için dil değiştirme okuma testleri yapın. - Paralel toplu işlemciyi çalıştırın ve hiçbir iş parçacığı çekişme hata ya da eski-sonuç sorunlarının olmadığını onaylayın.
- Çok çerçeveli TIFF işleminin, sayfaların doğru sayısını doğru her sayfa metni ile döndürdüğünü doğrulayın.
- Beklenen koordinat alanlarına karşı
CropRectangleyolu ile form alan çıkarımı testi yapın. models/dizininin derleme çıktısı ve dağıtım paketlerinde bulunmadığını doğrulayın.- CI hattını baştan sona çalıştırın ve hiçbir model getirme adımının kalmadığını onaylayın.
- Bir Docker kapsayıcısı oluşturup çalıştırın ve başlangıçta
COPY models/katmanı veya dosya bulunamadı hatalarına rastlanmadığını doğrulayın. - Soğuk başlangıç gecikmesinin azaldığını doğrulamak için bir başlangıç süresi ölçümü test edin.
IronOCR'a Geçişin Ana Faydaları
Dağıtım Artık Deterministiktir. dotnet restore ve dotnet publish, hiçbir harici dosya bağımlılığı olmadan eksiksiz ve çalışan bir OCR dağıtımı üretir. Paket sürümünü yükleyen aynı NuGet geri yükleme, motorun çalışması için gereken her şeyi yükler. Ayrı bir sürümleme yapılan model dosyası, yapı önbellek adımları veya dağıtım doğrulama komut dosyaları yoktur. Boru hattı, herhangi bir diğer .NET paket bağımlılığı kadar basittir.
Dil Kapsamı İş Gereksinimleriyle Ölçeklendiğinde. Yeni bir belge dili desteği eklemek, dotnet add package IronOcr.Languages.X çalıştırmak ve ocr.Language ayarlamak anlamına gelir. Yukarı akış model mevcudiyet kontrolü, model indirmesi ve motor yeniden düzenlemesi yoktur. İngilizce OCR ile başlayan ve daha sonra Alman sözleşmeleri, Arapça faturalar veya Rusça satın alma siparişleri işlemek zorunda olan ekipler, uygulama mimarisine dokunmadan kapsamı genişletebilir. Tüm 125+ dil paketleri aynı kurulum desenini izler.
Yapılandırılmış Çıktı, Koordinat Montaj Kodunu Ortadan Kaldırır. result.Pages, .Paragraphs, .Lines, .Words ve .Characters hiyerarşisi, düz TextBlocks listesinin ve yapısal eksikliğini aşmak için çalışan sıralama mantığının yerini alır. Blok koordinatlarını sıralayarak okuma sırası metni çıkaran kod silinir. Kelime başına sınır kutularına ihtiyaç duyan kod, word.X, word.Y, word.Width, word.Height 'den elde eder ve herhangi bir kesişim filtresi gerekmez. OCR sonuçları özellikler sayfası tam çıkış modelini belgelendirir.
PDF ve TIFF İşleme, Harici Kütüphane Gerektirmez. Tek görüntü JPGler dışında en yaygın iki belge formatı — çok sayfalı PDF'ler ve çok çerçeveli TIFF'ler —IronOCR tarafından yerel olarak ele alınır. PDF veya TIFF girdisiyle desteklemek için eklenen tüm dış kütüphaneler kaldırılabilir. Net sonuç: güncellenmesi gereken daha az paket, daha az sürüm uyumluluk yüzeyi ve daha basit proje dosyaları. PDF girişi nasıl yapılır ve TIFF girişi nasıl yapılır her iki formatı da ayrıntılı bir şekilde kapsamaktadır.
Üretim Olayları İçin Bir Destek Yolu Var. Ticari lisanslar, GitHub sorun yanıtını bekleyemeyecek sorunlar için bir iletişim noktası ile doğrudan e-posta desteği içerir. SLA yükümlülükleri veya iş açısından kritik belge işleme boru hatları olan ekipler, topluluk yanıtını beklemeden kütüphaneyi sürdüren mühendislere olayları yönlendirebilir. IronOCR dokümantasyon merkezi bu destek yolunun yanı sıra referans dokümantasyonu sağlar.
$999 Süresiz Lisans Tek Seferlik Bir Maliyettir. Sayfa başına fiyatlandırma, işlem başına faturalandırma yoktur ve maliyet görüşmesini yeniden açan yıllık yenileme yoktur. Model yönetimi, PDF dönüştürme çözümleri, CI boru hattı bakımı ve desteklenmeyen dil yönlendirmeleri üzerinde harcanan mühendislik saatlerini fiyatlandıran geliştirme ekipleri, lisans maliyetine karşı karşılaştırmada sürekli olarak lehte bulurlar.

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.