Dynamsoft OCR'dan IronOCR'a Geçiş
Bu kılavuz, Dynamsoft Label Recognizer'dan IronOCR'a geçiş yapan .NET geliştiricileri için tam bir geçiş yolu sağlar. NuGet paket değişimini, ad alanı güncellemelerini, lisans başlangıcını ve genel yetenek kıyaslamalarından ayırt edilen senaryolar için pratik kod göçü örneklerini kapsar — şablon yapılandırma eliminasyonu, çalışma zamanı ayarları JSON'unun kaldırılması, bölge tanımı göçü ve sonuç ayrıştırma basitleştirmesi dahil.
Dynamsoft OCR'den Neden Taşınmalı
Dynamsoft Label Recognizer, amaca yönelik özel bir üründür. Bu hassasiyet, dar dağıtımlar için iyi çalışır ancak uygulama kapsamı orijinal MRZ veya VIN kullanım alanının ötesine geçtiğinde zorluk yaratır.
Çalışma Zamanı Ayarları JSON Bakım Yüzeyidir. Her Dynamsoft tanıma çalışma akışı, parametre dizilerini, karakter modellerini ve bölge referanslarını belirten bir JSON belgesi yükleyerek AppendSettingsFromString ile başlar. Bu JSON şablonları, ikili dosyanıza derlenmemiş, ayrı dağıtım yapıtlarıdır. Sürüm kontrolü, dağıtım hattı yönetimi ve Dynamsoft şablon şemalarını SDK sürümleri arasında değiştirdiğinde manuel güncellemeler gereken konular.IronOCRsıfır yapılandırma dosyası gerektirir: IronTesseract örneğini oluşturun, .Read() çağrısını yapın ve motor uygun ayarları otomatik olarak seçer.
Yıllık Abonelik Ücreti Yığıyor. Dynamsoft Label Recognizer, cihaz başına yıllık 599$+'dan lisanslanır. Süresiz bir seçenek yoktur. Beş cihazlık bir işleme kümesi yılda 2.995$+'ya mal olur — ve bu bütçe sadece MRZ ve yapılandırılmış etiket tanımayı kapsar. Dynamsoft Barcode Reader'ı barkodlar için veya kenar düzeltme için Dynamsoft Document Normalizer'ı ekleyin, ve yıllık fatura ürün sayısına göre artar. IronOCR'un Lite lisansı, genel OCR, yapılandırılmış etiketler, barkodlar, yerel PDF, aranabilir PDF çıktısı ve tek bir paketten 125+ dili kapsayan bir defaya mahsus $999 kullanım sunar.
Bölge Tanımı JSON Şablonları Gerektirir. Dynamsoft'ta tanıma bölgesi tanımlamak, bir ReferenceRegionArray JSON bloğu yazmak, bunu bir LabelRecognizerParameterArray içinde referanslamak ve görüntü işleme başlamadan önce tüm belgeyi yüklemek anlamına gelir. IronOCR, doğrudan OcrInput.LoadImage ile geçirilen tek bir CropRectangle(x, y, width, height) oluşturucusu kullanır. Bir bölgeyi değiştirmek bir numara düzenlemesidir, bir JSON belgesini yeniden analiz etmek değil.
Sonuç Ayrıştırması Tamamen Sizin Sorumluluğunuzdadır. RecognizeFile ve RecognizeByFile, ham metin dizeleri içeren LineResult dizileri döndürür. İhtiyacınız olan her yapı — alan offsetleri, tarih dönüşümleri, kontrol basamağı doğrulaması, ad ayırıcı işleme — bu ham çıktı üzerine kendi özel ayrıştırma kodunuzu gerektirir. IronOCR, sınır kutusu koordinatları, güven puanları ve yazı tipi meta verileri halihazırda doldurulmuş olarak .Pages, .Lines, .Words ve .Characters ile tiplenmiş koleksiyonları içeren bir OcrResult döndürür.
Yerel PDF Desteği Yaratıyor: Gizli Bir Bağımlılık. Dynamsoft Etiket TanıyıcıPDF giriş yeteneğine sahip değildir. İşleme hattınıza ulaşan herhangi bir PDF, her sayfayı bir bit haritasına işlemek için harici bir kütüphane gerektirir, bir sayfa yineleme döngüsü ve ilk Dynamsoft çağrısından önce bir sonuç toplama adımı gerektirir. IronOCR, PDF'leri yerel olarak okur: new IronTesseract().Read("document.pdf") her sayfayı ikincil bir bağımlılık, bir render döngüsü veya geçici bir görüntü klasörü olmadan işler.
Çok Ürünlü Başlatma Blokları Kapsamla Büyür. Yapılandırılmış etiketler, barkodlar ve belge normalizasyonunu ele alan bir Dynamsoft uygulaması, başlangıçta üç statik InitLicense çağrısı, üç elden çıkarma zinciri ve üç bağımsız SDK sürüm bağımlılığı taşır. SDK'yı yükseltmek, tüm ürünler arasında koordinasyon gerektirir. IronOCR, uygulamanın hangi yeteneklerini kullanırsa kullansın bir başlatma satırına ve bir paket sürümüne sahiptir.
Temel Sorun
Dynamsoft, tanıma başlamadan önce çalışma zamanında yüklenen bir JSON yapılandırma dosyası gerektirir:
// Dynamsoft: JSON template required before any image processing
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string settings = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Label"",
""ReferenceRegionNameArray"": [""VinRegion""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VinRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [5, 40],
""SecondPoint"": [95, 40],
""ThirdPoint"": [95, 60],
""FourthPoint"": [5, 60]
}
}]
}";
recognizer.AppendSettingsFromString(settings); // fails silently if JSON is malformed
var results = recognizer.RecognizeFile(imagePath);
// IronOCR: no JSON, no template files — region is a constructor argument
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var region = new CropRectangle(x: 50, y: 400, width: 900, height: 200);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
##IronOCR ve Dynamsoft OCR: Özellik Karşılaştırması
Aşağıdaki tabloda iki kitaplık arasındaki tam yetenek farkı yer almaktadır.
| Özellik | Dynamsoft Etiket Tanıyıcı | IronOCR |
|---|---|---|
| Genel belge OCR | Desteklenmiyor | Tam destek |
| MRZ tanıma | Özel (ham metin çıktısı) | Yerleşik yapılandırılmış alanlarla |
| VIN tanıma | Özel (şablon gerekli) | Standart OCR ile bölge hedefleme |
| Endüstriyel etiket okuma | Özel (şablon gerekli) | Evet, CropRectangle aracılığıyla |
| Çalışma Zamanı Ayarları Yapılandırması | Gerekli (JSON AppendSettingsFromString aracılığıyla) | Gerekli değil |
| Şablon Dağıtım Yapıtları | Gerekli (JSON dosyaları) | None |
| Yerel PDF girişi | Desteklenmiyor | Evet |
| Şifre korumalı PDF | Desteklenmiyor | Evet |
| Çok sayfalı TIFF girişi | Manuel sayfa yinelemesi | Yerel (LoadImageFrames) |
| Aranabilir PDF çıktısı | Desteklenmiyor | Evet (SaveAsSearchablePdf) |
| Barkod okuma | Ayrı ürün (Dynamsoft Barkod Okuyucu) | Yerleşik (ReadBarCodes = true) |
| Otomatik ön işlem | Sınırlı | Evet (Masa Üzeri, Gürültü Giderme, Kontrast, Binarizasyon, Keskinleştirme, Genişletme, Erozyon) |
| Yapılandırılmış çıktı (Kelimeler, Satırlar, Paragraflar) | Ham LineResult metin dizeleri | Koordinatlar ve güven puanı ile tamamen yazılı |
| Dil desteği | Sınırlı (Latin MRZ) | 125+ dil, NuGet paketleri olarak demetlenmiş |
| Çoklu dil aynı anda | Desteklenmiyor | Evet (OcrLanguage.French + OcrLanguage.German) |
| Güven skoru | Sadece satır başına | Kelime başına, satır başına, sayfa başına |
| hOCR içeri aktarma | Desteklenmiyor | Evet |
| Lisanslama modeli | Yıllık abone ($599+/cihaz/yıl) | Süresiz ($999 tek seferlik, Lite katmanı) |
| Birden fazla ürün gerekli | Evet (tam kapsama için 3+) | Hayır (bir paket) |
| .NET Framework desteği | .NET Framework 4.x+ | .NET Framework 4.6.2+, .NET 5/6/7/8/9 |
| Çapraz platform dağıtımı | Evet | Evet (Windows, Linux, macOS, Docker, Azure, AWS) |
| NuGet paketi | Dynamsoft.LabelRecognizer | IronOcr |
Hızlı Başlangıç: Dynamsoft OCR den IronOCR Geçişi
Adım 1: NuGet Paketini Değiştirin
Dynamsoft paketini kaldır:
dotnet remove package Dynamsoft.LabelRecognizer
NuGet galerisi'nden IronOCR'u yükle:
Adım 2: Ad Alanlarını Güncelleyin
// Before (Dynamsoft)
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// After (IronOCR)
using IronOcr;
Adım 3: Lisansa İzin Verin
Her Dynamsoft statik InitLicense çağrısını bir IronOCR lisans ataması ile değiştirin:
// Before (Dynamsoft — one call per product)
LabelRecognizer.InitLicense("DYNAMSOFT-LICENSE-KEY");
// After (IronOCR — one line, all features)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
Kod Göç Örnekleri
Şablon Tabanlı Tanımadan Sıfır Yapılandırmalı Motora Geçiş
Dynamsoft'un JSON şablon sistemi, SDK'ya herhangi bir görüntü işlenmeden önce karakter modelleri, bölge spesifikasyonları ve tanıma parametreleri hakkında ayrıntılı talimatlar verir. Çoğu gerçek dünya OCR iş yükü için, o yapılandırma tanıma faydası olmadan kurulum karmaşıklığı ekler, çünkü temel Tesseract motoru yerleşimi otomatik olarak algılar.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// JSON template required before recognition
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string invoiceTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""Invoice_Header"",
""ReferenceRegionNameArray"": [""HeaderRegion""],
""CharacterModelName"": ""NumberLetter""
}],
""ReferenceRegionArray"": [{
""Name"": ""HeaderRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [0, 0],
""SecondPoint"": [100, 0],
""ThirdPoint"": [100, 20],
""FourthPoint"": [0, 20]
}
}]
}";
recognizer.AppendSettingsFromString(invoiceTemplate);
var results = recognizer.RecognizeFile("invoice.jpg");
var headerText = new StringBuilder();
foreach (var result in results)
foreach (var line in result.LineResults)
headerText.AppendLine(line.Text);
Console.WriteLine(headerText.ToString());
recognizer.Dispose();
IronOCR Yaklaşımı:
using IronOcr;
// No template file — region specified inline, engine auto-configures
var region = new CropRectangle(x: 0, y: 0, width: 1200, height: 200);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
input.Deskew();
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Dynamsoft yaklaşımı, herhangi bir görüntü işlenmeden önce bir JSON şablonu yazmayı, doğrulamayı ve dağıtmayı gerektirir. AppendSettingsFromString içinde bir yazım hatası çalıştırma zamanında boş sonuçlar döndürür — derleme zamanı doğrulaması yoktur. IronOCR'un CropRectangle'i sade bir oluşturucudur: derleme zamanı tür kontrolü, harici dosyalar yok, dağıtım eseri yok. bölge tabanlı OCR kılavuzu tüm hedefleme desenleri için uygundur.
VIN Kod Okuma ile Bölge Göçü
Araç tanım numarası çıkarma, Dynamsoft Label Recognizer'ın uzmanlık alanıdır. VIN şablon modeli, belirli 17 karakterli alfanümerik formatı optimize eder. IronOCR'a geçmek, şablon modelini bir ön işleme hattı ve bölge hedefleme ile değiştirmek anlamına gelir, bu aynı VIN plaka koşullarını karakter modeli yapılandırması gerektirmeden yönetir.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
// VIN requires a specific character model and region configuration
string vinTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Scan"",
""ReferenceRegionNameArray"": [""VIN_Zone""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VIN_Zone"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [10, 35],
""SecondPoint"": [90, 35],
""ThirdPoint"": [90, 65],
""FourthPoint"": [10, 65]
}
}]
}";
recognizer.AppendSettingsFromString(vinTemplate);
var results = recognizer.RecognizeFile("vehicle-vin.jpg");
string rawVin = results
.SelectMany(r => r.LineResults)
.Select(l => l.Text)
.FirstOrDefault() ?? string.Empty;
Console.WriteLine($"Raw VIN text: {rawVin}"); // still requires validation
recognizer.Dispose();
IronOCR Yaklaşımı:
using IronOcr;
using System.Text.RegularExpressions;
// Target the VIN plate region directly — no template file
var vinRegion = new CropRectangle(x: 100, y: 350, width: 800, height: 300);
using var input = new OcrInput();
input.LoadImage("vehicle-vin.jpg", vinRegion);
input.Contrast(); // recover faded stamped digits
input.Sharpen(); // clarify character boundaries on embossed plates
var result = new IronTesseract().Read(input);
// VIN: 17 chars, no I/O/Q
var vinMatch = Regex.Match(result.Text, @"\b[A-HJ-NPR-Z0-9]{17}\b");
string vin = vinMatch.Success ? vinMatch.Value : result.Text.Trim();
Console.WriteLine($"VIN: {vin}");
Console.WriteLine($"Confidence: {result.Confidence}%");
CropRectangle koordinatları, Dynamsoft'un yüzde tabanlı SecondPoint özelliği ile aynı piksel referans çerçevesini kullanır — Dynamsoft'un yüzde değerlerini görüntü boyutlarınızla çarparak dönüştürün. Önişleme hattı (Contrast, Sharpen) Dynamsoft'un VIN şablonuna gömülü karakter modeli optimizasyonunu değiştirir. görüntü kalitesi düzeltme kılavuzu, kabartmalı ve düşük kontrastlı yüzeyler için filtre seçimini kapsar.
Çok Sayfalı TIFF Toplu İşleme
Dynamsoft Label Recognizer tek görüntüler işler. Belge yönetim sistemlerinde, tıbbi görüntüleme arşivlerinde ve faks boru hatlarında yaygın olan çok sayfalı TIFF belgeleri, harici yineleme gerektirir: her kareyi yükleyin, onu tek tek tanıyıcıdan geçirin ve sonuçları toplayın. IronOCR, çok çerçeveli TIFF'i LoadImageFrames aracılığıyla doğal bir şekilde yönetir.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
// Requires an external TIFF library to extract frames
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(genericTemplate);
// External library needed to iterate TIFF frames
var tiffImage = System.Drawing.Image.FromFile("scanned-batch.tiff");
int frameCount = tiffImage.GetFrameCount(
System.Drawing.Imaging.FrameDimension.Page);
var allText = new StringBuilder();
for (int i = 0; i < frameCount; i++)
{
tiffImage.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
string tempPath = $"frame_{i}.jpg";
tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Jpeg);
var results = recognizer.RecognizeFile(tempPath);
foreach (var r in results)
foreach (var line in r.LineResults)
allText.AppendLine(line.Text);
System.IO.File.Delete(tempPath); // clean up temp files
}
Console.WriteLine(allText.ToString());
recognizer.Dispose();
IronOCR Yaklaşımı:
using IronOcr;
// No frame iteration, no temp files, no external TIFF library
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff"); // loads all frames natively
input.Deskew();
input.DeNoise();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Results organized per page
foreach (var page in result.Pages)
{
Console.WriteLine($"Frame {page.PageNumber}: {page.Lines.Count} lines");
Console.WriteLine(page.Text);
}
// Save entire batch as a single searchable PDF
result.SaveAsSearchablePdf("batch-searchable.pdf");
Dynamsoft yaklaşımı, çerçeve çıkarma için System.Drawing, her çerçeve için diskte geçici dosya ve her geçişten sonra manuel temizlik gerektirir. IronOCR'un LoadImageFrames'i tüm kareleri tek bir çağrıda okur — geçici dosya yok, çerçeve dizini takip etme yok. OCR'den sonra, SaveAsSearchablePdf tüm partiyi bir yöntemde aranabilir bir belge olarak arşivler. çok çerçeveli TIFF kılavuzu ve aranabilir PDF çıktısı kılavuzu her iki yeteneği de detaylı şekilde kapsar.
Yapılandırılmış Kelime Düzeyinde Sonuç Ayrıştırması
Dynamsoft RecognizeFile bir DLRResult dizisi döndürür. Her DLRResult, bir Text özelliği ve sınırlayıcı dörtgeni tutan bir Location özelliği olan DLRLineResult nesnelerinin bir LineResults koleksiyonunu içerir. Kelime düzeyinde konumları çıkartmak, satır metnini beyaz boşlukta bölmeyi ve satır sınırlayıcı kutusunu orantılı olarak bölmeyi gerektirir — orantılı yazı tiplerinde bozulabilen bir yaklaşım. IronOCR, kelime seviyesindeki sınır kutularını her OcrResult.Word nesnesinde tipli özellikler olarak kullanıma sunar.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(settingsJson);
var results = recognizer.RecognizeFile("form-scan.jpg");
foreach (var dlrResult in results)
{
foreach (var lineResult in dlrResult.LineResults)
{
// Line-level data only — word boundaries are not provided
Console.WriteLine($"Text: {lineResult.Text}");
Console.WriteLine($"Confidence: {lineResult.Confidence}");
// Location is a quadrilateral — four corner points
var loc = lineResult.Location;
Console.WriteLine($"Top-left: ({loc.Points[0].X}, {loc.Points[0].Y})");
// To get word positions: split text and divide bounding box manually
var words = lineResult.Text.Split(' ');
int approxWidth = (loc.Points[1].X - loc.Points[0].X) / words.Length;
for (int i = 0; i < words.Length; i++)
{
int wordX = loc.Points[0].X + (i * approxWidth);
Console.WriteLine($" Word '{words[i]}' approx at x={wordX}");
}
}
}
recognizer.Dispose();
IronOCR Yaklaşımı:
using IronOcr;
var result = new IronTesseract().Read("form-scan.jpg");
// Word-level positions are first-class properties — no manual division
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
foreach (var line in paragraph.Lines)
{
foreach (var word in line.Words)
{
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence}%");
}
}
}
}
IronOCR, gerçek bir hiyerarşi sağlar: sayfalar paragraflar içerir, paragraflar satırlar içerir, satırlar kelimeler içerir, kelimler karakterler içerir. Her seviye, .X, .Y, .Width, .Height ve .Confidence'u tipli tam sayı ve çift özellikler olarak açığa çıkarır — dörtgen koordinat aritmetiği gerekmez. yapılandırılmış sonuçlar kılavuzu, her erişilebilir özelliği belgeler ve güven ölçüsünü açıklama kılavuzu, otomatik belge inceleme boru hatları için güven eşik belirlemesi açıklar.
Yüksek Hacimli Etiket Tarama İçin Asenkron Paralel İşleme
Dynamsoft Etiket Tanıyıcı iş parçacığı güvenlidir, ancak RecognizeFile çağrısı eş zamanlıdır. Bunu Task.Run içinde sarmak paralel işlem üretir, ancak her çağrı, AppendSettingsFromString üzerinden yapılandırma durumu paylaşır — birden fazla iş parçacığında şablonları yüklemek dikkatli bir başlangıç sıralamayı gerektirir. IronOCR'un IronTesseract örnekleri bağımsızdır: her görev için bir tane oluşturun, Read çağrısını yapın ve iş parçacığı modeli basittir.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
using System.Threading.Tasks;
// InitLicense must be called once before parallel work begins
LabelRecognizer.InitLicense(licenseKey);
// Each thread needs its own recognizer instance with its own template load
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
await Task.WhenAll(imagePaths.Select(async path =>
{
// Cannot share recognizer instances safely across tasks
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(templateJson); // reload JSON per instance
await Task.Run(() =>
{
var dlrResults = recognizer.RecognizeFile(path);
var text = string.Join("\n",
dlrResults.SelectMany(r => r.LineResults).Select(l => l.Text));
results.Add(text);
});
recognizer.Dispose();
}));
Console.WriteLine($"Processed {results.Count} images");
IronOCR Yaklaşımı:
using IronOcr;
using System.Collections.Concurrent;
using System.Threading.Tasks;
var extractedTexts = new ConcurrentDictionary<string, string>();
// Each IronTesseract instance is independent — no shared state
Parallel.ForEach(imagePaths, imagePath =>
{
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
extractedTexts[imagePath] = result.Text;
});
foreach (var (path, text) in extractedTexts)
Console.WriteLine($"{System.IO.Path.GetFileName(path)}: {text.Length} characters");
IronOCR, paralel iş başlamadan önce başlatma sıralaması gerektirmez. Uygulama başlangıcında bir IronOcr.License.LicenseKey ataması tüm örnekleri etkinleştirir. Thread başına şablon yenileyicisi yok, her örnek başına JSON doğrulaması yok. Engellenmeyen sunucu tarafı senaryoları için, asenkron OCR rehberi, ASP.NET Core ve Azure İşlevleri için await tabanlı şablonları ele alır.
Taralı Etiket Arşivlerinden Aranabilir PDF Çıktısı
Dynamsoft herhangi bir türde PDF çıkış yeteneğine sahip değildir. Dynamsoft aracılığıyla işlenmiş taralı etiket arşivleri, yalnızca görüntü dosyaları olarak kalır — aranamaz, dokuman yönetim sistemleri tarafından indekslenemez ve PDF/A arşivleme standartlarına uygun değildir. IronOCR, aranabilir PDF çıktısını OcrResult nesnesinde tek bir yöntem çağrısı olarak ekler.
Dynamsoft Yaklaşımı:
using Dynamsoft.LabelRecognizer;
// Process scanned label — extract text into a string
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(labelTemplate);
var results = recognizer.RecognizeFile("scanned-labels.jpg");
var extractedText = new StringBuilder();
foreach (var r in results)
foreach (var line in r.LineResults)
extractedText.AppendLine(line.Text);
// Cannot create a searchable PDF — save text to a sidecar .txt file instead
System.IO.File.WriteAllText("scanned-labels.txt", extractedText.ToString());
// The original image remains unsearchable
Console.WriteLine("No PDF output available in Dynamsoft Label Recognizer.");
recognizer.Dispose();
IronOCR Yaklaşımı:
using IronOcr;
// Read, preprocess, and produce a searchable PDF archive in one pipeline
using var input = new OcrInput();
input.LoadImage("scanned-labels.jpg");
input.Deskew();
input.Contrast();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Searchable PDF: original image layer preserved, invisible text layer added
result.SaveAsSearchablePdf("scanned-labels-searchable.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Console.WriteLine($"Extracted text preview: {result.Text.Substring(0, 100)}");
Aranabilir PDF çıktısı, orijinal taranmış görüntüyü tam çözünürlükte korur ve üstüne görünmez bir OCR metin katmanı ekler. Belge yönetim sistemleri, arama dizinleri ve PDF görüntüleyiciler, şimdi etiket içeriğini arayabilir. aranabilir PDF nasıl yapılır ve taralı belge işleme kılavuzu, çok sayfalı arşivler ve toplu dönüşüm iş akışlarını kapsar.
Dynamsoft OCR API'den IronOCR Haritalama Referansı
| Dynamsoft Etiket Tanıyıcı | IronOCR Karşılığı |
|---|---|
LabelRecognizer.InitLicense(key) | IronOcr.License.LicenseKey = key |
new LabelRecognizer() | new IronTesseract() |
recognizer.AppendSettingsFromString(json) | Gerekli değil — otomatik yapılandırılmış |
recognizer.RecognizeFile(path) | ocr.Read(path) |
recognizer.RecognizeByFile(path, templateName) | ocr.Read(path) |
recognizer.RecognizeBuffer(buffer, width, height, ...) | input.LoadImage(imageBytes) sonra ocr.Read(input) |
DLRResult[] (sonuçlar dizisi) | OcrResult'i (tek bir sonuç nesnesi) |
DLRResult.LineResults | OcrResult.Lines |
DLRLineResult.Text | OcrResult.Line.Text |
DLRLineResult.Confidence | OcrResult.Line.Words[i].Confidence |
DLRLineResult.Location.Points[i] | OcrResult.Line.X, .Y, .Width, .Height |
ReferenceRegionArray'i (JSON) | new CropRectangle(x, y, w, h) |
LabelRecognizerParameterArray'i (JSON) | Gerekli değil |
Şablondaki CharacterModelName | Gerekli değil |
recognizer.Dispose() | using var ocr = new IronTesseract() |
| PDF girişi desteği yok | input.LoadPdf(path) |
| Aranabilir PDF çıktısı yok | result.SaveAsSearchablePdf(path) |
| Çok sayfalı TIFF girişi yok | input.LoadImageFrames(path) |
| Barkod okuma (ayrı ürün) | ocr.Configuration.ReadBarCodes = true |
Birden fazla InitLicense çağrısı (ürün başına) | Tek IronOcr.License.LicenseKey ataması |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: AppendSettingsFromString Geçiş Sonrası Boş Sonuçlar Döndürüyor
Dynamsoft: Tanım, AppendSettingsFromString hatalı biçimlendirilmiş bir JSON dizesi aldığında sessizce boş DLRResult dizileri döndürür. Hiçbir istisna atılmaz. Dynamsoft'tan geçiş yapan ekipler, bu sessiz başarısızlığa karşı hem koruma sağlamak için sonuç ayrıştırma kodunun tamamında savunma amaçlı null kontrolleri ekler.
Çözüm: AppendSettingsFromString'i tamamen kaldırın. IronOCR, şablon yapılandırması gerektirmez. Belirli bölge hedefleme gerekiyorsa, ReferenceRegionArray JSON yerine CropRectangle ile değiştirin:
// Remove all AppendSettingsFromString calls
// Replace region JSON with a CropRectangle constructor
var region = new CropRectangle(x: 0, y: 400, width: 1200, height: 300);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
IronTesseract kurulum kılavuzu, JSON dizeleri yerine özellik olarak ayarlanabilen tüm motor yapılandırma seçeneklerini belgeler.
Sorun 2: Uygulama Başlangıcında Çoklu InitLicense Çağrıları
Dynamsoft: Etiket Tanıyıcı, Barkod Okuyucu ve Belge Normalleştiriciyi kullanan bir uygulama, başlangıçta kendine ait lisans anahtarını gerektiren üç ayrı InitLicense yöntemini çağırır. Ekipler üç ortam değişkeni saklar, üç anahtarı bağımsız olarak döndürür ve üç ayrı başlatma hatasını ayıklar.
Çözüm: Tüm Dynamsoft InitLicense çağrılarını kaldırın. Bunu bir IronOCR satırıyla değiştirin:
// Remove:
// LabelRecognizer.InitLicense(mrzKey);
// BarcodeReader.InitLicense(barcodeKey);
// DocumentNormalizer.InitLicense(docKey);
// Add once, at application startup:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
Tek bir ortam değişkeni, OCR, barkodlar, PDF işleme ve 125'ten fazla dili — özellik bazında başlatma gerektirmeksizin — etkinleştirir.
Sorun 3: LineResult Metin Toplama Bozuk Çıktılar Üretiyor
Dynamsoft: RecognizeFile, algılanan her etiket bölgesi için bir DLRResult döndürür. lineResult.Text sonuçlarının tümü \n ayırıcıları ile birleştirilen uygulamalar, sayfa üzerindeki farklı etiket bölgelerinden satırların karıştığı bir çıkış üretir — çünkü DLRResult nesneleri sıralama, bölge-tanıma sırası, okuma sırası değildir.
Çözüm: IronOCR'un sonuç hiyerarşisi, çıktıları okuma düzeninde organize eder. Metni doğal belge sırası ile erişmek için Pages → Paragraphs → Lines yapısını kullanın:
var result = new IronTesseract().Read(imagePath);
// Reading-order text — no manual aggregation
Console.WriteLine(result.Text);
// Or access paragraph-level groupings
foreach (var paragraph in result.Pages[0].Paragraphs)
Console.WriteLine(paragraph.Text);
Sorun 4: Dağıtım Sunucusunda Eksik Şablon JSON Dosyaları
Dynamsoft: Şablon JSON dosyaları ayrı dağıtım nesneleridir. Yeni bir sunucuda bir şablon dosyası eksik olduğunda veya yanlış bir yol içindeyken, AppendSettingsFromString başarısız olur — bazen sessizce, bazen çalışma zamanı istisnası ile — ve dağıtım, uygulama koduna dokunmadan tanımayı bozar.
**Çözüm:**IronOCRşablon dosyalarına sahip değildir. NuGet paketini değiştirdikten ve ad alanlarını güncelledikten sonra, dağıtım nesne listesi, uygulama ikilileri ve bir ortam değişkenine küçülür. Gerekirse bir başlangıç doğrulama kontrolü ekleyin:
// Validate license at startup — no template files to check
if (!IronOcr.License.IsValidLicense)
throw new InvalidOperationException("IronOCR license key is invalid or missing.");
var ocr = new IronTesseract();
// Ready to process — no file dependencies
Sorun 5: Birden Çok Ürün Arasında İmha Zinciri Yönetimi
Dynamsoft: Her Dynamsoft ürün örneği (LabelRecognizer, BarcodeReader, DocumentNormalizer) IDisposable uygular. Birden fazla ürünü toplayan hizmet sınıfları, çok seviyeli Dispose uygulamalarına sahiptir ve herhangi bir ürün örneğinde bir Dispose çağrısının eksik olması, yük altında hafıza artışı olarak kendini gösteren doğal kaynak sızıntılarına neden olur.
Çözüm: IronOCR'un IronTesseract ve OcrInput her ikisi de IDisposable uygular, ancak elden çıkarma modeli daha basittir — bir sınıf, bir desen. DI konteynerine bir tekil IronTesseract örneği kaydedin veya geçici ömürlü örnekler için using bloklarını kullanın:
// Short-lived pattern
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = new IronTesseract().Read(input);
// Long-lived singleton (register in Program.cs)
builder.Services.AddSingleton<IronTesseract>();
ilerleme izleme kılavuzu, uzun süre çalışan yığın işleri için yaşam süresi yönetimini ve async OCR kılavuzu, ASP.NET Core'daki singleton desenlerini gösterir.
Sorun 6: Özel Etiket Formatı İçin Karakter Modeli Mevcut Değil
Dynamsoft: Bir şablondaki CharacterModelName alanı, Dynamsoft SDK kurulum dizininde bulunması gereken bir model dosyasına referans verir. Özel karakter modelleri, Dynamsoft'un portalından ek model dosyalarını indirip doğru SDK dizinine yerleştirmeyi gerektirir. Eksik bir model, gizemli bir çalışma zamanı hatasıyla tanımayı başarısız kılar.
Çözüm: IronOCR, karakter model dosyaları kullanmaz. Özel veya uzmanlaşmış yazı tipleri için, özel dil eğitimi kullanın:
// No character model files needed
// For specialized fonts, use a custom language pack
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English; // or load a custom trained pack
using var input = new OcrInput();
input.LoadImage(specializedFontImage);
input.Binarize(); // helps with specialized font clarity
var result = ocr.Read(input);
özel yazı tipi eğitimi kılavuzu, herhangi bir dosya yolu yapılandırması olmadan tescilli etiket yazı tipleri için özel bir dil paketi eğitmeyi kapsar.
Dynamsoft OCR Geçiş Kontrol Listesi
Öncesi-Geçiş
Kod tabanını tüm Dynamsoft referansları için denetleyin:
# Find all Dynamsoft using statements
grep -r "using Dynamsoft" --include="*.cs" .
# Find InitLicense calls (one per product)
grep -r "InitLicense" --include="*.cs" .
# Find AppendSettingsFromString calls (template loads)
grep -r "AppendSettingsFromString" --include="*.cs" .
# Find template JSON strings (inline or file references)
grep -r "LabelRecognizerParameterArray\|ReferenceRegionArray\|CharacterModelName" --include="*.cs" .
# Find RecognizeFile and RecognizeByFile calls
grep -r "RecognizeFile\|RecognizeByFile\|RecognizeBuffer" --include="*.cs" .
# Find LineResult result parsing patterns
grep -r "LineResults\|DLRResult\|DLRLineResult" --include="*.cs" .
# Identify any JSON template files in the project
find . -name "*.json" | xargs grep -l "LabelRecognizerParameterArray" 2>/dev/null
Keşif bulguları:
InitLicenseçağrı yerlerini sayın (kullanılan Dynamsoft ürünü başına bir tane)AppendSettingsFromStringçağrı yerlerini sayın (tanıma şablonu başına bir tane)- Geçiş sonrası silinecek tüm JSON şablon dosyalarını listeleyin
ReferenceRegionArraytanımlarını belirleyin (CropRectangle'ye dönüştürün)- Ayrı ürünler tarafından kapsanan özellikleri not edin (barkodlar, belge normalleştirme)
Kod Geçişi
Dynamsoft.LabelRecognizerNuGet paketini kaldırın (ve diğer Dynamsoft paketlerini)IronOcrNuGet paketini kurun (dotnet add package IronOcr)- Tüm
using Dynamsoft.LabelRecognizer;veusing Dynamsoft.Core;ileusing IronOcr;değiştirin - Tüm
LabelRecognizer.InitLicense(key)çağrılarını tek birIronOcr.License.LicenseKey = keyile uygulama başlangıcında değiştirin - Tüm
AppendSettingsFromString(json)çağrılarını kaldırın — eşdeğeri gerekmez ReferenceRegionArrayJSON koordinatlarınınew CropRectangle(x, y, width, height)oluşturucularıyla değiştirinnew LabelRecognizer()oluşturmayınew IronTesseract()ile değiştirinrecognizer.RecognizeFile(path)ileocr.Read(path)değiştirinDLRLineResultsonuç yinelemesini.Wordshiyerarşisi ile değiştirin- Manuel
lineResult.Textdizi birleştirmesiniresult.Textveya yapılandırılmış sayfa numaralandırmasıyla değiştirin BarcodeReader.InitLicense+BarcodeReader.DecodeFileileocr.Configuration.ReadBarCodes = truedeğiştirin- Çok ürünlü
Disposezincirlerini kaldırın veusing var ocr = new IronTesseract()ile değiştirin - Projeden ve dağıtım nesne listesinden JSON şablon dosyalarını silin
- TIFF dosyalarındaki çerçeve yineleme döngülerini
input.LoadImageFrames(path)ile değiştirin - Taranan çıktılar arşivlenmek zorunda kaldığında
result.SaveAsSearchablePdf(outputPath)ekleyin
Geçiş Sonrası
- Uygulamanın başlangıcında
IronOcr.License.IsValidLicensedöndürdüğünü doğrulayın - Tüm tanıma sonuçlarının önceki çalışan girdiler için boş olmayan
result.Textdöndürdüğünü onaylayın - Temsilci örneklerde
result.Confidencekontrol edin — %80'in üzerindeki değerler iyi tanıma kalitesini gösterir - Bölge hedefleme doğruluğunu
CropRectangleçıktıları ile önceki Dynamsoft bölge sonuçlarını karşılaştırarak test edin ocr.Configuration.ReadBarCodes = trueçalıştırarak görüşme kodu okumanın doğruluğunu doğrulayın Bias'dan önce Dynamsoft Barkod Okuyucu gerektiren girdiler üzerinde- Çok sayfalı TIFF işlemeinin her çerçeve için bir
OcrResult.Pageürettiğini doğrulayın - Aranabilir PDF çıktısının bir PDF görüntüleyicisinde metin aranabilir olduğunu doğrulayın
Parallel.ForEachile paralel işleme testlerini çalıştırın ve iş parçacığı çakışması olmadığını doğrulayın- Linux, Docker, Azure gibi tüm dağıtım hedeflerini test edin ve JSON şablon dosyalarının olmadan tek paket dağıtımının çalıştığını doğrulayın
- Dağıtım konfigürasyonunda hiç bir Dynamsoft lisans anahtar ortam değişkeninin kalmadığını doğrulayın
IronOCR'a Geçişin Ana Faydaları
Tek Bir Paket, Çok Ürünlü Koordinasyon Vergisini Ortadan Kaldırır. Tüm yetenekler — genel OCR, MRZ çıkarma, barkod okuma, yerel PDF girişi, aranabilir PDF çıkışı, önişleme ve 125+ dil — tek bir IronOcr NuGet paketi olarak gelir. Versiyon yükseltmeleri bir .csproj dosyasında bir paket girişini etkiler. Lisans anahtarı rotasyonu bir ortam değişkenidir. Dağıtım nesne envanteri uygulama ikililerine küçülür, JSON şablon dosyaları yok, karakter model dizinleri yok.
Sıfır Yapılandırma Dosyası Bağımlılıkları. Dynamsoft şablon sistemi, JSON dosyalarının çalışma zamanında mevcut olmasını ve doğru bir şekilde yol almasını gerektirir. IronOCR, NuGet paketi dışında çalışma zamanı dosyası bağımlılıklarına sahip değildir. Docker görüntüleri belirleyici hale gelir: CI'yi geçen şey, üretimde tam olarak çalışan şeydir. Docker dağıtım rehberi, Linux için sadece bir apt-get install satırı gerektiren tam bir Dockerfile gösterir.
Yapılandırılmış Çıktı Entegrasyon Kodunu Azaltır. Dynamsoft ham LineResult metin dizelerini döndürür. Yapısal veri çıkarımı — alan pozisyonları, kelime sınırları, token başına güven — kodda post işlemi ve testler gerektirir. IronOCR'nin sonuç hiyerarşisi, sayfalar, paragraflar, satırlar, kelimeler ve karakterler ile koordinatlar ve her seviyede güven puanları olan türlenmiş koleksiyonları gösterir. Dynamsoft'tan geçiş yapan ekipler, sonuç işleme kodlarının %30-50 sini kaldırma eğilimindedir, çünkü IronOCR, el ile inşa ettikleri yapıyı sunar. OCR sonuç özelliği sayfası, tam çıktı modelini belgeler.
Süresiz Lisanslama, Yıllık Bütçe Belirsizliklerini Ortadan Kaldırır. Dynamsoft Etiket Tanıyıcı, süresiz seçenek sunmaz. Sadece etiket tanıma için beş yıllık çalışan bir işleme kümesi, her yıl $2,995+ maliyete neden olur ve barkod ya da belge normalleştirme ürünleri eklenmeden önce bu maliyete katlanılır. IronOCR'un $999 Lite lisansı, tüm özellikleri sınırsız olarak kapsayan tek seferlik bir satın almadır. Devlet, işletme ve uzun süreli üretim dağıtımları için, yıllık yenileme bağımlılıklarını temel bir belge işleme bileşeninden çıkarmak, tedarik karmaşıklığını azaltır ve bir projenin ortasında abonelik sona erme riskini ortadan kaldırır. IronOCR lisanslama sayfası tüm seviyeleri ve her birinin neyi kapsadığı listesini sağlar.
Platforma Özel Yapılandırma Olmadan Platformlar Arası. IronOCR, Windows x64, Linux x64, macOS x64 ve macOS ARM için doğru çalışma zamanı ikilisini, NuGet'in çalışma zamanı tanımlayıcı grafiğiyle çözer. Koşullu <PackageReference> blokları, platform algılama kodu, yerel ikili dosya yolu ayarlaması yok. Aynı using IronOcr; kodu Windows, Linux, AWS Lambda ve Azure App Service üzerinde derlenip çalıştırılır ve değiştirme gerektirmez.
Dil Kapsamı, Uygulama İhtiyaçlarıyla Ölçeklenir. Dynamsoft Etiket Tanıyıcı, Latin karakterli MRZ formatları için tasarlanmıştır. Latin dışı yazılar — Arapça, Çince, Japonca, Korece, İbranice — tasarım kapsamının dışında kalır. IronOCR, algılama hattında kod değişikliği olmadan Arapça desteği ekleyen dotnet add package IronOcr.Languages.Arabic ile bireysel NuGet paketleri olarak yüklü 125+ dili destekler. diller dizini mevcut her dil paketini listeler. Uluslararası kimlik belgeleri, çok dilli gönderi etiketleri veya sınır ötesi faturaları işleyen uygulamalar için bu genişlik, büyüyen bir uygulamanın karşılaştığı her belge türünü kapsadığı anlamına gelir.

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.