Fatura OCR Açık Kaynak Karşılaştırması: En İyi Aracı Bulun
LEADTOOLS, 1990'dan beri SDK yazılımı sevkiyatı yapmaktadır ve OCR entegrasyonu bu mirası tam anlamıyla taşır: Tek bir karakter tanınmadan önce, uygulamanızın disk üzerindeki iki ikili dosyayı bulması, LEADTOOLS.LIC ve LEADTOOLS.LIC.KEY arasında bir eşleşmeyi doğrulaması, bir RasterCodecs örneğini başlatması, üç farklı seçenekten bir motor türü seçmesi, bir çalışma zamanı dizin yolu ile engine.Startup() çağrısı yapması ve sonra — ve ancak o zaman — gerçek tanıma işine başlaması gerekir. Her üretim makinesi, lisans dosyalarının belirli bir yola dağıtılmasını gerektirir.Dockerkonteynerleri, bu dosyaların monte edilmesini veya pişirilmesini gerektirir. CI/CD hatları, dosyaların doğru yerde olmasını veya uygulamanın başlangıçta çökmesini gerektirir. Ve geliştirme kitlerini satın alan geliştirici yanlış paketi satın almışsa, OCR modülü hiç dahil olmayabilir, çünkü LEADTOOLS, görüntüleme kodeklerinden ayrı bir modül olarak OCR yeteneklerini satar.
LEADTOOLS OCR'ı Anlamak
LEADTOOLS, LEAD Technologies'ten bir belge görüntüleme platformudur, bu şirket 1990'dan beri ticari SDK yazılımı göndermektedir. OCR yeteneği, aynı zamanda belge görüntüleyicileri, tıbbi görüntüleme (DICOM/PACS), barkod okuma, form tanıma, anotasyonlar ve PDF manipülasyonunu kapsayan bir araç kitindeki birçok modülden biridir. Bu mimari, LEADTOOLS'un bir OCR kütüphanesi olmadığı — OCR'nin modüllerinden biri olduğu bir görüntüleme platformu olduğu anlamına gelir.
LEADTOOLS OCR'nin temel mimari özellikleri:
- Üç ayrı OCR motoru: Temel lisansa dahil olan LEAD özel motoru, tessdata dosyaları gerektiren bir Tesseract sarmalayıcı ve ayrı bir Kofax lisans anlaşması ve ikinci bir satıcı ilişkisi gerektiren bir OmniPage motoru. Motor seçimi, hem kodu hem de maliyeti etkiler.
- Dosya tabanlı lisans dağıtımı:
LEADTOOLS.LICveLEADTOOLS.LIC.KEYolmak üzere iki dosya çalışma zamanında okunabilir olmalıdır. Yol başlangıçta sabit kodlanmış veya çözülmüş olabilir. Yol çözümlemesi IIS ile konsol ana bilgisayarı arasında,Dockerile çıplak metal arasında, sürüm yapıları ile hata ayıklama arasında farklı davranır. - Gerekli bir ara adım olarak
RasterCodecs: Görüntü yükleme doğrudan OCR motoruna gitmez. PDF sayfaları dahil olmak üzere her görüntü ilk önceRasterCodecsörneği aracılığıyla yüklenir ve bu motor başlamadan önce başlatılmalıdır. - Açık motor yaşam döngüsü:
OcrEngineManager.CreateEngine()motoru oluşturur,engine.Startup()bunu belleğe yükler (500–2000 ms) veengine.Shutdown(),Dispose()çağrılmadan önce çağrılmalıdır. Yanlış sırayla kapatma çağrısını atlamak, hatalar üretir. - Paket fiyatlandırma karmaşıklığı: LEADTOOLS fiyatı kamuya açıklamaz. Özel gereksinimlerinize dayalı teklif almak için LEADTOOLS satış ekibi ile iletişime geçin. Güncellemeleri almak için yıllık bakım ücretleri gereklidir.
- Büyük dağıtım ayak izi: Üretim dağıtımları çoklu LEADTOOLS DLL'leri, bir
OcrRuntime/dizini, lisans dosyaları ve isteğe bağlı olarak Tesseract motorunu kullanıyorsanız birtessdata/klasörü içerir.
Başlangıç Sırası
LEADTOOLS, herhangi bir tanıma başlamadan önce belirli bir çok adımlı kurulum gerektirir. Sıra isteğe bağlı değildir — SetLicense() veya RasterCodecs başlatılmadan önce Startup() çağrılması çalışma zamanı hatalarına neden olur:
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;
public class LeadtoolsOcrService : IDisposable
{
private IOcrEngine _ocrEngine;
private RasterCodecs _codecs;
public LeadtoolsOcrService()
{
// Step 1: Locate and validate both license files
RasterSupport.SetLicense(
@"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));
// Step 2: Initialize image codec layer
_codecs = new RasterCodecs();
// Step 3: Select engine type — wrong choice means different behavior
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
// Step 4: Load runtime into memory (500–2000ms)
_ocrEngine.Startup(_codecs, null, null,
@"C:\LEADTOOLS\OCR\OcrRuntime");
}
public string ExtractText(string imagePath)
{
using var image = _codecs.Load(imagePath);
using var document = _ocrEngine.DocumentManager.CreateDocument();
var page = document.Pages.AddPage(image, null);
page.Recognize(null); // Recognition is not automatic
return page.GetText(-1);
}
public void Dispose()
{
_ocrEngine?.Shutdown(); // Must call before Dispose
_ocrEngine?.Dispose();
_codecs?.Dispose();
}
}
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;
public class LeadtoolsOcrService : IDisposable
{
private IOcrEngine _ocrEngine;
private RasterCodecs _codecs;
public LeadtoolsOcrService()
{
// Step 1: Locate and validate both license files
RasterSupport.SetLicense(
@"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));
// Step 2: Initialize image codec layer
_codecs = new RasterCodecs();
// Step 3: Select engine type — wrong choice means different behavior
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
// Step 4: Load runtime into memory (500–2000ms)
_ocrEngine.Startup(_codecs, null, null,
@"C:\LEADTOOLS\OCR\OcrRuntime");
}
public string ExtractText(string imagePath)
{
using var image = _codecs.Load(imagePath);
using var document = _ocrEngine.DocumentManager.CreateDocument();
var page = document.Pages.AddPage(image, null);
page.Recognize(null); // Recognition is not automatic
return page.GetText(-1);
}
public void Dispose()
{
_ocrEngine?.Shutdown(); // Must call before Dispose
_ocrEngine?.Dispose();
_codecs?.Dispose();
}
}
Imports Leadtools
Imports Leadtools.Ocr
Imports Leadtools.Codecs
Imports System.IO
Public Class LeadtoolsOcrService
Implements IDisposable
Private _ocrEngine As IOcrEngine
Private _codecs As RasterCodecs
Public Sub New()
' Step 1: Locate and validate both license files
RasterSupport.SetLicense(
"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText("C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"))
' Step 2: Initialize image codec layer
_codecs = New RasterCodecs()
' Step 3: Select engine type — wrong choice means different behavior
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)
' Step 4: Load runtime into memory (500–2000ms)
_ocrEngine.Startup(_codecs, Nothing, Nothing,
"C:\LEADTOOLS\OCR\OcrRuntime")
End Sub
Public Function ExtractText(imagePath As String) As String
Using image = _codecs.Load(imagePath)
Using document = _ocrEngine.DocumentManager.CreateDocument()
Dim page = document.Pages.AddPage(image, Nothing)
page.Recognize(Nothing) ' Recognition is not automatic
Return page.GetText(-1)
End Using
End Using
End Function
Public Sub Dispose() Implements IDisposable.Dispose
If _ocrEngine IsNot Nothing Then
_ocrEngine.Shutdown() ' Must call before Dispose
_ocrEngine.Dispose()
End If
If _codecs IsNot Nothing Then
_codecs.Dispose()
End If
End Sub
End Class
Bu, minimum uygulanabilir uygulamadır. Lisans yolu hataları, motor durumu doğrulama veya toplu işlem için gerekli olan bellek yönetimi (RasterImage örneklerinin bırakılmasının unutulması işlemin çökmesine kadar belleği biriktirir) için hata işlemi içermez.
IronOCR'u Anlamak
IronOCR, geliştirilmiş bir Tesseract 5 LSTM motoru etrafında kurulmuş ticari bir .NET OCR kütüphanesidir. Odağa sahip bir OCR ürünüdür — modül olarak OCR içeren bir görüntüleme platformu değil. Tasarım hedefi, bir geliştirici ve tanınmış metin arasındaki her türlü altyapı yükünü kaldırmaktır.
IronOCR'nin ana özellikleri:
- Tek NuGet paketi:
dotnet add package IronOcr, dağıtacak ek bir çalışma zamanı dizini, tessdata klasörü veya lisans dosyası olmadan gerekli her şeyi, yerel bağımlılıklar dahil, kurar. - Dize tabanlı lisanslama: Tek bir satır, bir lisans anahtarı atar. Anahtar, bir ortam değişkeninden,
appsettings.json, Azure Key Vault veya AWS Secrets Manager'dan gelebilir — zaten kullanılan herhangi bir gizlilik yönetimi deseni. Diske dosya yok. - Motor yaşam döngüsü yok:
IronTesseract, ilk kullanımda lazy loading ile başlatılır. HiçbirStartup()çağrısı yok,Shutdown()çağrısı yok ve işlemler arasında motoru bırakma gerekliliği yok. - Yerel PDF girişi: PDF'ler,
OcrInput.LoadPdf()aracılığıyla doğrudan yüklenir. Sayfa sayfa rasterleştirme döngüsü yok, bayt sırası belirtimi yok, araRasterImagenesnelerinin manuel olarak bırakılması yok. - Otomatik ön işleme: Yatıştırma, paraziti giderme, kontrast arttırma, ikili hale getirme ve çözünürlük normalizasyonu
OcrInputüzerinde tek bir yöntem çağrısı olarak mevcuttur. Tüm sayfalara aynı anda uygulanır. - 125+ dil NuGet üzerinden: Her dil ayrı bir NuGet paketi (
IronOcr.Languages.French, vb.). Yönetilecek bir tessdata dizini yok, yol yapılandırması yok. - Varsayılan olarak thread-safe:
IronTesseractörnekleri eşzamanlı kullanım için güvenlidir. Paralel işleme ek senkronizasyon kodu gerektirmez. - Süresiz lisanslama: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited, bir yıl güncellemeyle birlikte tek seferlik satın alma.
Özellik Karşılaştırması
| Özellik | LEADTOOLS OCR | IronOCR |
|---|---|---|
| Kurulum karmaşıklığı | Yüksek — 4 adımlı başlatma dizisi | Düşük — bir NuGet paketi |
| Lisans dağıtımı | Her makinede iki dosya (.LIC + .LIC.KEY) |
Dize anahtarı, herhangi bir yere kaydedin |
| Fiyatlandırma modeli | LEADTOOLS satış departmanıyla fiyatlandırma için iletişime geçin | $999–$5,999 tek seferlik süresiz |
| PDF desteği | Elle sayfa bazında rasterleştirme | Yerel LoadPdf() |
| Ön işlem | Elle — ayrı görüntü işleme komutları | Yerleşik filtre yöntemleri |
| Motor yaşam döngüsü | Manuel Startup() / Shutdown() gereklidir |
Otomatik, tembel |
| NuGet paketleri | Birden fazla (Leadtools, Leadtools.Ocr, Leadtools.Codecs, Leadtools.Pdf) | Bir (IronOcr) |
| Thread güvenliği | Dikkatli yönetim gerektirir | Yerleşik |
Ayrıntılı Özellik Karşılaştırması
| Özellik | LEADTOOLS OCR | IronOCR |
|---|---|---|
| Lisanslama | ||
| Lisans mekanizması | .LIC + .LIC.KEY dosya çifti |
Dize anahtarı |
| Lisans dağıtımı | Her üretim makinesinde dosyalar | Ortam değişkeni veya yapılandırma |
| Fiyat şeffaflığı | Satış danışması gereklidir | Web sitesinde yayınlanmış |
| Süresiz seçenek | Hayır (yıllık bakım gereklidir) | Evet |
| Kurulum ve Yükleme | ||
| NuGet paketleri gerekli | 3–4 minimum (PDF için daha fazla) | 1 |
| Çalışma zamanı dosyaları gereklidir | Evet — OcrRuntime/ dizini |
Hayır |
| Motor başlatma | Runtime yoluyla manuel Startup() |
None |
| Motor kapatma | Dispose() öncesinde manuel Shutdown() |
None |
| tessdata management | Tesseract motor seçeneği için gereklidir | Hayır |
| OCR Yetenekleri | ||
| Motor seçenekleri | LEAD, Tesseract, OmniPage (ayrı lisanslanır) | IronTesseract (optimize edilmiş Tesseract 5 LSTM) |
| Diller | 60–120 (motor bağımlı) | 125+ NuGet üzerinden |
| Dil dağıtımı | tessdata files or engine-bundled | NuGet dil paketleri |
| Güven skoru | page.RecognizeStatus |
result.Confidence (yüzde) |
| Yapılandırılmış çıktı | Sayfa, bölge-düzeyi | Sayfa, paragraf, satır, kelime, karakter |
| Barkod okuma | Ayrıca LEADTOOLS Barkod modülü | Dahili (ReadBarCodes = true) |
| PDF İşleme | ||
| PDF girdisi | Sayfa bazında rasterleştirme döngüsü | Yerel LoadPdf() |
| Şifreli PDF'ler | Leadtools.Pdf modülü gerektirir (ek lisans) |
Dahili Password parametresi |
| Aranabilir PDF çıktısı | DocumentWriter yapılandırması + document.Save() |
result.SaveAsSearchablePdf() |
| Sayfa aralığı seçimi | Elle döngü sınırları | LoadPdfPages(path, start, end) |
| Ön işlem | ||
| Hizalama | DeskewCommand (manuel her görüntü için) |
input.Deskew() |
| Gürültü giderme | DespeckleCommand (manuel her görüntü için) |
input.DeNoise() |
| İkili hale getirme | AutoBinarizeCommand (manuel her görüntü için) |
input.Binarize() |
| Kontrast artırma | ContrastBrightnessCommand (manuel) |
input.Contrast() |
| Çözünürlük iyileştirmesi | Elle gri tonlama + yeniden örnekleme komutları | input.EnhanceResolution(300) |
| Dağıtım | ||
| Docker | LIC/ANAHTAR dosyaları takılmalı veya sabit olmalı | Standart dotnet publish |
| Linux | Yerel bağımlılıklar ile desteklenir | Desteklenir, bağımlılıklar paketlenmiştir |
| İzole | Evet | Evet |
| CI/CD karmaşıklığı | Her ortamda lisans dosyaları + çalışma zamanı yolu | Gizli yönetiminde lisans anahtarı |
Lisans Mimarisi: Dosya Dağıtımı vs. Dize Anahtar
LEADTOOLS ve IronOCR arasında lisans mimarisi farkı sadece geliştirici ergonomisi ile sınırlı değil — doğrudan dağıtım hatlarını, konteyner stratejilerini ve operasyon yükünü etkiler.
LEADTOOLS Yaklaşımı
LEADTOOLS, uygulama başlatıldığında mevcut ve okunabilir iki fiziksel dosya gerektirir. .cs kaynak dosyalarındaki kod modeli doğrular:
// From leadtools-migration-examples.cs
public void InitializeLicense()
{
// Option 1: Absolute paths — deployment dependent
string licPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC";
string keyPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY";
// Option 2: Relative paths — working directory dependent
licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC");
keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY");
// Read key file content (not the path — the content)
string key = File.ReadAllText(keyPath);
// Set license — silent failure on some error types
RasterSupport.SetLicense(licPath, key);
// Verify license is valid for the module you purchased
if (!RasterSupport.IsLocked(RasterSupportType.Document))
{
throw new InvalidOperationException("Document module not licensed");
}
}
// From leadtools-migration-examples.cs
public void InitializeLicense()
{
// Option 1: Absolute paths — deployment dependent
string licPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC";
string keyPath = @"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY";
// Option 2: Relative paths — working directory dependent
licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC");
keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY");
// Read key file content (not the path — the content)
string key = File.ReadAllText(keyPath);
// Set license — silent failure on some error types
RasterSupport.SetLicense(licPath, key);
// Verify license is valid for the module you purchased
if (!RasterSupport.IsLocked(RasterSupportType.Document))
{
throw new InvalidOperationException("Document module not licensed");
}
}
Imports System
Imports System.IO
Public Sub InitializeLicense()
' Option 1: Absolute paths — deployment dependent
Dim licPath As String = "C:\LEADTOOLS\License\LEADTOOLS.LIC"
Dim keyPath As String = "C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"
' Option 2: Relative paths — working directory dependent
licPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC")
keyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LEADTOOLS.LIC.KEY")
' Read key file content (not the path — the content)
Dim key As String = File.ReadAllText(keyPath)
' Set license — silent failure on some error types
RasterSupport.SetLicense(licPath, key)
' Verify license is valid for the module you purchased
If Not RasterSupport.IsLocked(RasterSupportType.Document) Then
Throw New InvalidOperationException("Document module not licensed")
End If
End Sub
Hata modları birden fazla ve her biri ayrı bir çözüm gerektirir. Yol çözümlemesi, IIS ile bir konsol ana bilgisayarı arasında farklı davranır. bin/Debug içindeki göreceli yollar, bin/Release ya da birDockerkonteynerında yollarla eşleşmez, onları açıkça eşleştirmedikçe. LIC ve KEY dosyalarının aynı indirilmeye ait olması gerekir — farklı indirmelerden dosyalar 'anahtar lisans dosyasıyla eşleşmiyor' hatası üretir. Eğer lisans yalnızca Belge paketi kapsamındaysa ancak kod Tanıma paketinden bir özellik kullanıyorsa, IsLocked() false döndürür ve uygulama başlangıçta uyumsuzluğu işlemesi gerekir.
Üretim sırasındaki yaygın hatalar:
"License file not found at specified path"— yol yanlış dizine çözülmüş"License key does not match license file"— çeşitli indirmelerden gelen veya aktarımda bozulmuş dosyalar"Document module not licensed"— yanlış paket satın alındı"License has expired"— değerlendirme lisans süresi doldu veya bakım aksadı
IronOCR Yaklaşımı
IronOCR lisanslaması tek bir dize atamasıdır. Dosya yok, yol çözünürlüğü yok, iki parçalı doğrulama yok:
// From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY";
// Production: pull from environment variable
IronOcr.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration["IronOCR:LicenseKey"];
// From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY";
// Production: pull from environment variable
IronOcr.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration["IronOCR:LicenseKey"];
' From application startup — store key using any secrets management pattern
IronOcr.License.LicenseKey = "IRONSUITE.YOUR-LICENSE-KEY"
' Production: pull from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
' Or from ASP.NET configuration
IronOcr.License.LicenseKey = Configuration("IronOCR:LicenseKey")
Anahtar Azure Anahtar Kasası, AWS Secrets Manager, Kubernetes sırları veyaDockerçevresel değişkenine girebilir.Dockergörüntüsünde dahil edilmesi gereken dosya yoktur. CI/CD hattı aşaması, lisans eserlerini yapı ajanlarına kopyalamaz. IronOCR lisanslama sayfası, mevcut düzeyleri doğrudan belgelemekte, satış görüşmesi gerektirmemektedir.
Motor Kurulumu ve Ayrıntı Düzeyi
Temel bir OCR görevi için LEADTOOLS ve IronOCR arasındaki kod farkı, her kütüphanenin API felsefesini gösterir.
LEADTOOLS Yaklaşımı
Metin döndürülmeden önce on farklı işlem gerektiren en düşük çalıştırılabilir LEADTOOLS uygulaması (leadtools-vs-ironocr-examples.cs'dan doğrudan alınmıştır):
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;
public class LeadtoolsOcrService : IDisposable
{
private IOcrEngine _ocrEngine;
private RasterCodecs _codecs;
public LeadtoolsOcrService()
{
// Step 1: License files
RasterSupport.SetLicense(
@"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));
// Step 2: Codec layer
_codecs = new RasterCodecs();
// Step 3: Engine factory
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
// Step 4: Engine startup (500–2000ms blocking call)
_ocrEngine.Startup(_codecs, null, null,
@"C:\LEADTOOLS\OCR\OcrRuntime");
}
public string ExtractText(string imagePath)
{
using var image = _codecs.Load(imagePath); // Step 5: Load via codecs
using var document = _ocrEngine.DocumentManager // Step 6: Create document
.CreateDocument();
var page = document.Pages.AddPage(image, null); // Step 7: Add page
page.Recognize(null); // Step 8: Explicit recognize
return page.GetText(-1); // Step 9: Extract text
}
public void Dispose()
{
_ocrEngine?.Shutdown(); // Step 10: Shutdown before dispose
_ocrEngine?.Dispose();
_codecs?.Dispose();
}
}
using Leadtools;
using Leadtools.Ocr;
using Leadtools.Codecs;
public class LeadtoolsOcrService : IDisposable
{
private IOcrEngine _ocrEngine;
private RasterCodecs _codecs;
public LeadtoolsOcrService()
{
// Step 1: License files
RasterSupport.SetLicense(
@"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText(@"C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"));
// Step 2: Codec layer
_codecs = new RasterCodecs();
// Step 3: Engine factory
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
// Step 4: Engine startup (500–2000ms blocking call)
_ocrEngine.Startup(_codecs, null, null,
@"C:\LEADTOOLS\OCR\OcrRuntime");
}
public string ExtractText(string imagePath)
{
using var image = _codecs.Load(imagePath); // Step 5: Load via codecs
using var document = _ocrEngine.DocumentManager // Step 6: Create document
.CreateDocument();
var page = document.Pages.AddPage(image, null); // Step 7: Add page
page.Recognize(null); // Step 8: Explicit recognize
return page.GetText(-1); // Step 9: Extract text
}
public void Dispose()
{
_ocrEngine?.Shutdown(); // Step 10: Shutdown before dispose
_ocrEngine?.Dispose();
_codecs?.Dispose();
}
}
Imports Leadtools
Imports Leadtools.Ocr
Imports Leadtools.Codecs
Imports System.IO
Public Class LeadtoolsOcrService
Implements IDisposable
Private _ocrEngine As IOcrEngine
Private _codecs As RasterCodecs
Public Sub New()
' Step 1: License files
RasterSupport.SetLicense(
"C:\LEADTOOLS\License\LEADTOOLS.LIC",
File.ReadAllText("C:\LEADTOOLS\License\LEADTOOLS.LIC.KEY"))
' Step 2: Codec layer
_codecs = New RasterCodecs()
' Step 3: Engine factory
_ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)
' Step 4: Engine startup (500–2000ms blocking call)
_ocrEngine.Startup(_codecs, Nothing, Nothing,
"C:\LEADTOOLS\OCR\OcrRuntime")
End Sub
Public Function ExtractText(imagePath As String) As String
Using image = _codecs.Load(imagePath) ' Step 5: Load via codecs
Using document = _ocrEngine.DocumentManager ' Step 6: Create document
.CreateDocument()
Dim page = document.Pages.AddPage(image, Nothing) ' Step 7: Add page
page.Recognize(Nothing) ' Step 8: Explicit recognize
Return page.GetText(-1) ' Step 9: Extract text
End Using
End Using
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_ocrEngine?.Shutdown() ' Step 10: Shutdown before dispose
_ocrEngine?.Dispose()
_codecs?.Dispose()
End Sub
End Class
DocumentManager.CreateDocument() / Pages.AddPage() / page.Recognize() / page.GetText() zinciri çözülebilir değildir. Her adım ayrı bir API çağrısıdır. page.GetText(-1) öncesinde page.Recognize(null) göz ardı edilir ve boş metin döner — bir sayfa eklenmesi otomatik olarak tanımayı tetiklemez.
IronOCR Yaklaşımı
Aynı karşılaştırma dosyasından eşdeğer IronOCR uygulaması, çekirdek işlem için bir satır ve sıfır yaşam döngüsü yönetimi:
using IronOcr;
public class OcrService
{
public string ExtractText(string imagePath)
{
return new IronTesseract().Read(imagePath).Text;
}
}
using IronOcr;
public class OcrService
{
public string ExtractText(string imagePath)
{
return new IronTesseract().Read(imagePath).Text;
}
}
Imports IronOcr
Public Class OcrService
Public Function ExtractText(imagePath As String) As String
Return New IronTesseract().Read(imagePath).Text
End Function
End Class
Üretim kullanımı için, IronTesseract örneği çağrılar arasında yeniden kullanıldığında:
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string imagePath)
{
return _ocr.Read(imagePath).Text;
}
}
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string imagePath)
{
return _ocr.Read(imagePath).Text;
}
}
Imports IronTesseract
Public Class OcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function ExtractText(imagePath As String) As String
Return _ocr.Read(imagePath).Text
End Function
End Class
Hiçbir Startup(), Shutdown() yok, hiçbir codec katmanı yok, hiçbir belge konteyneri yok, hiçbir açık tanıma çağrısı yok. IronTesseract API referansı tam yüzey alanını gösterir. kurulum kılavuzu, üretim senaryoları için yapılandırma seçeneklerini kapsar.
PDF İşleme
PDF OCR, LEADTOOLS'un sayfa bazında rasterleştirme modelinin en belirgin olduğu yerdir. LEADTOOLS'un yerel PDF tanıma yolu yoktur — her bir PDF sayfası RasterCodecs aracılığıyla raster bir görüntü olarak yüklenmeli, sonra IOcrDocument eklenmeli, daha sonra ayrı ayrı tanınmalı, daha sonrasında metin ayrı ayrı çıkarılmalıdır.
LEADTOOLS Yaklaşımı
leadtools-pdf-processing.cs'dan, temel PDF iş akışı:
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
// Get page count first — separate call
var pdfInfo = _codecs.GetInformation(pdfPath, true);
int totalPages = pdfInfo.TotalPages;
using var document = _ocrEngine.DocumentManager.CreateDocument();
for (int pageNum = 1; pageNum <= totalPages; pageNum++)
{
// Load each page as a raster image — must dispose each
using var pageImage = _codecs.Load(
pdfPath,
0, // bitsPerPixel
CodecsLoadByteOrder.BgrOrGray,
pageNum, // firstPage
pageNum); // lastPage
var page = document.Pages.AddPage(pageImage, null);
page.Recognize(null);
text.AppendLine(page.GetText(-1));
}
return text.ToString();
}
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
// Get page count first — separate call
var pdfInfo = _codecs.GetInformation(pdfPath, true);
int totalPages = pdfInfo.TotalPages;
using var document = _ocrEngine.DocumentManager.CreateDocument();
for (int pageNum = 1; pageNum <= totalPages; pageNum++)
{
// Load each page as a raster image — must dispose each
using var pageImage = _codecs.Load(
pdfPath,
0, // bitsPerPixel
CodecsLoadByteOrder.BgrOrGray,
pageNum, // firstPage
pageNum); // lastPage
var page = document.Pages.AddPage(pageImage, null);
page.Recognize(null);
text.AppendLine(page.GetText(-1));
}
return text.ToString();
}
Imports System.Text
Public Function ExtractTextFromPdf(ByVal pdfPath As String) As String
Dim text As New StringBuilder()
' Get page count first — separate call
Dim pdfInfo = _codecs.GetInformation(pdfPath, True)
Dim totalPages As Integer = pdfInfo.TotalPages
Using document = _ocrEngine.DocumentManager.CreateDocument()
For pageNum As Integer = 1 To totalPages
' Load each page as a raster image — must dispose each
Using pageImage = _codecs.Load(pdfPath, 0, CodecsLoadByteOrder.BgrOrGray, pageNum, pageNum)
Dim page = document.Pages.AddPage(pageImage, Nothing)
page.Recognize(Nothing)
text.AppendLine(page.GetText(-1))
End Using
Next
End Using
Return text.ToString()
End Function
Şifre korumalı bir PDF'nin işlenmesi başka bir bağımlılık ekler. leadtools-pdf-processing.cs'dan:
// Requires Leadtools.Pdf module — additional license
using Leadtools.Pdf;
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
var pdfFile = new PDFFile(pdfPath);
pdfFile.Password = password;
var loadOptions = new CodecsLoadOptions();
_codecs.Options.Pdf.Load.Password = password;
// ... same page iteration loop follows
}
// Requires Leadtools.Pdf module — additional license
using Leadtools.Pdf;
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
var pdfFile = new PDFFile(pdfPath);
pdfFile.Password = password;
var loadOptions = new CodecsLoadOptions();
_codecs.Options.Pdf.Load.Password = password;
// ... same page iteration loop follows
}
Imports Leadtools.Pdf
Public Function ExtractFromEncryptedPdf(ByVal pdfPath As String, ByVal password As String) As String
Dim pdfFile As New PDFFile(pdfPath)
pdfFile.Password = password
Dim loadOptions As New CodecsLoadOptions()
_codecs.Options.Pdf.Load.Password = password
' ... same page iteration loop follows
End Function
Leadtools.Pdf isim alanı ayrı bir modüldür. Geliştirme ekibi OCR modülünü satın aldıysa ancak PDF modülü yoksa, şifreli PDF desteği ek lisans satın alımı olmadan kullanılamaz.
Aranabilir bir PDF çıktısı oluşturmak, DocumentWriter yapılandırmayı kaydetmeden önce gerektirir:
// From leadtools-pdf-processing.cs
var pdfOptions = new PdfDocumentOptions
{
DocumentType = PdfDocumentType.Pdf,
ImageOverText = true,
Linearized = false,
Title = Path.GetFileNameWithoutExtension(inputPdfPath)
};
_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions);
document.Save(outputPdfPath, DocumentFormat.Pdf, null);
// From leadtools-pdf-processing.cs
var pdfOptions = new PdfDocumentOptions
{
DocumentType = PdfDocumentType.Pdf,
ImageOverText = true,
Linearized = false,
Title = Path.GetFileNameWithoutExtension(inputPdfPath)
};
_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions);
document.Save(outputPdfPath, DocumentFormat.Pdf, null);
Imports System.IO
Dim pdfOptions As New PdfDocumentOptions With {
.DocumentType = PdfDocumentType.Pdf,
.ImageOverText = True,
.Linearized = False,
.Title = Path.GetFileNameWithoutExtension(inputPdfPath)
}
_engine.DocumentWriterInstance.SetOptions(DocumentFormat.Pdf, pdfOptions)
document.Save(outputPdfPath, DocumentFormat.Pdf, Nothing)
IronOCR Yaklaşımı
IronOCR PDF'leri yerel olarak ele alır. Aynı üç senaryo — temel PDF, şifre korumalı PDF ve aranabilir PDF çıktısı — her biri iki ila üç satıra indirir:
using IronOcr;
// Basic PDF — all pages, automatic handling
public string ExtractTextFromPdf(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return new IronTesseract().Read(input).Text;
}
// Password-protected PDF — no additional module required
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath, Password: password);
return new IronTesseract().Read(input).Text;
}
//Aranabilir PDF çıktısı— one method call
public void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
using var input = new OcrInput();
input.LoadPdf(inputPdfPath);
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf(outputPdfPath);
}
using IronOcr;
// Basic PDF — all pages, automatic handling
public string ExtractTextFromPdf(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return new IronTesseract().Read(input).Text;
}
// Password-protected PDF — no additional module required
public string ExtractFromEncryptedPdf(string pdfPath, string password)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath, Password: password);
return new IronTesseract().Read(input).Text;
}
//Aranabilir PDF çıktısı— one method call
public void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
using var input = new OcrInput();
input.LoadPdf(inputPdfPath);
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf(outputPdfPath);
}
Imports IronOcr
' Basic PDF — all pages, automatic handling
Public Function ExtractTextFromPdf(pdfPath As String) As String
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Return New IronTesseract().Read(input).Text
End Using
End Function
' Password-protected PDF — no additional module required
Public Function ExtractFromEncryptedPdf(pdfPath As String, password As String) As String
Using input As New OcrInput()
input.LoadPdf(pdfPath, Password:=password)
Return New IronTesseract().Read(input).Text
End Using
End Function
'Aranabilir PDF çıktısı— one method call
Public Sub CreateSearchablePdf(inputPdfPath As String, outputPdfPath As String)
Using input As New OcrInput()
input.LoadPdf(inputPdfPath)
Dim result = New IronTesseract().Read(input)
result.SaveAsSearchablePdf(outputPdfPath)
End Using
End Sub
PDF giriş rehberi sayfa aralığı seçimini, akış girişini ve sayfa başına sonuç erişimini kapsar. aranabilir PDF örneği tam çıktı iş akışını gösterir. Tanıma öncesi düşük kaliteli taranmış PDF'ler için görüntü kalitesi düzeltme rehberine bakın.
Önişleme: El Komutları ve Yerleşik Filtreler
LEADTOOLS, ayrı bir Leadtools.ImageProcessing isim alanı üzerinden görüntü işleme komutları sağlar. Bu komutlar, görüntü OCR motoruna aktarılmadan önce her RasterImage örneğine ayrı ayrı uygulanmalıdır.
LEADTOOLS Yaklaşımı
leadtools-pdf-processing.cs'dan, bir PDF sayfasının ön işlenmesi:
using Leadtools.ImageProcessing;
public string ProcessLowQualityPdf(string pdfPath)
{
var text = new StringBuilder();
var pdfInfo = _codecs.GetInformation(pdfPath, true);
using var document = _engine.DocumentManager.CreateDocument();
for (int i = 1; i <= pdfInfo.TotalPages; i++)
{
using var pageImage = _codecs.Load(pdfPath, 0,
CodecsLoadByteOrder.BgrOrGray, i, i);
// Each command is a separate instantiation and Run() call
var deskewCommand = new DeskewCommand();
deskewCommand.Run(pageImage);
var despeckleCommand = new DespeckleCommand();
despeckleCommand.Run(pageImage);
if (pageImage.BitsPerPixel > 8)
{
var grayscaleCommand = new GrayscaleCommand(8);
grayscaleCommand.Run(pageImage);
}
var binarizeCommand = new AutoBinarizeCommand();
binarizeCommand.Run(pageImage);
var page = document.Pages.AddPage(pageImage, null);
page.Recognize(null);
text.AppendLine(page.GetText(-1));
}
return text.ToString();
}
using Leadtools.ImageProcessing;
public string ProcessLowQualityPdf(string pdfPath)
{
var text = new StringBuilder();
var pdfInfo = _codecs.GetInformation(pdfPath, true);
using var document = _engine.DocumentManager.CreateDocument();
for (int i = 1; i <= pdfInfo.TotalPages; i++)
{
using var pageImage = _codecs.Load(pdfPath, 0,
CodecsLoadByteOrder.BgrOrGray, i, i);
// Each command is a separate instantiation and Run() call
var deskewCommand = new DeskewCommand();
deskewCommand.Run(pageImage);
var despeckleCommand = new DespeckleCommand();
despeckleCommand.Run(pageImage);
if (pageImage.BitsPerPixel > 8)
{
var grayscaleCommand = new GrayscaleCommand(8);
grayscaleCommand.Run(pageImage);
}
var binarizeCommand = new AutoBinarizeCommand();
binarizeCommand.Run(pageImage);
var page = document.Pages.AddPage(pageImage, null);
page.Recognize(null);
text.AppendLine(page.GetText(-1));
}
return text.ToString();
}
Imports Leadtools.ImageProcessing
Imports System.Text
Public Function ProcessLowQualityPdf(pdfPath As String) As String
Dim text As New StringBuilder()
Dim pdfInfo = _codecs.GetInformation(pdfPath, True)
Using document = _engine.DocumentManager.CreateDocument()
For i As Integer = 1 To pdfInfo.TotalPages
Using pageImage = _codecs.Load(pdfPath, 0, CodecsLoadByteOrder.BgrOrGray, i, i)
' Each command is a separate instantiation and Run() call
Dim deskewCommand As New DeskewCommand()
deskewCommand.Run(pageImage)
Dim despeckleCommand As New DespeckleCommand()
despeckleCommand.Run(pageImage)
If pageImage.BitsPerPixel > 8 Then
Dim grayscaleCommand As New GrayscaleCommand(8)
grayscaleCommand.Run(pageImage)
End If
Dim binarizeCommand As New AutoBinarizeCommand()
binarizeCommand.Run(pageImage)
Dim page = document.Pages.AddPage(pageImage, Nothing)
page.Recognize(Nothing)
text.AppendLine(page.GetText(-1))
End Using
Next
End Using
Return text.ToString()
End Function
Her ön işleme adımı, bir komut sınıfı oluşturmayı ve görüntü üzerinde .Run() çağrısında bulunmayı gerektirir. Geliştirici, her dönüşümün sırasını ve uygulanabilirliğini yönetir. Eğer görüntü zaten ikili ise, AutoBinarizeCommand kalitenin düşmesine neden olabilir. Koşullu BitsPerPixel kontrolü geliştiricinin sorumluluğundadır.
IronOCR Yaklaşımı
IronOCR ön işlemesi, OcrInput nesnesine uygulanır ve tüm yüklenmiş sayfaları aynı anda etkiler:
using IronOcr;
public string ProcessLowQualityPdf(string pdfPath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Applied to all pages
input.Deskew();
input.DeNoise();
input.Binarize();
input.Contrast();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
return result.Text;
}
using IronOcr;
public string ProcessLowQualityPdf(string pdfPath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Applied to all pages
input.Deskew();
input.DeNoise();
input.Binarize();
input.Contrast();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
return result.Text;
}
Imports IronOcr
Public Function ProcessLowQualityPdf(pdfPath As String) As String
Dim ocr = New IronTesseract()
Using input As New OcrInput()
input.LoadPdf(pdfPath)
' Applied to all pages
input.Deskew()
input.DeNoise()
input.Binarize()
input.Contrast()
input.EnhanceResolution(300)
Dim result = ocr.Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
Return result.Text
End Using
End Function
Beş ön işleme adımı, tüm sayfalara eşit olarak uygulanır, sayfa başına döngü yoktur. IronOCR'un otomatik ön işleme özelliği, varsayılan olarak her Read() çağrısında çalışır, yaygın tarama sorunlarını hiçbir açık filtre çağrısı olmadan ele alır. görüntü filtreleri eğitimi tam filtre kataloğunu kapsar. düşük kaliteli tarama örneği, zor belgelerde önişleme öncesi ve sonrası gösterir.
API Eşleme Başvurusu
| LEADTOOLS API | IronOCR Karşılığı |
|---|---|
RasterSupport.SetLicense(licPath, key) |
IronOcr.License.LicenseKey = "key" |
RasterCodecs |
OcrInput |
_codecs.Load(path) |
input.LoadImage(path) veya input.LoadPdf(path) |
_codecs.GetInformation(path, true).TotalPages |
Otomatik — sayfa sayısı gerekli değil |
OcrEngineManager.CreateEngine(OcrEngineType.LEAD) |
new IronTesseract() |
engine.Startup(_codecs, null, null, runtimePath) |
Gerekli değil |
engine.Shutdown() |
Gerekli değil |
engine.DocumentManager.CreateDocument() |
Gerekli değil |
document.Pages.AddPage(image, null) |
input.LoadImage(path) |
page.Recognize(null) |
ocr.Read(input) (tanıma, Read'in bir parçasıdır) |
page.GetText(-1) |
result.Text |
page.RecognizeStatus |
result.Confidence |
OcrZone ile Bounds = new LeadRect(x, y, w, h) |
new CropRectangle(x, y, w, h) input.LoadImage()'ya geçirildi |
OcrZoneType.Text |
Varsayılan — tür belirtimi gerekmez |
page.Zones.Add(zone) |
input.LoadImage(path, cropRect) |
DeskewCommand().Run(image) |
input.Deskew() |
DespeckleCommand().Run(image) |
input.DeNoise() |
AutoBinarizeCommand().Run(image) |
input.Binarize() |
PdfDocumentOptions { ImageOverText = true } |
result.SaveAsSearchablePdf() tarafından işlendi |
_engine.DocumentWriterInstance.SetOptions(...) |
Gerekli değil |
document.Save(path, DocumentFormat.Pdf, null) |
result.SaveAsSearchablePdf(path) |
CodecsLoadByteOrder.BgrOrGray |
Gerekli değil — otomatik olarak ele alınır |
_codecs.Options.Pdf.Load.Password = password |
input.LoadPdf(path, Password: password) |
Takımların LEADTOOLS OCR'den IronOCR'ye Geçişi Düşünmesi
Görüntüleme Kiti Gerekeceğiz Sadece OCR Projesi
LEADTOOLS, bir ekibin entegre bir platformda döküman görüntüleyici, tıbbi görüntüleme, form tanıma ve OCR birlikte çalışmasına uygun olduğunda mali ve mimari anlamda mantıklıdır. Gereksinim, görüntülerden ve PDF'lerden metin çıkarımı olduğunda hesaplama değişir. LEADTOOLS lisans maliyetleri, teklifler için bir satış birlikteliği gerektirir — güncel fiyatlandırma için LEADTOOLS ile iletişime geçin. Yıllık bakım lisans maliyetine ek olarak gereklidir. Profesyonel seviyedeki $2,999'daki IronOCR, yenileme gerektirmeksizin 10 geliştiriciyi kapsar. LEADTOOLS yenileme döngüsünün sonuna gelmiş ve maliyeti yeniden değerlendiren ekipler, genellikle paketin yalnızca OCR modülünü kullandıklarını keşfederler.
Kapsayıcı ve Sunucusuz Dağıtımlar
LEADTOOLS'un dosya tabanlı lisanslaması, modern dağıtım mimarilerinde aktif bir sürtüşme noktası haline gelir.Dockerkonteyneri, görüntüye yerleştirilmiş — katman geçmişinde açığa çıkan — veya her düzenleme ortamında hacim eşgüdümüyle çalıştırıldığında monte edilmiş iki fiziksel lisans dosyasına ihtiyaç duyar. Azure İşlevleri ve AWS Lambda, lisans dosyası dağıtımı için belirgin bir mekanizma olmadan geçici çözümler gerektirir. LEADTOOLS, çalışma zamanlı dosyaları belleğe yükleyen ve sunucusuz işlevler için doğrudan kullanıcı deneyimini etkileyen 500–2000 ms ekleyen engelleyici bir motor başlatması da gerçekleştirir — sunucusuz işlevlerde gecikme doğrudan kullanıcı deneyimini etkiler. IronOCR, standart bir NuGet referansı olarak dağıtılır, bir çevre değişkeninden lisans anahtarı ayarlar ve temelde ilk kullanımda gecikmeli olarak başlatılır. Docker dağıtım kılavuzu ve AWS dağıtım kılavuzu ortak kapsayıcı senaryoları için ayrıntıları kapsar.
Yanlış Paket Sorunu
LEADTOOLS'un modül yapısı, IronOCR'nin sahip olmadığı bir sorun kategorisi yaratır: yanlış düzeyin satın alınması. OCR, her LEADTOOLS paketinde dahil değildir. Şifre korumalı PDF desteği, her OCR odaklı lisansın bir parçası olmayan ayrı bir PDF modülü gerektirir. Daha yüksek doğruluk motor seçeneği, LEADTOOLS satın alınmasının üzerine ayrı bir satıcı anlaşması gerektirir. Satın almanın ihtiyaç duydukları bir özelliği kapsadığını düşünen ekipler — ve üretimde çalışma zamanı sırasında aksiyle karşılaştıklarında — satışla özellik etkinleştirilmeden önce yeniden pazarlık sürecine girmelidirler.IronOCR lisansları, her düzeyde tüm özellikleri kapsar. Ayrı bir PDF modülü yok, şifreli belgeler için ek yok, daha yüksek doğruluk motoru için ikinci bir satıcı yok.
Bakım ve Kaynak Yönetimi Karmaşıklığı
LEADTOOLS'un motor yaşam döngüsü sadece bir kurulum seremonisi değildir — devam eden bir bakım yüzeyi oluşturur. Motor başlatılmalı, kullanılmalı, kapatılmalı ve ardından doğru sırada bertaraf edilmelidir; bu diziden sapma hatalar üretir. LEADTOOLS toplu işleme uygulamalarındaki bellek sızıntıları genellikle bertaraf edilmeyen ara görüntü nesnelerine, işleme sonrası açık bırakılan belge konteynerlerine veya uygun temizlik yapılmadan birden çok kez oluşturulmuş motor örneklerine izlenir. Üretim toplu işlemcileri genellikle belge parçaları arasında telafi mekanizması olarak zorunlu çöp toplama çağrılarını içerir — bu, altta yatan nesne modelinin çalışma zamanıyla mücadele ettiğine işaret eden bir kalıptır. Gece yarısı 2'de bir belge işleme hizmetindeki bellek büyümesini hata ayıklamış olan ekipler, genellikle kök nedeni LEADTOOLS bertaraf modelinde bulurlar.IronOCR standart .NET bertaraf kapsamlarını kullanır. Yalnızca giriş konteynerinin açıkça bertaraf edilmesi gerekir. Motorun kendisi durumsuz ve iş parçacığı güvenlidir.
Çoklu Ortam Dağıtım Tutarlılığı
Geliştirme, hazırlık ve üretim ortamlarının hepsi, konsistent yollarda LEADTOOLS lisans dosyalarına ve uygulamanın başlatma sırasında beklediği tam yolda çalışma zamanı dizinine ihtiyaç duyar. Ortamlar arasında bir tutarsızlık — bir hazırlık sunucusu, üretimden farklı bir sürücü harfi ile çalışma zamanı dizin yolu üretir — o ortama özgü bir hata üretir ve düzeltmek için bir kod veya yapılandırma değişikliği gerektirir.IronOCR lisans anahtarı ve tek NuGet paketi, tüm ortamlarda aynı şekilde davranır. Lisans anahtarı ortam-spesifik tek değerdir ve her .NET ekibinin zaten veritabanı bağlantı dizeleri ve API anahtarları için kullandığı aynı gizli yönetim kalıplarını izler.
Genel Geçiş Dikkat Edilmesi Gereken Hususlar
Motor Yaşam Döngüsü Kaldırma
LEADTOOLS kodu, yaşam döngüsünün yönetilmesi gerektiğinden, motoru IDisposable uygular bir hizmet sınıfının içinde sarar. Göç bu gereksinimi tamamen ortadan kaldırır:
// LEADTOOLS: Service class required for lifecycle management
public class LeadtoolsService : IDisposable
{
private IOcrEngine _engine;
private RasterCodecs _codecs;
public LeadtoolsService()
{
RasterSupport.SetLicense(licPath, key);
_codecs = new RasterCodecs();
_engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
_engine.Startup(_codecs, null, null, runtimePath);
}
public string Process(string path)
{
using var image = _codecs.Load(path);
using var doc = _engine.DocumentManager.CreateDocument();
var page = doc.Pages.AddPage(image, null);
page.Recognize(null);
return page.GetText(-1);
}
public void Dispose()
{
_engine?.Shutdown();
_engine?.Dispose();
_codecs?.Dispose();
}
}
// IronOCR: No lifecycle to manage
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string Process(string path) => _ocr.Read(path).Text;
}
// LEADTOOLS: Service class required for lifecycle management
public class LeadtoolsService : IDisposable
{
private IOcrEngine _engine;
private RasterCodecs _codecs;
public LeadtoolsService()
{
RasterSupport.SetLicense(licPath, key);
_codecs = new RasterCodecs();
_engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
_engine.Startup(_codecs, null, null, runtimePath);
}
public string Process(string path)
{
using var image = _codecs.Load(path);
using var doc = _engine.DocumentManager.CreateDocument();
var page = doc.Pages.AddPage(image, null);
page.Recognize(null);
return page.GetText(-1);
}
public void Dispose()
{
_engine?.Shutdown();
_engine?.Dispose();
_codecs?.Dispose();
}
}
// IronOCR: No lifecycle to manage
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string Process(string path) => _ocr.Read(path).Text;
}
Imports System
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Ocr
Imports IronOcr
' LEADTOOLS: Service class required for lifecycle management
Public Class LeadtoolsService
Implements IDisposable
Private _engine As IOcrEngine
Private _codecs As RasterCodecs
Public Sub New()
RasterSupport.SetLicense(licPath, key)
_codecs = New RasterCodecs()
_engine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD)
_engine.Startup(_codecs, Nothing, Nothing, runtimePath)
End Sub
Public Function Process(path As String) As String
Using image = _codecs.Load(path)
Using doc = _engine.DocumentManager.CreateDocument()
Dim page = doc.Pages.AddPage(image, Nothing)
page.Recognize(Nothing)
Return page.GetText(-1)
End Using
End Using
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_engine?.Shutdown()
_engine?.Dispose()
_codecs?.Dispose()
End Sub
End Class
' IronOCR: No lifecycle to manage
Public Class OcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function Process(path As String) As String
Return _ocr.Read(path).Text
End Function
End Class
IronTesseract örneği thread-safe'tir ve singleton olarak paylaşılabilir. Motorun faydası için hizmet sınıfında IDisposable uygulamasına gerek yoktur.
Bölge Bazında OCR Göçü
LEADTOOLS bölge yapılandırması, LeadRect sınırları ile OcrZone kullanır ve özel olanlar eklenmeden önce otomatik tespit edilen bölgeleri temizlemeyi gerektirir. IronOCR, doğrudan LoadImage()'a gönderilen CropRectangle kullanır:
// LEADTOOLS zone setup
var zone = new OcrZone
{
Bounds = new LeadRect(x, y, width, height),
ZoneType = OcrZoneType.Text,
CharacterFilters = OcrZoneCharacterFilters.None,
RecognitionModule = OcrZoneRecognitionModule.Auto
};
page.Zones.Clear(); // Must clear auto-detected zones first
page.Zones.Add(zone);
//IronOCR equivalent
using var input = new OcrInput();
input.LoadImage(imagePath, new CropRectangle(x, y, width, height));
var text = new IronTesseract().Read(input).Text;
// LEADTOOLS zone setup
var zone = new OcrZone
{
Bounds = new LeadRect(x, y, width, height),
ZoneType = OcrZoneType.Text,
CharacterFilters = OcrZoneCharacterFilters.None,
RecognitionModule = OcrZoneRecognitionModule.Auto
};
page.Zones.Clear(); // Must clear auto-detected zones first
page.Zones.Add(zone);
//IronOCR equivalent
using var input = new OcrInput();
input.LoadImage(imagePath, new CropRectangle(x, y, width, height));
var text = new IronTesseract().Read(input).Text;
Imports Leadtools
Imports IronOcr
' LEADTOOLS zone setup
Dim zone As New OcrZone With {
.Bounds = New LeadRect(x, y, width, height),
.ZoneType = OcrZoneType.Text,
.CharacterFilters = OcrZoneCharacterFilters.None,
.RecognitionModule = OcrZoneRecognitionModule.Auto
}
page.Zones.Clear() ' Must clear auto-detected zones first
page.Zones.Add(zone)
' IronOCR equivalent
Using input As New OcrInput()
input.LoadImage(imagePath, New CropRectangle(x, y, width, height))
Dim text As String = New IronTesseract().Read(input).Text
End Using
bölge tabanlı OCR kılavuzu tek bölge ve çoklu bölge çıkarma kalıplarını kapsar. bölge kırpma örneği pratik bir kullanım alanı olarak fatura başlık çıkarımını gösterir.
NuGet Paketi Temizleme
LEADTOOLS birden çok paket gerektirir. Göç tümünü kaldırır ve tek bir tane ekler:
# Remove LEADTOOLS packages
dotnet remove package Leadtools
dotnet remove package Leadtools.Ocr
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Pdf
# Add IronOCR
dotnet add package IronOcr
# Remove LEADTOOLS packages
dotnet remove package Leadtools
dotnet remove package Leadtools.Ocr
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Pdf
# Add IronOCR
dotnet add package IronOcr
Dağıtım ayak izi azaltımı önemlidir. Bina çıktısından gitti: LEADTOOLS.LIC, LEADTOOLS.LIC.KEY, OcrRuntime/ dizini, birden fazla LEADTOOLS DLL'leri ve Tesseract motoru seçeneğinden herhangi bir tessdata/ klasörü. Kalan tek paket referansıdır. IronOCR NuGet paketi tüm yerel bağımlılıkları içerir.
Güven Skoru Erişimi
LEADTOOLS tanıma kalitesini bir enum olarak (OcrPageRecognizeStatus.Done tamamlama gösterir, ancak doğruluk seviyesini değil) page.RecognizeStatus üzerinden açığa çıkarır. IronOCR, doğrudan yüzde oranı result.Confidence sağlar:
var result = new IronTesseract().Read("document.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Branch on quality threshold
if (result.Confidence < 60)
{
// Apply additional preprocessing and retry
using var input = new OcrInput();
input.LoadImage("document.jpg");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
result = new IronTesseract().Read(input);
}
var result = new IronTesseract().Read("document.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Branch on quality threshold
if (result.Confidence < 60)
{
// Apply additional preprocessing and retry
using var input = new OcrInput();
input.LoadImage("document.jpg");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
result = new IronTesseract().Read(input);
}
Imports System
Imports IronOcr
Dim result = New IronTesseract().Read("document.jpg")
Console.WriteLine($"Confidence: {result.Confidence}%")
' Branch on quality threshold
If result.Confidence < 60 Then
' Apply additional preprocessing and retry
Using input As New OcrInput()
input.LoadImage("document.jpg")
input.Deskew()
input.DeNoise()
input.EnhanceResolution(300)
result = New IronTesseract().Read(input)
End Using
End If
güven skorları kılavuzu eşik seçimini ve kalite tabanlı yeniden deneme kalıplarını kapsar.
Ek IronOCR Yetenekleri
Yukarıda kapsanan karşılaştırma noktalarının ötesinde, IronOCR, LEADTOOLS OCR'de olmayan veya ek modül satın alımları gerektiren özellikler de içerir:
- OCR sırasında barkod okuma:
ocr.Configuration.ReadBarCodes = trueayarlayın ve barkodlar tek birRead()geçişinde metinle birlikte çıkarılır. Ayrı LEADTOOLS Barkod modülü lisansı gerekmez. barkod okuma kılavuzuna ve barkod OCR örneğine bakın. - Yapılandırılmış veri çıkarma:
result.Pages,result.Paragraphs,result.Lines,result.Wordsveresult.Characters, tüm belge hiyerarşisini sınır kutuları ve her eleman için güven skorları ile birlikte açığa çıkarır. okuma sonuçları kılavuzu tam çıktı modelini kapsar. - hOCR dışa aktarımı:
result.SaveAsHocrFile(), ek yerleşim analizi için yerleşik konum verisi ile HTML üretir. hOCR dışa aktarım kılavuzuna bakın. - 125+ dil desteği: Her dil bir NuGet paketidir. tessdata dizini yok, dosya yolu yapılandırması yok. tam dil endeksine ve birçok dil kılavuzuna bakın.
- Async OCR:
await ocr.ReadAsync(input), ASP.NET ve arka plan hizmetleri için engellemeyen belge işleme. asenkron OCR kılavuzuna bakın. - Özel belge tanıma: Pasaportlar, plaka levhaları, MICR çekleri ve el yazısı için yerleşik destek. özel özellikler sayfasına bakın.
- İlerleme izleme:
ocr.Configuration.ProgressCallbackuzun süreli toplu işlerde sayfa başına ilerlemeyi rapor eder. ilerleme takip kılavuzuna bakın.
.NET Uyumluluğu ve Geleceğe Hazırlık
IronOCR, .NET 6, .NET 7, .NET 8, .NET 9 ve .NET Standard 2.0'ı hedef alır - sonuncusu .NET Framework 4.6.2 ve daha sonraki sürümleri kapsar. Çapraz platform desteği, tüm yerel bağımlılıkları NuGet paketine dahil olan Windows (x86 ve x64),Linuxx64, macOS, Azure App Service, AWS Lambda ve Docker'ı kapsar. Platforma özgü herhangi bir yapılandırma gerekli değildir; paket, çalışma zamanında doğru yerel ikili dosyayı seçer. LEADTOOLS, platformlar arası .NET dağıtımını destekler ancak her hedef ortam için platforma özgü çalışma zamanı dosyaları ve ilgili yol yapılandırması gerektirir.Linuxkonteynerleri veya macOS geliştirme makinelerini Windows üretim sunucularıyla hedefleyen ekipler için, IronOCR'un tek paket dağıtımı, platforma özgü yapılandırma katmanını ortadan kaldırarak işleri kolaylaştırır.
Sonuç
LEADTOOLS OCR, 35 yıllık geliştirme geçmişine sahip kapsamlı bir görüntüleme platformu içinde olgun bir teknolojidir. Zaten LEADTOOLS'ü belge görüntüleyiciler, tıbbi görüntüleme veya form tanıma için standart hale getirmiş kuruluşlar için, bu mevcut yatırıma OCR eklemek mantıklı bir karardır - entegrasyon maliyeti zaten ödenmiş ve birleştirilmiş API yüzeyi değer taşır.
Gereksinim resimlerden ve PDF'lerden metin çıkarmak olduğunda hesaplama farklıdır. LEADTOOLS'un dört aşamalı başlatma dizisi, dosya tabanlı lisans dağıtımı, ayrı codec katmanı ve açık motor yaşam döngüsü, OCR doğruluğu veya yeteneğini sağlayan karmaşıklıklar değildir. Bunlar, ekipteki her geliştiricinin anlaması gereken, her dağıtım ortamının uyum sağlaması gereken ve her CI/CD hattının taşımak zorunda olduğu altyapı maliyetleridir. Yanlış paket alımı - PDF modülü olmadan OCR modülü veya LEAD motoru olmadan OmniPage doğruluk katmanı - satın alma yerine üretimde sessiz başarısızlıklarla sonuçlanır.
IronOCR'un tek NuGet paketi, dizi tabanlı lisanslaması ve tek satırlık tanıma yolu, üretim OCR için önemli olan yeteneklerden ödün vermeden bu maliyeti ortadan kaldırır: otomatik ön işleme, yerel PDF desteği, parola korumalı belge işleme, yapılandırılmış çıktı çıkarma, 125+ dil desteği ve iş parçacığı güvenli paralel işleme. Fiyat farkı — süresiz $2,999 ve LEADTOOLS'un çok yıllı lisanslama ve bakım ücretleri — önemli. Bu, tek seferlik bir mühendislik aracı satın alımı ile yıllık bütçe gerekçesi gerektiren sürekli bir abonelik arasındaki farktır.
Açılış problemi — her üretim makinesinde lisans dosyaları, paket karmaşası ve bir karakter okunmadan önce bir başlatma töreni — gerçek dağıtım ve operasyonel maliyetleri yansıtır. Her iki seçeneği değerlendiren ekipler, LEADTOOLS başlatma dizisini konteyner stratejilerine, CI/CD hatlarına ve gizli yönetim yaklaşımlarına karşı test etmelidir. Cevap genellikle kararı netleştirir.
Sıkça Sorulan Sorular
LEADTOOLS OCR nedir?
LEADTOOLS OCR, geliştiriciler ve işletmeler tarafından görüntülerden ve belgelerden metin çıkarmak için kullanılan bir OCR çözümüdür. .NET uygulama geliştirme için IronOCR ile birlikte değerlendirilen birkaç OCR seçeneğinden biridir.
.NET geliştiricileri için IronOCR, LEADTOOLS OCR ile nasıl karşılaştırılır?
IronOCR, IronTesseract'ı temel motoru olarak kullanan bir NuGet yerli .NET OCR kütüphanesidir. LEADTOOLS OCR'ye kıyasla, daha basit bir dağıtım (herhangi bir SDK yükleyici yok), sabit fiyatlandırma ve COM ara yüzde ya da bulut bağımlılıkları olmadan temiz bir C# API sunar.
IronOCR, LEADTOOLS OCR'den daha mı kolay kurulabilir?
IronOCR, tek bir NuGet paketi aracılığıyla yüklenir. SDK kurulumları, kopyalamak için lisans dosyaları, kaydedilecek COM bileşenleri veya yönetilecek ayrı çalışma zamanı ikili dosyaları yoktur. Tüm OCR motoru paket içinde yer alır.
LEADTOOLS OCR ile IronOCR arasında hangi doğruluk farkları vardır?
IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranmış formlar için yüksek tanıma doğruluğu sağlar. Çok kötü durumda olan belgeler ya da nadir yazılar için ise doğruluk, kaynak kalitesine göre değişiklik gösterebilir. IronOCR, düşük kaliteli girişlerde tanımayı geliştirmek için görüntü ön işleme filtreleri içerir.
IronOCR, PDF metin çıkarma desteği sunuyor mu?
Evet. IronOCR, tek bir çağrıda hem yerel PDF'lerden hem de taranmış PDF görüntülerinden metin çıkarır. Çok sayfalı TIFF dosyaları, görüntüler ve akıntılar da desteklenir. Taranmış PDF'ler için, OCR sayfa bazında uygulanır ve her sayfa için sonuç nesneleri sağlanır.
LEADTOOLS OCR lisanslaması ile IronOCR'yi nasıl karşılaştırılır?
IronOCR, sayfa veya tarama başına ücret içermeyen sabit oranlı bir süresiz lisans kullanır. Yüksek belge hacmi işleyen kuruluşlar, hacme rağmen aynı lisans maliyetini öder. Ayrıntılar ve hacim fiyatlandırması IronOCR lisans sayfasında mevcuttur.
IronOCR hangi dilleri destekliyor?
IronOCR, ayrı NuGet dil paketleri aracılığıyla 127 dili destekler. Bir dil eklemek için tek bir 'dotnet add package IronOcr.Languages.{Language}' komutu gerekir. Manuel dosya yerleştirme veya yol yapılandırması gerekmez.
.NET projesine IronOCR'yi nasıl kurarım?
NuGet üzerinden kurun: 'Install-Package IronOcr' Package Manager Console'da veya 'dotnet add package IronOcr' CLI'de. Ek dil paketleri aynı şekilde yüklenir. Yerel SDK kurucusu gerekmez.
IronOCR, LEADTOOLS OCR'den farklı olarak Docker ve konteynerize dağıtımlar için uygun mu?
Evet. IronOCR, NuGet paketi aracılığıyla Docker konteynerlerinde çalışır. Lisans anahtarı, bir ortam değişkeni aracılığıyla ayarlanır. Lisans dosyaları, SDK yolları veya OCR motoru için hacimlerin bağlanmasına gerek yoktur.
LEADTOOLS OCR karşısında IronOCR'yi satın almadan önce deneyebilir miyim?
Evet. IronOCR deneme modu, belgeleri işler ve çıkış üzerine bir filigran eklemeli OCR sonuçları döndürür. Lisans satın almadan önce kendi belgeleriniz üzerinde doğruluğu kontrol edebilirsiniz.
IronOCR, metin çıkarma yanında barkod okuma desteği sunar mı?
IronOCR, metin çıkarma ve OCR'ye odaklanır. Barkod okuma için Iron Software, eşlik eden bir kütüphane olan IronBarcode'u sağlar. Her ikisi de ayrı ayrı veya Iron Suite paketi olarak mevcuttur.
LEADTOOLS OCR'den IronOCR'ye geçiş yapmak kolay mı?
LEADTOOLS OCR'den IronOCR'ye geçiş genellikle başlangıç dizilerini IronTesseract oluşturma ile değiştirmeyi, COM yaşam döngüsü yönetimini kaldırmayı ve API çağrılarını güncellemeyi içerir. Çoğu geçişler, kod karmaşıklığını önemli ölçüde azaltır.

