XImage.OCR'den IronOCR'ye Geçiş
Bu kılavuz, mevcut bir XImage.OCR entegrasyonunu IronOCR'ye geçiren .NET geliştiricileri içindir. Bu, paket konsolidasyon sürecini, alan adı ve API değişikliklerini ve XImage.OCR'nin parçalanmış mimarisi en çok sürtüşme yarattığı senaryolar için somut kod geçiş örneklerini kapsar. Karşılaştırma makalesinin önceden okunması gerekmez.
Neden XImage.OCR'den Geçiş Yapılmalı
XImage.OCR, işlevselliğini birlikte yapılandırılmış bir NuGet paket zinciri aracılığıyla dağıtan RasterEdge'den ticari bir Tesseract sarmalayıcıdır. Mimari, küçük ölçekte çalışır, ancak uygulamalar büyüdükçe bileşimsel bakım maliyetleri yaratır.
Paket Sayısı Her Dilde Artar. Bir dil eklemek, bir NuGet paket eklemek anlamına gelir. Beş dil destekli bir uygulama, .csproj içindeki altı paket taşır. On dil içeren bir uygulama, on birini taşır. Her paketin, zincirin yalnızca bir parçasını güncelleyen bir geliştirici, sessiz çalışma zamanı hatalarına yol açan bir kısıtlama olan çekirdekle aynı sürüme sabitlenmesi gerekir. IronOCR, tüm 125+ dili kapsayan bir paket sunar.
Sürüm Senkronizasyonu Sürekli Bir Risk. dotnet outdated paketleri açgözlülükle günceller. RasterEdge.XImage.OCR 12.5.0'a güncellendiğinde ancak XImage.OCR.Language.French 12.4.0'da kaldığında, hata çalışma zamanında ortaya çıkar, derleme zamanında değil ve mesaj nadiren sürüm senkronizasyonunu sebep olarak gösterir. CI/CD boru hattı çalıştıran ekipler, her XImage.OCR paketi için açık sürüm sabitlenmesini eklemeyi öğrenirler — yalnızca parçalanmış modeli telafi etmekten başka bir amaca hizmet etmeyen bir yük.
Yerleşik Ön İşleme, Gerçek Belge Doğruluğunu Sınırlar. XImage.OCR, görüntüleri doğrudan Tesseract motoruna gönderir. İki derece eğik ve 150 DPI tarama, Tesseract'e hiç değişmeden girer. Böyle bir giriş için doğruluk tavanı, hangi Tesseract sarmalayıcı kullanıldığından bağımsız olarak %60–75 aralığındadır. IronOCR, tanıma çalışmadan önce bu sorunları düzelten bir ön işleme hattı — Deskew(), DeNoise(), Contrast(), Binarize(), Sharpen() — gönderir.
Yapılandırılmış Çıktı için Elle Ayrıştırma Gereklidir. XImage.OCR sıradan bir dize döndürür. Kelime konumları, satır sınırları veya kelime başına güven puanları çıkarmak için o dizeyi kendiniz ayrıştırmanız gerekir. IronOCR, yerleşik piksellik koordinatları ve güven puanları ile birlikte Pages, Paragraphs, Lines, Words ve karakter başına veri ile bir OcrResult nesnesi döndürür.
Çıkış Formatları Sadece Düz Metinde Biter. XImage.OCR sonucundan aranabilir bir PDF yazmak, RasterEdge PDF SDK'sını gerektirir — ikinci bir ticari satın alma. IronOCR, ek bir bağımlılık olmadan result.SaveAsSearchablePdf() aracılığıyla aranabilir PDF'ler oluşturur.
Platformlar Arası Dağıtım Desteklenmez. XImage.OCR, Windows'u hedefler. Linux konteynerler, macOS geliştirme ortamları ve Azure veya AWS'de bulut tabanlı dağıtımlar farklı bir kütüphane gerektirir. IronOCR, aynı paketten Windows, Linux, macOS, Docker, Azure App Service ve AWS Lambda'da çalışır.
Temel Sorun
XImage.OCR, dil başına bir NuGet paketi gerektirir. On dili ifade etmek, her birine kilitli on bir paket anlamına gelir:
<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
IronOCR, tüm bloğu tek bir satırla değiştirir:
<!-- IronOCR: One package. 125+ languages.Hayırversion coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
##IronOCR vs XImage.OCR: Özellik Karşılaştırması
Aşağıdaki tablo, geçiş kararına en uygun yetenekleri kapsar.
| Özellik | XImage.OCR | IronOCR |
|---|---|---|
| Yalnızca İngilizce için NuGet paketleri | 2 (çekirdek + dil paketi) | 1 |
| 10 dil için NuGet paketleri | 11 | 1 |
| Sürüm senkronizasyonu gerekli | Evet — tüm paketlerin eşleşmesi gerekir | Hayır |
| Mevcut diller | ~15 ayrı paket olarak | 125+ toplu |
| Yerleşik ön işleme | None | Deskew, DeNoise, Kontrast, Binarizasyon, Keskinleştirme, Ölçekleme, Geliştirme, Erod, Ters Çevir |
| Derin gürültü giderme | None | Evet (DeepCleanBackgroundNoise()) |
| Yerel PDF girişi | RasterEdge PDF SDK gerektirir | Evet (input.LoadPdf()) |
| Aranabilir PDF çıktısı | RasterEdge PDF SDK gerektirir | Evet (result.SaveAsSearchablePdf()) |
| Çok sayfalı TIFF girişi | Sınırlı | Evet (input.LoadImageFrames()) |
| Bayt dizisi girişi | MemoryStream aracılığıyla elle | Evet (input.LoadImage(bytes)) |
| Akış girişi | Yönerge | Evet (input.LoadImage(stream)) |
| Yapısal çıktı | Düz dize | Sayfalar, Paragraflar, Satırlar, Kelimeler, Koordinatlı Karakterler |
| Kelime başına güven puanları | Mevcut değil | Evet |
| Barkod okuma | Mevcut değil | Evet (ocr.Configuration.ReadBarCodes = true) |
| hOCR ihracat | Mevcut değil | Evet |
| Thread güvenliği | İş parçacığı güvenli değil | Tam iş parçacığı güvenliği |
| Bellek modeli (paralel) | İş parçacığı başına bir işleyici örneği | Tek bir paylaşılan örnek |
| Çapraz platform | Öncelikli olarak Windows | Windows, Linux, macOS, Docker, Azure, AWS |
| .NET uyumluluğu | .NET Standard 2.0, .NET Framework 4.5+ | .NET Framework 4.6.2+, .NET Core, .NET 5/6/7/8/9 |
| Lisans türü | Ticari (RasterEdge) | Süresiz (Lite $999, Pro $1,499, Enterprise $2,999) |
| Ticari destek | RasterEdge desteği | Evet, lisansa göre kademeli |
Hızlı Başlangıç: XImage.OCR'den IronOCR'e Geçiş
Adım 1: NuGet Paketlerini Değiştirin
Tüm XImage.OCR paketlerini kaldırın. Komut sayısı, yüklediğiniz dil paketleri sayısıyla eşleşir:
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
NuGet kullanarak IronOCR'u yükleyin:
Adım 2: Ad Alanlarını Güncelleyin
RasterEdge ad alanı alımlarını, tek bir IronOCR ad alanı ile değiştirin:
// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;
// After (IronOCR)
using IronOcr;
Adım 3: Lisansa İzin Verin
Uygulama başlatmada bir kez lisans başlatma ekleyin, herhangi bir OCR çağrısından önce:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Anahtarı, sabit kodlamak yerine bir bir ortam değişkeni ya da gizlilik yöneticisinde saklayın:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")Kod Göç Örnekleri
Çoklu Paket Başlatma Birleştirme
İlk geçiş görevi, XImage.OCR başlatma bloğunu — lisans aktivasyonu, işleyici oluşturma ve dize tabanlı dil ataması —IronOCR eşdeğerine sabitlemektir.
XImage.OCR Yaklaşımı:
// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");
var ocrHandler = new OCRHandler();
// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };
// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
IronOCR Yaklaşımı:
// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";
var ocr = new IronTesseract();
// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
XImage.OCR içindeki metin tabanlı dil kodları ("eng", "deu") karşılık gelen NuGet paketi yoksa veya yanlış sürümdeyse çalışma zamanında başarısız olur. IronOCR'daki OcrLanguage enum, geçersiz dil kombinasyonlarının derlenmesini olanaksız hale getirir. IronTesseract kurulum kılavuzu motor yapılandırma seçeneklerini tam olarak kapsar ve birden fazla dil nasıl yapılır kılavuzu karışık dilli belgeler için birincil ve ikincil dil kombinasyonlarının nasıl çalıştığını açıklar.
Görüntü Formatı İşleme Birleştirme
XImage.OCR, her resim kaynağını formata bağlı olarak farklı şekilde işler. Bayt dizileri, akışlar ve dosya yolları, her biri hafifçe farklı kod yolları gerektirir.IronOCR bunların hepsini aynı OcrInput yöntemleriyle kabul eder.
XImage.OCR Yaklaşımı:
// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");
// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
string resultFromBytes = ocrHandler.Process(tempPath);
Console.WriteLine(resultFromBytes);
}
finally
{
File.Delete(tempPath); //Yönergecleanup — easy to forget
}
// Multi-page TIFF — must split frames manually
//Hayırbuilt-in TIFF frame iteration in base XImage.OCR
IronOCR Yaklaşımı:
// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// File path
using (var input = new OcrInput())
{
input.LoadImage("invoice.jpg");
var result = ocr.Read(input);
Console.WriteLine($"From file: {result.Text}");
}
// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
input.LoadImage(imageBytes);
var result = ocr.Read(input);
Console.WriteLine($"From bytes: {result.Text}");
}
// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
input.LoadImageFrames("scanned-archive.tiff");
var result = ocr.Read(input);
Console.WriteLine($"TIFF pages: {result.Pages.Count}");
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
XImage.OCR'deki bayt dizileri için geçici dosya deseni, hata yollarında disk şişmesi ve sızan dosyaların ortak bir kaynağıdır. IronOCR'un LoadImage(byte[]) tamamen ara dosyayı ortadan kaldırır. görüntü girişi kılavuzu ve TIFF/GIF girişi kılavuzu, akışları ve çok-yuvalı işlemleri de içeren her desteklenen kaynak türünü kapsar.
Çıkış Formatı Yuvarlama
XImage.OCR sıradan bir dize döner. Aranabilir bir PDF oluşturmak, ikinci bir RasterEdge ürünü gerektirir. IronOCR, ek paketler olmadan aynı sonuç nesnesinden düz metin, aranabilir PDF'ler ve yapılandırılmış veriler üretir.
XImage.OCR Yaklaşımı:
// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string plainText = ocrHandler.Process("scanned-contract.jpg");
// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
//Hayırbuilt-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
IronOCR Yaklaşımı:
// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");
var result = ocr.Read(input);
// Plain text
Console.WriteLine(result.Text);
// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence < 70)
.ToList();
Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
SaveAsSearchablePdf() çağrısı, tanınan metni orijinal görüntünün altında gizli bir katman olarak yerleştirir, bu şekilde belgenin görsel görünümünü değiştirmeden tamamen metin aranabilir hale getirir. Aranabilir PDF kılavuzu, sayfa aralığı seçenekleri ve DPI ayarlarını içerir. Yapılandırılmış veri çıkarma desenleri için, okuma sonuçları kılavuzu, kelime koordinatları ve güven erişimi dahil olmak üzere tam OcrResult hiyerarşisini belgeler. Aranabilir PDF örneği, tamamlanmış bir çalışma uygulaması sunar.
Toplu Belge İşleme
XImage.OCR, thread-safe değildir. Her bir eşzamanlı işçi parçağı, kendi OCRHandler örneğini oluşturmalı ve bellek tüketimini parçağ sayısı ile çarpar. IronOCR, tüm iş parçacıkları arasında paylaşılan tek bir örnek kullanır.
XImage.OCR Yaklaşımı:
// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
documentPath =>
{
// Each thread must create and dispose its own handler
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
try
{
string text = ocrHandler.Process(documentPath);
results[documentPath] = text;
}
finally
{
//Yönergedisposal required — no using statement support shown
ocrHandler.Dispose();
}
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
IronOCR Yaklaşımı:
// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract(); // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths, documentPath =>
{
// OcrInput is created per thread — IronTesseract instance is shared
using var input = new OcrInput();
input.LoadImage(documentPath);
input.Deskew(); // Preprocessing runs per-document, not per-thread engine
input.DeNoise();
var result = ocr.Read(input);
results[documentPath] = result.Text;
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
XImage.OCR'nin iş parçacığı başına işleyici deseni, dört iş parçacıklı bir toplu işi beş dil yüklerken, tek bir belgeyi işlemeden önce yaklaşık 1GB OCR işleyici belleği taşır. IronOCR'nin paylaşılan örneği, paralellikten bağımsız olarak belleği tek bir örneğin ayak izinde sınırlandırır. Çok iş parçacıklı örnek deseni tam olarak gösterir ve hız optimizasyon kılavuzu, throughput odaklı toplu iş yükleri için yapılandırma ayarlamalarını kapsar.
Barkod ve Metin Birleşik Çıkarımı
XImage.OCR'nin barkod okuma yeteneği yoktur. Hem metin hem de barkod içeren belgeler iki ayrı kütüphane ve iki ayrı geçiş gerektirir.IronOCR her ikisini de tek bir okuma işleminde çıkarır.
XImage.OCR Yaklaşımı:
// XImage.OCR: text only — barcodes require a separate library and second pass
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");
// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
//Hayırcombined text + barcode result object exists in XImage.OCR
IronOCR Yaklaşımı:
// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // Enable barcode extraction
using var input = new OcrInput();
input.LoadImage("warehouse-label.png");
var result = ocr.Read(input);
// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");
if (result.Barcodes.Any())
{
Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
foreach (var barcode in result.Barcodes)
Console.WriteLine($" [{barcode.BarcodeType}] {barcode.Value}");
}
ReadBarCodes = true ayarı, ikinci bir kütüphane veya ikinci bir okuma gerektirmeden tanıma geçişine barkod algılaması ekler. Barkod okuma kılavuzu ve barkod OCR örneği, karışık içerikli belgeler için desteklenen barkod formatlarını ve yapılandırma seçeneklerini kapsar.
XImage.OCR API'sinden IronOCR Eşleme Referansı
| XImage.OCR | IronOCR Karşılığı |
|---|---|
new OCRHandler() | new IronTesseract() |
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") | IronOcr.License.LicenseKey = "key" |
ocrHandler.Language = "eng" | ocr.Language = OcrLanguage.English |
ocrHandler.Languages = new[] { "eng", "deu" } | ocr.Language = OcrLanguage.English + OcrLanguage.German |
ocrHandler.Process(imagePath) | ocr.Read(input).Text (sonrasında input.LoadImage(path)) |
ocrHandler.Process(image) (nesneden) | input.LoadImage(bytes) veya input.LoadImage(stream) |
ocrHandler.ProcessRegion(path, rect) | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9") | ocr.Configuration.WhiteListCharacters = "0123456789" |
result (düz yazı) | result.Text |
result.MeanConfidence | result.Confidence |
| Eşdeğeri yok | result.Pages / result.Paragraphs / result.Lines |
| Eşdeğeri yok | result.Words (ile .X, .Y, .Confidence) |
| Eşdeğeri yok | result.SaveAsSearchablePdf("output.pdf") |
| Eşdeğeri yok | input.Deskew() |
| Eşdeğeri yok | input.DeNoise() |
| Eşdeğeri yok | input.Contrast() |
| Eşdeğeri yok | input.Binarize() |
| Eşdeğeri yok | input.Sharpen() |
| Eşdeğeri yok | input.LoadImageFrames("file.tiff") (çok kareli) |
| RasterEdge PDF SDK gerektirir | input.LoadPdf(pdfPath) |
| RasterEdge PDF SDK gerektirir | result.SaveAsSearchablePdf("output.pdf") |
| Mevcut değil | ocr.Configuration.ReadBarCodes = true |
Parçağ başına OCRHandler örnekleri | Tek paylaşılan IronTesseract örneği |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Kısmi Paket Güncellemesinden Sonra Çalışma Zamanı Hataları
XImage.OCR: Bayat bir paket önbelleğiyle dotnet outdated veya dotnet restore çalıştırmak, dil paketlerini önceki sürümde bırakırken RasterEdge.XImage.OCR'ı yeni bir sürüme taşıyabilir. Başarısızlık, versiyon uyumsuzluğunun kök neden olarak açıkça tanımlanmadığı bir hata mesajı ile ilk OCR çağrısı sırasında çalışma zamanında meydana gelir. Tutarsızlığı bulmak, tüm PackageReference girişlerini elle kontrol etmeyi gerektirir.
Çözüm: XImage.OCR paketlerini kaldırdıktan ve IronOCR'yi kurduktan sonra, sürüm eşitlemesi gerekmemektedir. Tek bir IronOcr paket her şeyi taşır. Paketlenmiş varsayılanların ötesinde dil paketlerine ihtiyacınız varsa, IronOcr.Languages.* paketlerini bağımsız olarak yükleyin — bu paketler çekirdek ile sürüm eşleştirmesi gerektirmez:
Sorun 2: Dize Dil Kodları Sessiz OCR Başarısızlıklarına Neden Olur
XImage.OCR: Dil kodları string olarak ifade edilir ("eng", "deu", "fra"). Bir dil kodunda yazım hatası - "engg", "ger" yerine "deu" - ya sessizce varsayılan bir dile düşer ya da XImage.OCR sürümüne bağlı olarak bir çalışma zamanı istisnası verir. Her iki sonuç da derleme zamanında yakalanmaz.
Çözüm: IronOCR, OcrLanguage enum'unu kullanır. Geçersiz değerler derleme hatalarıdır, çalışma zamanı sürprizleri değil. String dizileri enum ifadelerine dönüştürün:
// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };
// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
Karışık dil içeriğine sahip belgelerde birincil ve ikincil dilleri birleştirme kılavuzuna bakın.
Sorun 3: Bayt Dizisinden İşleme Sonrası Diskte Kalan Geçici Dosyalar
XImage.OCR: Bayt dizilerinden görüntüler işlenirken bir geçici dosya yazılması gerekir çünkü OCRHandler.Process() bir dosya yolu kabul eder, bir tampon değil. finally bloğunu atlayan istisna yolları bu geçici dosyaları diskte bırakır. Yüksek işleme oranlı uygulamalarda, bu hızla birikir.
Çözüm: OcrInput.LoadImage() doğrudan byte[] kabul eder. Hiçbir geçici dosya oluşturulmaz:
// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }
// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
Sorun 4: Paralel Yük Altında Bellek Tükenmesi
XImage.OCR: Paralel işlem için her parçağ başına bir OCRHandler gereklidir. Beş dilde belgeleri işleyen sekiz iş parçacığı, her biri beş dil paketinin tamamını taşıyan sekiz ayrı motor örneği yükler. Yaklaşık olarak örnek başına dil başına 50MB, sekiz iş parçacığı, herhangi bir belge verisi resme girmeden önce, yalnızca 2GB OCR motor belleği tüketir.
Çözüm: Tek bir IronTesseract örneği, tüm parçağları yönetir. Her bir belge başına OcrInput oluşturun (atılabilir ve hafif), uygulama süresince IronTesseract'ı yeniden kullanın:
// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
Parallel.ForEach(documentPaths, path =>
{
using var input = new OcrInput(); // Per-document, lightweight
input.LoadImage(path);
var result = ocr.Read(input); // Thread-safe call on shared instance
ProcessResult(result.Text);
});
Sorun 5: Kısmi Geri Yükleme Sonrası CI/CD Pipeline Bozuluyor
XImage.OCR: Isıtılmış bir paket önbelleğine sahip bir CI/CD ajanı, bazen eski bir sürüme sahip bazı XImage.OCR dil paketlerini önbellekte tutar. Proje dosyasında yalnızca çekirdek paket güncellendiğinde, geri yükleme başarılı olur ancak çalıştırma hatalı uyumsuz derlemeleri yükler. Derleme geçer; Dağıtım başarısız olur.
Çözüm: IronOCR'ye geçiş yaptıktan sonra, CI/CD hattı bir paketi geri yükler. Beklenen sürümün mevcut olduğunu doğrulamak için bir doğrulama adımı ekleyin:
# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr
#Hayırversion coordination logic needed — only one package to check
Sorun 6: Aşağı Akış Ayrıştırma için Yapılandırılmış Verilerin Eksikliği
XImage.OCR: Düz bir dize döner. Kelime konumlarına, satır gruplarına veya kelime başına güvene ihtiyaç duyan uygulamalar, dizeleri boşluk karakteri sezgisel bilimi veya özel mantık kullanarak analiz etmelidir. Bu çözümleme, çok sütunlu düzen, tablolar veya döndürülen metin içeren belgelerde bozulur.
Çözüm: IronOCR'un OcrResult doğrudan tam belge hiyerarşisini açığa çıkarır. Hiçbir dize çözümlemesi gerekmez:
var result = ocr.Read(input);
// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
// Line text, bounding box, and per-word data all available
Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");
foreach (var word in line.Words)
Console.WriteLine($" Word '{word.Text}' confidence: {word.Confidence}%");
}
}
Tam yapılandırılmış veri API'si için, okuma sonuçları kılavuzu ve OCR sonuçları özellikleri sayfasına bakın.
XImage.OCR Geçiş Kontrol Listesi
Öncesi-Geçiş
Değişiklik yapmadan önce XImage.OCR dokunma noktalarını bulmak için kod tabanını denetleyin:
# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .
# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .
# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .
# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .
# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
Hangi görüntü kaynak türlerinin kullanıldığını (dosya yolları, bayt dizileri, akışlar, TIFF) not alın ve bayt dizi işleme için geçici dosyaların kullanıldığı yerleri belirleyin. Bunlar yüksek öncelikli temizlik hedefleridir.
Kod Geçişi
- Her bir
.csprojdosyasından tümRasterEdge.XImage.OCRveXImage.OCR.Language.*paket referanslarını kaldırın IronOcrpaket referansını ekleyin (dotnet add package IronOcr)- Tüm dosyalarda
using RasterEdge.XImage.OCR'iusing IronOcrile değiştirin - Uygulama başlangıcında
IronOcr.License.LicenseKey = ...ekleyin (proses başına bir kez) new OCRHandler()'yinew IronTesseract()ile değiştirin- String dil atamalarını (
"eng","deu")OcrLanguageenum değerleri ile değiştirin ocrHandler.Process(path)'yiinput.LoadImage(path)+ocr.Read(input).Textile değiştirin- Bayt dizisi-geçici dosya kalıplarını
input.LoadImage(byte[])ile değiştirin - Çok sayfalı TIFF manuel çerçeve ayırma işlemlerini
input.LoadImageFrames("file.tiff")ile değiştirin Parallel.ForEachdöngülerinden parçağ başınaOCRHandlerörneği oluşturulmasını kaldırın — tek bir paylaşılanIronTesseractörneğini kullanın- Her
LoadImage()sonrası, değişken kalite kaynaklardan gelen belgeler için ön işleme çağrıları (input.Deskew(),input.DeNoise()) ekleyin - Düz yazı sonucu işleme süreçlerini metin için
result.Textveya PDF çıktısı içinresult.SaveAsSearchablePdf()ile değiştirin ocrHandler.SetVariable("tessedit_char_whitelist", ...)'iocr.Configuration.WhiteListCharacters = ...ile değiştirin- CI/CD hattını güncelleyin: çoklu paket geri yükleme adımlarını çıkarın, sürüm senkronizasyonu mantığını kaldırın, tek bir
IronOcrpaket geri yüklemesi doğrulayın
Geçiş Sonrası
- Bilinen iyi bir test görüntüsünden doğru çıktı elde ettiğini doğrulayın
- Çok dilli belgelerin tüm yapılandırılmış diller için metin döndürdüğünü doğrulayın
- Temp dosyalarının disk üzerinde oluşturulmamasıyla bayt dizi girdi yollarının doğru çıktıyı ürettiğini test edin
- Çok sayfalı TIFF belgelerinin
result.Pages'da doğru sayfa sayısını döndürdüğünü doğrulayın - Yük altında paralel toplu işlememi çalıştırın ve bellek zirvesini ölçün — XImage.OCR taban çizgisine göre önemli ölçüde düşük olmalıdır
- Aranabilir PDF çıktısının Adobe Acrobat veya bir PDF görüntüleyiciyle doğru şekilde açıldığını ve metnin seçilebilir olduğunu doğrulayın
- Düşük kaliteli veya uygun olmayan bir taramayı önce işleyin ve çıkarılan metin doğruluğunu XImage.OCR taban çizgisine karşı karşılaştırın
- İlk OCR çağrısı öncesinde lisans anahtarının başladığını ve hata almadığını doğrulayın
- CI/CD geri yüklemesinin önbellekte paket bulunmayan temiz bir ortamda başarılı olduğunu doğrulayın
- Yapılandırılmış veri çıkışını kontrol edin (
result.Words,result.Paragraphs) beklenen belge yerleşimine uyuyor mu
IronOCR'a Geçişin Ana Faydaları
Tek Bir Paket, Tüm Bir Bağımlılık Grafiğinin Yerini Alır. Her bir XImage.OCR.Language.* paketi, çekirdek RasterEdge.XImage.OCR paketi ve arasındaki sürüm senkronizasyonu yükü tek bir dotnet add package IronOcr komutuna çöker. .csproj giriş sayısı on birden bire düşer. CI/CD geri yükleme adımı, on bir bağımsız hata noktası olan çoklu paket işleminden tekli paket geri yüklemeye gider. Bu basitleştirme birleştirilir: güvenlik açıkları için denetlenecek daha az paket, .NET uyumluluk değişikliklerinde güncellenecek daha az giriş ve otomatik güncelleme boru hatlarında sürüm koordinasyonu mantığı yoktur. IronOCR ürün sayfası ve dokümantasyon merkezi tam özellik ve dağıtım referansını sağlar.
Ön İşleme Doğruluk İyileştirmeleri Anindedir. Geçiş bir türdeş-değişim iştir, bu bir doğruluk geliştirmesidir. Eğim, gürültü veya düşük çözünürlük nedeniyle XImage.OCR tarafından zayıf doğrulukla işlenen herhangi bir belge şimdi input.Deskew(), input.DeNoise() ve input.Contrast() aracılığıyla iyileştirme için doğrudan yola sahiptir. Dış bir görüntü işleme kütüphanesi yok, geliştirici ekibinde görüntü işleme uzmanlığı yok, lisanslanması ve bakımı gereken ayrı bir bağımlılık yok. LoadImage() sonrası üç satır eklemek, daha önce "yeterince iyi" kabul edilen taranmış belgelerde doğruluk oranını 20–35 puan geri kazandırır. görüntü kalitesi düzeltme kılavuzu ve ön işleme özellikleri sayfası her bir filtrenin farklı belge kalitesi senaryoları üzerindeki etkisini kapsar.
Aranabilir PDF'ler ve Yapılandırılmış Veriler İkinci-SDK Maliyetlerini Ortadan Kaldırır. XImage.OCR kullanıcılarından en yaygın iki istek — aranabilir PDF çıktısı ve koordinatlarla kelime düzeyinde veri — ayrı ticari lisanslar gerektiren ek RasterEdge ürünleri gerektirir. Geçişten sonra, result.SaveAsSearchablePdf() ek bir paket olmadan arşiv kalitesinde aranabilir belgeler üretir ve result.Words sınır kutuları ve güven puanlarıyla yapılandırılmış veri sağlar. İki lisans gerektiren işlevsellik artık bir taneden gelir. Tam çıktı formatı dokumantasyonu OCR sonuçları özellikleri sayfasında bulunmaktadır.
Paralel İşleme, Bellek Cezası Olmadan Ölçeklenir. XImage.OCR'nin iş parçacığı başına işleyici modeli ölçeklemeyi pahalı hale getirir. İş parçacığı sayısını iki katına çıkarmak, OCR motor örnekleri tarafından tüketilen belleği iki kat artırır. IronOCR'nin paylaşılan-örnek modeli, paralellikten bağımsız olarak belleğin tek bir örnek ayak izinde sınırlandığı anlamına gelir. Bir sunucu, sekiz eşzamanlı iş parçacığında belge partilerini işleme koyarken, bir sunucunun bir defada bir belge işlemesiyle aynı OCR motor belleğini tüketir. Bu, daha düşük barındırma maliyetlerine ve sabit altyapıda daha yüksek iş yükü aşırı kapasitesine doğrudan çevrilir.
Platformlar Arası Dağıtım Kod Değişiklikleri Olmadan Açılır. Aynı IronOcr paketi ve aynı uygulama kodu Windows, Linux, macOS, Docker, Azure App Service ve AWS Lambda üzerinde çalışır. Platforma özgü kod yok, platforma özgü paket varyantları yok, OCR katmanının dağıtımı için ortam başına test yok. İş yüklerini konteynerize eden, macOS geliştirme ortamları çalıştıran veya Linux tabanlı bulut altyapısına dağıtan ekipler, anında uyumluluk kazanır. Docker dağıtım kılavuzu, Azure dağıtım kılavuzu ve Linux dağıtım kılavuzu, her hedef ortam için kurulumu belgelendirir.
125+'ten Fazla Dil, Dil Kapsama Tavanını Ortadan Kaldırır. XImage.OCR yaklaşık on beş dilde ticari paketler olarak en üstte yer alır. Standart tessdata dağıtımları herhangi bir maliyet olmadan 100'ün üzerinde dil içerir. IronOCR, 125'ten fazla dili paketler ve sürüm kilitleme kısıtlaması olmadan temiz bir kurulum desenini takip eden isteğe bağlı IronOcr.Languages.* paketleri aracılığıyla sunar. Çek resmi AB dilleri - 24 resmi dil, tüm büyük CJK dilleri, Arapça, İbranice ve özel yazılar mevcuttur. Diller dizini desteklenen her dili karşılık gelen paket adıyla listeler.

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.