ABBYY FineReader Engine ile IronOCR: .NET OCR
ABBYY FineReader Engine yillik $10.000 veya daha fazla maliyete sahip olup, SDK erişimi elde etmeden once 4-12 haftalik bir satis sureci gerektirir ve çok bileşenli bir yukleyici araciligiyla kurulur —NuGetyok, dotnet add package yok, ayni gun degerlendirme yok. Standart iş belgesi işleme, fatura çıkarımı veya taranmış form dijitalleştirmesi gerçekleştiren ekipler için ABBYY veIronOCRarasındaki doğruluk farkı yüzde puanının kesirleriyle ölçülür. Fiyat farkı üç yıl içinde on binlerce dolarla ölçülür.
Bu karşılaştırma, ABBYY'nin kıyaslama doğruluğunun bu maliyeti nerede haklı çıkardığını, nerede çıkarmadığını inceler.
ABBYY FineReader Engine'i Anlamak
ABBYY FineReader Engine SDK, ABBYY'nin portföyündeki geliştiriciye yönelik üründür — FineReader PDF'den (masaüstü son kullanıcı uygulaması) ve FineReader Server'dan (toplu otomasyon platformu) farklıdır. SDK, C++, Java ve .NET için programlanabilir OCR API'leri açar. ABBYY, 1989'dan beri OCR teknolojisi geliştirmiştir ve bu üç on yıllık yatırım, tanıma motorunun bozuk belgeleri, karmaşık yazı türlerini ve nadir dilleri ele almasında kendini gösterir.
FineReader Engine SDK'nın Anahtar Mimari Özellikleri:
- Satış kontrollü edinim: Kendinize hizmet satın alma yolu yoktur. Erişim, bir soru formu, yeterlilik araması, teknik danışma, özel teklif ve sözleşme müzakeresi gerektirir. Sorgudan geliştirme erişimine kadar tipik zaman çizelgesi: 4-12 hafta.
- SDK yükleyici,NuGetdeğil: SDK, belirli dizin yollarına ikili dosyalar, dil verileri, çalışma zamanı dosyaları ve lisans dosyaları yerleştiren bir Windows yükleyici yoluyla dağıtılır. Paket yönetimi yerine manuel montaj referansları.
- .NET için COM uyumluluk katmanı: .NET entegrasyonu, C# modern konvansiyonları öncesinde yaşam döngüsü yönetim kalıplarını (açıkça Yarat, Yükle, İşle, Kapat sıraları) taşıyan bir COM uyumluluk katmanı üzerinden çalışır.
- Dosya tabanli lisans yonetimi: Lisanslar, calisma zamaninda belirli yollarda disk uzerinde bulunmasi gereken
.licve.keydosyalari olarak bulunur. Bazi yayimlama modelleri, ag portu konfigürasyonuna sahip ozel bir lisans sunucusu gerektirir. - 190+ dil desteği: ABBYY'nin dil kapsamı, düşük kaynaklı diller ve tarihsel yazılar dahil çoğu alternatifi aşmaktadır.
- Metnin ötesinde belge anlama: FineReader Engine, belge sınıflandırma, akıllı form işleme ve el yazısı (ICR) için Akıllı Karakter Tanıma içerir — Tesseract tabanlı çözümlerde bulunmayan yetenekler.
Motor Başlatma ve Yaşam Döngüsü
ABBYY, herhangi bir tanıma çalışmasına başlamadan önce açık bir başlatma dizisi gerektirir. Motor, geçerli lisans dosyaları ile belirli bir SDK yolundan yüklenmeli, bir tanıma profili seçilmeli ve her belge kabı işlendikten sonra açıkça kapatılmalıdır, aksi takdirde bellek sızıntıları oluşabilir:
using FREngine;
public class AbbyyOcrService : IDisposable
{
private IEngine _engine;
public AbbyyOcrService(string sdkPath, string licensePath)
{
// Step 1: Create engine loader
var loader = new EngineLoader();
// Step 2: Load engine — fails if license files are missing or expired
_engine = loader.GetEngineObject(sdkPath, licensePath);
// Step 3: Select recognition profile
_engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
// Step 4: Configure language data (each language adds deployment complexity)
var langParams = _engine.CreateLanguageParams();
langParams.Languages.Add("English");
}
public string ExtractText(string imagePath)
{
var document = _engine.CreateFRDocument();
try
{
document.AddImageFile(imagePath, null, null);
document.Process(null);
return document.PlainText.Text;
}
finally
{
// Must close — skipping this causes memory leaks
document.Close();
}
}
public void Dispose()
{
_engine = null;
}
}
using FREngine;
public class AbbyyOcrService : IDisposable
{
private IEngine _engine;
public AbbyyOcrService(string sdkPath, string licensePath)
{
// Step 1: Create engine loader
var loader = new EngineLoader();
// Step 2: Load engine — fails if license files are missing or expired
_engine = loader.GetEngineObject(sdkPath, licensePath);
// Step 3: Select recognition profile
_engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
// Step 4: Configure language data (each language adds deployment complexity)
var langParams = _engine.CreateLanguageParams();
langParams.Languages.Add("English");
}
public string ExtractText(string imagePath)
{
var document = _engine.CreateFRDocument();
try
{
document.AddImageFile(imagePath, null, null);
document.Process(null);
return document.PlainText.Text;
}
finally
{
// Must close — skipping this causes memory leaks
document.Close();
}
}
public void Dispose()
{
_engine = null;
}
}
Imports FREngine
Public Class AbbyyOcrService
Implements IDisposable
Private _engine As IEngine
Public Sub New(sdkPath As String, licensePath As String)
' Step 1: Create engine loader
Dim loader = New EngineLoader()
' Step 2: Load engine — fails if license files are missing or expired
_engine = loader.GetEngineObject(sdkPath, licensePath)
' Step 3: Select recognition profile
_engine.LoadPredefinedProfile("DocumentConversion_Accuracy")
' Step 4: Configure language data (each language adds deployment complexity)
Dim langParams = _engine.CreateLanguageParams()
langParams.Languages.Add("English")
End Sub
Public Function ExtractText(imagePath As String) As String
Dim document = _engine.CreateFRDocument()
Try
document.AddImageFile(imagePath, Nothing, Nothing)
document.Process(Nothing)
Return document.PlainText.Text
Finally
' Must close — skipping this causes memory leaks
document.Close()
End Try
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_engine = Nothing
End Sub
End Class
Bu dizileme, tek bir OCR çalışması başlamadan önce gerçekleştirilir. loader.GetEngineObject() cagri, lisans dosyalarini dogrular, calisma zamani ikili dosyalarini SDK yolundan yukler ve tanima motorunu ilklendirir. Yeni bir yayim sunucusunda bu yollardan herhangi biri yanlissa, cagri calisma zamaninda basarisiz olur.
IronOCR'u Anlamak
IronOCR, optimize edilmiş bir Tesseract 5 LSTM motoru üzerinde inşa edilmiş, otomatik ön işleme, yerel PDF desteği ve tek birNuGetpaketi dağıtım modeli sunan ticari bir .NET OCR kütüphanesidir. Araya giren işlemler oluşturmadan, tessdata dizinlerini yönetmeden veya kurumsal satın alımlarla uğraşmadan üretime hazır OCR'a ihtiyaç duyan .NET geliştiricilerini hedefler.
Anahtar özellikler:
- TekNuGetpaket:
dotnet add package IronOcr, OCR motoru, Ingilizce icin dil verileri ve tüm bagimliliklar dahil olmak üzere tüm kutuphaneyi kurar. Yükleyici yok, manuel montaj referansları, çalışma zamanı yol yapılandırması yok. - Otomatik ön işleme: Düşük kaliteli girdilerde otomatik çalışan masa eğriliği düzeltme, gürültü azaltma, kontrast artırma, ikileştirme ve çözünürlük ölçekleme işlemleri. Gerektiğinde açık kontrol mevcuttur.
- Yerel PDF girişi: PDF dosyaları doğrudan dönüştürme veya harici kütüphaneler olmadan yüklenir. Parola korumalı PDF'ler tek bir parametre ile desteklenir.
- String tabanlı lisanslama: Bir lisans anahtarı kodda veya ortam değişkeninden atanır. Dağıtılması gereken lisans dosyaları, yapılandırılacak lisans sunucusu yok.
- Tek paketten çapraz platform: Windows, Linux, macOS, Docker, Azure ve AWS hepsi aynıNuGetreferansından çalışır.
- Tasarim itibariyle es zamanli calisma guvenligi: Ek konfigürasyon gerektirmeksizin birden fazla
IronTesseractornegi ayni anda calisir. - 125+ dilNuGetaraciligiyla: Dil paketleri, herhangi bir bagimlilik gibi paket yoneticisi tarafindan cozumlenen ayriNuGetpaketleri (
IronOcr.Languages.French, vb.) olarak yuklenir.
Özellik Karşılaştırması
| Özellik | ABBYY FineReader Engine | IronOCR |
|---|---|---|
| OCR Doğruluğu | Kıyaslama lideri | Standart belgelerde %95-99 |
| Dil Desteği | 190+ | 125+ |
| Kurulum | SDK yükleyici | dotnet add package IronOcr |
| Lisans Modeli | Enterprise (satış kontrollü) | Kendinize hizmet, $749-$2,999 süresiz |
| PDF Desteği | Evet | Evet (yerel) |
| Aranabilir PDF Çıktısı | Evet | Evet |
| Platformlar | Windows, Linux, macOS | Windows, Linux, macOS, Docker, Azure, AWS |
Detayli Özellik Karsilastirmasi
| Özellik | ABBYY FineReader Engine | IronOCR |
|---|---|---|
| Edinim | ||
| Satın alma yolu | Satışla iletişime geçmek gerekiyor | Kendinize hizmet NuGet |
| İlk OCR sonucuna kadar geçen süre | 4-12 hafta (satın alma) | Dakikalar |
| Ücretsiz deneme | Satış katılımı gerektirir | Ücretsiz indirme |
| Fiyatlandırma | ||
| Geliştirme lisansı | $4.999 - $15.000+ (tahmini) | $749 - $2.999 (süresiz) |
| Çalışma zamanı ücretleri | Sunucu başına veya sayfa başına | Dahil |
| Yıllık bakım | Lisans maliyetinin %20-25'i | Opsiyonel |
| Entegrasyon | ||
| Paket yönetimi | SDK yükleyici (NuGet değil) | NuGet |
| .NET entegrasyonu | COM uyumluluk | Yerel .NET |
| Lisans yönetimi | Dosya tabanlı (.lic + .key dosyaları) | String anahtar |
| Lisans sunucusu | Bazı modeller için gereklidir | Gerekli değil |
| Bir resmi OCR'a çevirmek için satırlar | 15-25 satır | 1-3 satır |
| Tanıma | ||
| OCR doğruluğu | Kıyaslama lideri | Standart belgelerde %95-99 |
| Diller | 190+ | 125+ |
| El yazısı (ICR) | Evet | Sınırlı |
| Belge sınıflandırma | Evet | Hayır |
| Form tanıma | Evet (şablonlar) | Temel |
| Barkod okuma | Evet | Evet (yerleşik) |
| Tablo çıkarımı | Evet | Evet |
| PDF girdisi | Evet | Evet (yerel) |
| Parola korumalı PDF | Evet | Evet |
| Aranabilir PDF çıktısı | Evet | Evet |
| PDF/A çıktısı | Evet | Hayır |
| Önişleme | ||
| Otomatik önişleme | Profil tabanlı | Evet (otomatik + manuel kontrol) |
| Yamultmayı düzelt | Evet | Evet |
| Gürültü giderme | Evet | Evet |
| Çözünürlük iyileştirme | Evet | Evet |
| Dağıtım | ||
| Çok platformlu | Windows, Linux, macOS | Windows, Linux, macOS |
| Docker | Karmaşık (çalışma zamanı dosyaları) | Standart |
| Azure dağıtımı | Destekleniyor (yerel model) | Doğrudan |
| İzole ortamlar | Evet | Evet |
Doğruluk vs. Maliyet
ABBYY veIronOCRkarşılaştırmasının merkezi sorusu: ABBYY'nin doğruluk avantajı, toplam sahip olma maliyetinin 10-20 kat daha yüksek olduğunu haklı çıkartır mı?
ABBYY Yaklaşımı
ABBYY'nin tanıma motoru, en zor belge türlerinde üst düzey doğruluk sunar: bozulmuş tarihi taramalar, karmaşık yazı karakterleri içeren belgeler, el yazısı, karmaşık form düzenleri ve fiziksel durumu kötü belgeler. DocumentConversion_Accuracy profili, ABBYY'nin tam tanima hattini uygular:
using FREngine;
// ABBYY: Load high-accuracy profile for difficult documents
var loader = new EngineLoader();
var engine = loader.GetEngineObject(
@"C:\Program Files\ABBYY SDK\FineReader Engine\Bin",
@"C:\Program Files\ABBYY SDK\License"
);
engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
var document = engine.CreateFRDocument();
try
{
document.AddImageFile("difficult-scan.jpg", null, null);
document.Process(null);
var text = document.PlainText.Text;
}
finally
{
document.Close();
}
using FREngine;
// ABBYY: Load high-accuracy profile for difficult documents
var loader = new EngineLoader();
var engine = loader.GetEngineObject(
@"C:\Program Files\ABBYY SDK\FineReader Engine\Bin",
@"C:\Program Files\ABBYY SDK\License"
);
engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
var document = engine.CreateFRDocument();
try
{
document.AddImageFile("difficult-scan.jpg", null, null);
document.Process(null);
var text = document.PlainText.Text;
}
finally
{
document.Close();
}
Imports FREngine
' ABBYY: Load high-accuracy profile for difficult documents
Dim loader As New EngineLoader()
Dim engine = loader.GetEngineObject(
"C:\Program Files\ABBYY SDK\FineReader Engine\Bin",
"C:\Program Files\ABBYY SDK\License"
)
engine.LoadPredefinedProfile("DocumentConversion_Accuracy")
Dim document = engine.CreateFRDocument()
Try
document.AddImageFile("difficult-scan.jpg", Nothing, Nothing)
document.Process(Nothing)
Dim text = document.PlainText.Text
Finally
document.Close()
End Try
El yazısı notlara sahip tıbbi kayıtlar, on yıllarca fiziki yıpranmış yasal belgeler veya mikrofilmden dijitalleştirilmiş devlet arşivleri için, ABBYY'nin modern Tesseract tabanlı çözümler üzerindeki doğruluk avantajı ölçülebilir ve önemlidir.
IronOCR Yaklaşımı
IronOCR, otomatik önişleme sayesinde standart iş belgelerinde %95-99 doğruluk elde eder — faturalar, makbuzlar, sözleşmeler, formlar, taranmış raporlar — Tesseract 5 LSTM motoru görüntüyü görmeden önce en yaygın doğruluk katillerini düzeltir:
using IronOcr;
// IronOCR: Otomatik önişleme handles most real-world document quality issues
var ocr = new IronTesseract();
var result = ocr.Read("invoice-scan.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;
// IronOCR: Otomatik önişleme handles most real-world document quality issues
var ocr = new IronTesseract();
var result = ocr.Read("invoice-scan.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' IronOCR: Otomatik önişleme handles most real-world document quality issues
Dim ocr As New IronTesseract()
Dim result = ocr.Read("invoice-scan.jpg")
Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")
Girdi kalitesi gerçekten kötüyse, açık önişleme filtreleri tam kontrol sağlar:
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct rotation up to several degrees
input.DeNoise(); // Remove scanner noise and artifacts
input.Contrast(); // Enhance text/background separation
input.Binarize(); // Convert to optimal black/white
input.EnhanceResolution(300); // Scale to 300 DPI for engine
var result = new IronTesseract().Read(input);
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct rotation up to several degrees
input.DeNoise(); // Remove scanner noise and artifacts
input.Contrast(); // Enhance text/background separation
input.Binarize(); // Convert to optimal black/white
input.EnhanceResolution(300); // Scale to 300 DPI for engine
var result = new IronTesseract().Read(input);
Imports IronOcr
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct rotation up to several degrees
input.DeNoise() ' Remove scanner noise and artifacts
input.Contrast() ' Enhance text/background separation
input.Binarize() ' Convert to optimal black/white
input.EnhanceResolution(300) ' Scale to 300 DPI for engine
Dim result = New IronTesseract().Read(input)
End Using
görüntü kalitesi düzeltme rehberi, her filtreyi ve tanıma doğruluğu üzerindeki etkilerini kapsar. İş belgeleri iş akışlarının %99'unda — faturalar, sipariş emirleri, sözleşmeler, kimlik belgeleri, basılmış formlar — IronOCR'un önişlenmiş Tesseract 5 motoru, pratikte ABBYY'den ayırt edilemez doğruluk üretir. Kalan %1 dejenere el yazısı, tarihi belgeler veya ABBYY'nin lider konumunu anlamlı kılan niş yazı kombinasyonlarını içerir.
Kurulum Karmaşıklığı: SDK Yükleyici vs. NuGet
ABBYY veIronOCRarasındaki kurulum farkı küçük bir rahatsızlık değildir. Bir geliştiricinin OCR'ı öğleden sonra değerlendirebilip değerlendiremeyeceğini veya satın alma döngüsünün geçmesini beklemesi gerekip gerekmediğini belirler.
ABBYY Yaklaşımı
ABBYY FineReader Engine yüklemesi, lisanslama onaylandıktan sonra bu sırayı izler:
ABBYY SDK yükleyicisini çalıştırdıktan sonra yükleme yapısı:
C:\Program Files\ABBYY SDK\
├── FineReader Engine\
│ ├── Bin\ ← SDK ikili dosyaları (manuel montaj referansı gerekli)
│ ├── Inc\ ← Başlık dosyaları
│ ├── Lib\ ← Kütüphaneler
│ └── License\ ← Lisans dosyaları (ABBYY.lic + ABBYY.key)
└── Runtime\
├── Languages\ ← Dil veri dosyaları (büyük, dağıtılmalı)
└── Dictionaries\ ← Sözlük dosyaları (dağıtılmalı)
Her dağıtım hedefi — geliştirici çalışma istasyonu, yapı sunucusu, öncü ortam, üretim sunucusu — yönetici ayrıcalıklarıyla bu yükleyicinin çalışmasını gerektirir. Lisans dosyaları her makinede beklenen yollarda bulunmalıdır.Dockerkonteynerlerinde bu, SDK'nın özel bir temel görüntüye eklenmesi veya bir hacim olarak monte edilmesi anlamına gelir, her ikisi de önemli altyapı çalışması gerektirir.
Çalışma zamanında lisans doğrulaması dosya varlığını ve geçerliliğini kontrol eder. .lic dosyasi eksikse, loader.GetEngineObject() cagri başlangicta hata verir. Lisans suresi dolmussa, ayni basarisizlik uretim ortaminda meydana gelir.
IronOCR Yaklaşımı
dotnet add package IronOcr
dotnet add package IronOcr
Bu komut her şeyi halleder: OCR motoru, İngilizce dil verileri ve geçerli platform için tüm yerel ikili bağımlılıklar. Çapraz platform hedefleri aynı pakette yer alır. BirDockerdağıtımı özel temel görüntü gerektirmez:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
Lisans aktivasyonu başlangıç kodunda tek satırdır:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
Kopyalanacak dosya yok, yapılandırılacak yollar yok, bakımı yapılacak lisans sunucusu yok. Tam Docker yayim kılavuzu, libgdiplus gerekliligi de dahil olmak üzere Linux konteyneri ozeliklerini kapsar. AynıNuGetpaketi Azure, AWS Lambda ve Linux sunucuları için aynı şekilde dağıtılabilir.
PDF İşleme
Her iki kütüphane de PDF belgelerini işler, ancak uygulama karmaşıklıkları önemli ölçüde farklılık gösterir.
ABBYY Yaklaşımı
ABBYY PDF işleme, PDF'nin ayri bir CreatePDFFile() nesnesi araciligiyla acilmasini, sayfalarin yinelemesini, her sayfanin bir doküman konteynerine eklenmesini, tanima gecisinin yapilmasini ve sonra ayarlanmis ihrac parametreleri ile ihracin yapilmasini gerektirir:
using FREngine;
public string ProcessPdf(string pdfPath)
{
var document = _engine.CreateFRDocument();
try
{
// Open PDF through a separate file object
var pdfFile = _engine.CreatePDFFile();
pdfFile.Open(pdfPath, null, null);
// Add each page individually
for (int i = 0; i < pdfFile.PageCount; i++)
{
document.AddImageFile(
pdfPath,
null,
_engine.CreatePDFExportParams()
);
}
document.Process(null);
return document.PlainText.Text;
}
finally
{
document.Close();
}
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
var document = _engine.CreateFRDocument();
try
{
document.AddImageFile(inputPath, null, null);
document.Process(null);
// Configure export parameters before export
var exportParams = _engine.CreatePDFExportParams();
exportParams.Scenario = PDFExportScenarioEnum.PDES_Balanced;
document.Export(outputPath, FileExportFormatEnum.FEF_PDF, exportParams);
}
finally
{
document.Close();
}
}
using FREngine;
public string ProcessPdf(string pdfPath)
{
var document = _engine.CreateFRDocument();
try
{
// Open PDF through a separate file object
var pdfFile = _engine.CreatePDFFile();
pdfFile.Open(pdfPath, null, null);
// Add each page individually
for (int i = 0; i < pdfFile.PageCount; i++)
{
document.AddImageFile(
pdfPath,
null,
_engine.CreatePDFExportParams()
);
}
document.Process(null);
return document.PlainText.Text;
}
finally
{
document.Close();
}
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
var document = _engine.CreateFRDocument();
try
{
document.AddImageFile(inputPath, null, null);
document.Process(null);
// Configure export parameters before export
var exportParams = _engine.CreatePDFExportParams();
exportParams.Scenario = PDFExportScenarioEnum.PDES_Balanced;
document.Export(outputPath, FileExportFormatEnum.FEF_PDF, exportParams);
}
finally
{
document.Close();
}
}
Imports FREngine
Public Function ProcessPdf(ByVal pdfPath As String) As String
Dim document = _engine.CreateFRDocument()
Try
' Open PDF through a separate file object
Dim pdfFile = _engine.CreatePDFFile()
pdfFile.Open(pdfPath, Nothing, Nothing)
' Add each page individually
For i As Integer = 0 To pdfFile.PageCount - 1
document.AddImageFile(pdfPath, Nothing, _engine.CreatePDFExportParams())
Next
document.Process(Nothing)
Return document.PlainText.Text
Finally
document.Close()
End Try
End Function
Public Sub CreateSearchablePdf(ByVal inputPath As String, ByVal outputPath As String)
Dim document = _engine.CreateFRDocument()
Try
document.AddImageFile(inputPath, Nothing, Nothing)
document.Process(Nothing)
' Configure export parameters before export
Dim exportParams = _engine.CreatePDFExportParams()
exportParams.Scenario = PDFExportScenarioEnum.PDES_Balanced
document.Export(outputPath, FileExportFormatEnum.FEF_PDF, exportParams)
Finally
document.Close()
End Try
End Sub
IronOCR Yaklaşımı
IronOCR, PDF girdisini yerel olarak işler — sayfa yinelemesi yok, ayrı dosya nesneleri yok, içe aktarım parametre yapılandırması yok:
using IronOcr;
// Read any PDF — multi-page handled automatically
using var input = new OcrInput();
input.LoadPdf("scanned-document.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
//Parola korumalı PDF— one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("encrypted.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Create searchable PDF — one method call
var ocrResult = new IronTesseract().Read("scanned.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
using IronOcr;
// Read any PDF — multi-page handled automatically
using var input = new OcrInput();
input.LoadPdf("scanned-document.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
//Parola korumalı PDF— one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("encrypted.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Create searchable PDF — one method call
var ocrResult = new IronTesseract().Read("scanned.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
' Read any PDF — multi-page handled automatically
Using input As New OcrInput()
input.LoadPdf("scanned-document.pdf")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' Parola korumalı PDF— one parameter
Using secureInput As New OcrInput()
secureInput.LoadPdf("encrypted.pdf", Password:="secret")
Dim secureResult = New IronTesseract().Read(secureInput)
End Using
' Create searchable PDF — one method call
Dim ocrResult = New IronTesseract().Read("scanned.pdf")
ocrResult.SaveAsSearchablePdf("searchable-output.pdf")
arama yapılabilir PDF rehberi, mevcut PDF taramalarında metin katmanını yerleştirme dahil çıktı seçeneklerini kapsar. PDF OCR örneği, sayfa başına sonuç erişimi ile çok sayfalı işlemeyi gösterir.
Fiyatlandırma Modeli
Fiyat karşılaştırması, ABBYY veIronOCRkararı için birçok geliştirme ekibi için en net hale gelir.
ABBYY Yaklaşımı
ABBYY fiyatlandırmayı halka açık yayınlamaz. Tüm rakamlar için satış katılımı gereklidir. Endüstri raporları ve geliştirici topluluk tartışmalarına dayanmaktadır:
- Geliştirme lisansı: 4.999 $ - 15.000 $+ (tahmini)
- Çalışma zamanı lisanslama: sunucu başına (5.000-$20.000/yıl) veya sayfa başına (sayfa başına 0.01 $ - 0.10 $, hacim bağlı)
- Yıllık bakım: lisans maliyetinin %20-25'i/yıl
- Profesyonel hizmetler: 200-400 $/saat
100.000 sayfa/ay işleyen orta büyüklükte bir ekip, tek bir üretim sunucusunda, üç yıllık sahip olma maliyetinin 50.000 $'ın üzerinde olduğu tahmin edilen bir durum ile karşı karşıyadır — geliştirme lisansı artı çalışma zamanı lisanslama artı yıllık bakım ücretleri.
Sayfa başına lisanslama modeli, ölçek ekonomisinde maliyet getirir. Sayfa başına 0.01 $ ile 100.000 sayfa/ay, bu 1.000 $/ay değişken maliyet veya 12.000 $/yıl, üst sınır yok.
IronOCR Yaklaşımı
IronOCR lisanslama sürekli ve yayımlanmıştır:
- Lite: 749 $ (1 geliştirici, 1 proje)
- Plus: 1.499 $ (3 geliştirici, 3 proje)
- Professional: 2.999 $ (10 geliştirici, 10 proje)
- Unlimited: 5.999 $ (sınırsız geliştirici ve proje)
Çalışma zamanı ücreti yok. Sayfa başına maliyet yok. Yıllık bakım gereksinimi yok. Yenileme döngüsü yok. $2.999'daki Professional lisansı, herhangi bir sayıda sunucuda belge işleme hacmini veya geliştirici hacmini kapsar, sürekli olarak.
Orta büyüklükteki ekip senaryosunun üç yıllık TCO karşılaştırması: ABBYY, 50.000 $'ın üzerinde tahmin edilir,IronOCRProfessional, 2.999 $. Standart iş belgelerinde onları ayıran doğruluk marjı, çoğu kullanım durumu için bu boşluğu kapatmaz.
API Eslestirme Referansi
| ABBYY FineReader Engine | IronOCREşdeğeri |
|---|---|
new EngineLoader() |
Gerekli değil |
loader.GetEngineObject(sdkPath, licensePath) |
new IronTesseract() |
engine.LoadPredefinedProfile("...") |
Gerekli değil (otomatik) |
engine.CreateLanguageParams() |
ocr.Language = OcrLanguage.English |
langParams.Languages.Add("French") |
ocr.AddSecondaryLanguage(OcrLanguage.French) |
engine.CreateFRDocument() |
new OcrInput() |
engine.CreateFRDocumentFromImage(path, null) |
input.LoadImage(path) veya ocr.Read(path) |
document.AddImageFile(path, null, null) |
input.LoadImage(path) |
engine.CreatePDFFile() sonra pdfFile.Open(...) |
input.LoadPdf(path) |
document.Process(null) |
ocr.Read(input) |
document.PlainText.Text |
result.Text |
frDocument.Pages[i].PlainText.Text |
result.Pages[i].Text |
page.Layout.Blocks ile BT_Table kontrolu |
result.Lines, result.Words |
block.GetAsTableBlock() |
result.Pages yapılandırilmis veri |
engine.CreatePDFExportParams() |
Gerekli değil |
document.Export(path, FEF_PDF, params) |
result.SaveAsSearchablePdf(path) |
document.Close() |
using deseni (otomatik) |
| Disk yollarındaki lisans dosyaları | IronOcr.License.LicenseKey = "key" |
engine.GetLicenseInfo() |
IronOcr.License.IsValidLicense |
Tam IronTesseract sınıf dokümantasyonu icin IronOCR API referansina bakin.
Ekiplerin ABBYY FineReader Engine'den IronOCR'a Geçmeyi Düşündüğü Durumlar
Lisans Yenileme Bir Maliyet-Fayda İncelemesi Tetiğine Basar
ABBYY için yıllık bakım faturaları genellikle her yıl orijinal lisans maliyetinin %20-25'i aralığında gelir. $10.000'lik bir geliştirme lisansı ve çalışma zamanı lisanslaması için $15.000 ödeme yapmış bir ekip için, ikinci yıl ise bir $6.250 bakım faturası getirir, daha yeni bir kod satırı yazılmadan önce. Bu yenileme anı, ekiplerin özel belge türlerindeki (genellikle standart iş belgeleri) doğruluk farkının devam eden maliyeti haklı çıkarıp çıkarmadığını sormasına neden olur. Fatura işleme, sözleşme dijitalleştirme veya taranmış form çıkarımı işleten ekipler, genellikle IronOCR'un önişlenmiş Tesseract 5 motorunun eşdeğer pratik doğruluk sağladığını bulur, maliyeti yüzlerce dolarla ölçülen bir fiyatla on binlerce dolarlık maliyet yerine.
Mevcut ABBYY İlişkisi Olmadan Yeni Proje
Sıfırdan yeni bir OCR projesi başlatan geliştirme ekipleri satın alma gerçeğiyle karşı karşıyadır: ABBYY SDK erişimi elde etmek için 4-12 hafta geçmesi demektir, bu da 4-12 haftalık geliştirme engeli anlamına gelir. Bir prototip son teslim tarihi veya bir sprint taahhüdü olan bir ekip için, o satın alma döngüsü bir seçenek değil.IronOCRbir dakika altında kurulur ve aynı gün OCR sonuçları üretir. Yeni bir ürün için OCR değerlendiren ekipler genellikle ABBYY yetenekten yoksun olduğu için değil, satış döngüsü bekleyecek zamanları olmadığı için IronOCR'u seçer.
Dağıtım Altyapısını Modernize Etmek
ABBYY'nin COM birlikte çalışabilirlik katmanı üzerine inşa edilen uygulamalar, konteynerlere, Kubernetes'e veya bulut-yerel mimarilere taşınırken sürtünme ile karşı karşıya kalır. SDK yükleyici, lisans dosyası bağımlılıkları, çalışma zamanı dizin yapısı — bunların hiçbiri, standart .NET temel görüntüsünden oluşturulmuş birDockergörüntüsüne sıralı bir şekilde uymaz. Ekipler, eski bir belge işleme uygulamasını çevreleyip bir konteyner haline getirirken, ABBYY'nin dağıtım modelinin, tam SDK kurulumunu içeren özel bir temel imaj gerektirdiğini veya lisans dosyaları için işlem karmaşıklığı getiren birim montajı gerektirdiğini fark eder. IronOCR'ninNuGetpaketi, libgdiplus eklenmesi disinda temel imajda bir değişiklik yapmadan herhangi bir konteynere yayilir.
Küçük Ekiplerde Bütçe Kısıtlamaları
Girişimler, bağımsız yazılım satıcıları ve dahili araç takımları sık sık ABBYY'nin yeteneklerini değerlendirir ve onları gerçekçi bulur – daha sonra fiyatların kurumsal düzeyde bütçe onayı gerektirdiğini keşfederler. Orta ölçekli bir şirket için bir fatura işleme aracı oluşturan bir takım, yıllık yazılım bütçeleri toplamı 20,000 $ olduğunda, 15,000 $ geliştirme lisansı artı 10,000 $/yıl çalışma zamanı ücretlerini haklı çıkaramaz. IronOCR'un 749 $ Lite lisansı veya 2,999 $ Professional lisansı, tek bir mühendisin kendi inisiyatifi ile yapabileceği bir satın alma hakkına uyar.
Büyüyen Belge Hacmi, Sayfa Başına Maliyet Yapısını Ortaya Çıkartıyor
Küçük başlayan ve büyüyen uygulamalar, sayfa başına ABBYY lisansı ile bir duvara çarpar. Bir girişim, başlama esnasında ayda 10,000 belge işliyor ve iki yıl içinde ayda 500,000'e ölçekleniyor. 0,01 $/sayfa, bu büyüme yörüngesi ABBYY maliyetlerini yönetilebilir olmaktan çıkarır ve bütçe belirleyici hale getirir. IronOCR'un sürekli lisansı, sayfa başına bileşeni içermiyor — 10,000 belge veya 10,000,000 belge işlemek aynı maliyete sahiptir.
Genel Geçiş Dusunceleri
Motor Yaşam Döngüsü Yönetiminin Değiştirilmesi
En zaman alıcı geçiş işi, ABBYY'nin açık dışa bağımlılık ve yaşam döngüsü kodunun kaldırılmasını içerir. Her loader.GetEngineObject(), LoadPredefinedProfile() ve document.Close() cagrisini siler. IronOCR'nin IronTesseract, yukleyici olmadan dogrudan ilklendirir, profil yukleme yapmaz ve standart using deseni araciligiyla otomatik temizleme yapar. Temel metin çıkarma desenleri için tipik geçiş çabası 2-4 saattir:
// Remove all of this:
// var loader = new EngineLoader();
// _engine = loader.GetEngineObject(sdkPath, licensePath);
// _engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
// var document = _engine.CreateFRDocument();
// document.AddImageFile(imagePath, null, null);
// document.Process(null);
// string text = document.PlainText.Text;
// document.Close();
// Replace with:
var text = new IronTesseract().Read(imagePath).Text;
// Remove all of this:
// var loader = new EngineLoader();
// _engine = loader.GetEngineObject(sdkPath, licensePath);
// _engine.LoadPredefinedProfile("DocumentConversion_Accuracy");
// var document = _engine.CreateFRDocument();
// document.AddImageFile(imagePath, null, null);
// document.Process(null);
// string text = document.PlainText.Text;
// document.Close();
// Replace with:
var text = new IronTesseract().Read(imagePath).Text;
Imports IronOcr
Dim text As String = New IronTesseract().Read(imagePath).Text
Lisans Altyapısının Kaldırılması
Geçişten sonra, dağıtım hattı önemli ölçüde basitleşir. ABBYY SDK kurulum adimi CI/CD betiklerinden cikartilir. Lisans dosyalari (ABBYY.lic, ABBYY.key) dağıtim eserlerinden kaldirilir. Bir lisans sunucusu çalışıyorsa, o altyapı emekliye ayrılabilir.IronOCRlisans anahtarı, bir ortam değişkeninde veya gizlilik yöneticisinde bulunur — dosya, sunucu veya lisans doğrulama için ağ bağımlılığı yoktur. IronTesseract yapılandırma kılavuzu çeşitli dağıtım ortamları için ilk yapılandırma ve lisans anahtarının nasıl yerleştirileceğini kapsar.
Bölge Tabanlıdan Bölgeye Dayalı Çıkarma
ABBYY'nin bolge tabanli bolge cikarma (_engine.CreateZone(), zone.SetBounds(), zone.Type = ZoneTypeEnum.ZT_Text, page.Zones.Add(zone)) yöntemi, IronOCR'nin CropRectangle yaklasimina eslenir. Kavramlar eşdeğerdir; API daha basittir:
// ABBYY zone-based extraction required zone creation,
// bounds setting, type assignment, and page.Zones.Add()
// IronOCR: CropRectangle passed directly to LoadImage
var region = new CropRectangle(x: 0, y: 0, width: 600, height: 100);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
// ABBYY zone-based extraction required zone creation,
// bounds setting, type assignment, and page.Zones.Add()
// IronOCR: CropRectangle passed directly to LoadImage
var region = new CropRectangle(x: 0, y: 0, width: 600, height: 100);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
Imports IronOcr
' ABBYY zone-based extraction required zone creation,
' bounds setting, type assignment, and page.Zones.Add()
' IronOCR: CropRectangle passed directly to LoadImage
Dim region As New CropRectangle(x:=0, y:=0, width:=600, height:=100)
Using input As New OcrInput()
input.LoadImage("invoice.jpg", region)
Dim headerText As String = New IronTesseract().Read(input).Text
End Using
bolge tabanli OCR kılavuzu, faturalar ve form işlemekte yaygin olan alan cikarma desenleri icin CropRectangle kullanimi kapsar.
Yapılandırılmış Veri Erişimi
ABBYY'nin blok tabanli yapılandırilmis veri erişimi (page.Layout.Blocks, BlockTypeEnum.BT_Table, block.GetAsTableBlock()), IronOCR'de dogrudan bire bir esdegerine sahip degildir. IronOCR, her biri koordiant verileriyle result.Pages, result.Lines, result.Words ve result.Paragraphs araciligiyla yapılandırilmis sonuclar sunar. Özellikle tablo çıkarma için, sonuçları okuma kılavuzu, tablo yeniden yapılandırmasına imkan veren kelime seviyesi konumlama verilerine erişimi kapsar.
IronOCR'un Ek Yetenekleri
Yukarıdaki temel karşılaştırma alanlarının ötesinde:
- OCR sirasinda barkod okuma: Metin tanima ile ayni geciste 1D ve 2D barkodlari tespit edip cozmek icin
ocr.Configuration.ReadBarCodes = trueetkinlestirin, cikarilan metin yaninda barkod degerlerini dogrudan geri doner — ayri bir barkod kutuphanesi gerekmez. - 125+ dilNuGetaracılığıyla: Dil paketleri standartNuGetpaketleri olarak kurulur. Birincil ve ikincil diller kodla yapılandırılır. dil indeksi, mevcut dil paketlerinin tümünü listeler.
- Guven skoru verme:
result.Confidence, tam sonuc icin tanima guveni yuzdesini doner. Kelime bazli guvenresult.Wordsaraciligiyla secici doğrulama is akislari icin erisilebilir. - Asenkron OCR:
IronTesseract, cagri ipliklerini engellemeden ASP.NET uygulamalari ve yuksek verim pipeline'lari icin asenkron işlem desenlerini destekler. - İlerleme takibi: Uzun süreli toplu işlemler, masaüstü uygulamalarında ilerleme çubuğu entegrasyonunu ve arka plan hizmetlerinde durum raporlamayı sağlayan ilerleme olayları yüzeye çıkarır.
- hOCR ihraci:
result.SaveAsHocrFile(), konuma-duyarli OCR sonuclarini tuketen belge yonetim sistemleri ile entegrasyon icin HOCR formatini cikarir. - Özel belge tanıma: Pasaport MRZ, plaka yazıları, MICR çek satırları ve el yazısı içerikler, konfigürasyon ve beklenen doğruluğu kapsayan özel kılavuzlarına sahiptir.
.NET Uyumlulugu ve Gelecek Hazirikligi
IronOCR, .NET 6, .NET 7, .NET 8 ve .NET 9'u hedefler ve her yeni .NET sürümünü aktif olarak takip eder. Ayrıca modern .NET'e henüz göç etmemiş projeler için .NETStandart2.0'ı destekler.ABBYY FineReader EngineSDK, .NET Framework'ü ve modern .NET'i kendi COM birlikte çalışabilirlik katmanı aracılığıyla destekler, ancak COM bağımlılığı, ABBYY'yi COM birlikte çalışabilirliği bulunmadığında çalışmayı engelleyen zorlu bir sınırlamadır — belirli Linux yapılandırmaları, daraltılmış dağıtımlar ve IronOCR'un doğal .NET mimarisinin sorunsuz ele aldığı Yerli AOT senaryoları. IronOCR'un tek paketli dağıtım modeli, modern .NET gelişiminin aldığı yönle uyumlu:NuGetyönetimli bağımlılıklar, konteyner dostu dağıtım ve bir kod tabanından platform bağımsızlığı.
Sonuç
ABBYY FineReader Engine, OCR'de doğruluk standartı olarak kabul edilir. Bu ifade doğrudur ve açıkça yapılmaya değer. Tanıma hatalarının klinik sonuçlar taşıdığı tıbbi belge dijitalleştirmesinde, belgenin bütünlüğünün denetime tabi olduğu yasal incelemelerde veya el yazması tarihsel belgeleri işleyen arşiv projelerinde, ABBYY'nin modern Tesseract tabanlı çözümler üzerindeki avantajı gerçektir ve önemlidir. Bu kullanım durumları vardır ve bunlar için ABBYY'nin maliyeti ve karmaşıklığı haklıdır.
Sorun şu ki, bu kullanım durumları .NET geliştiricilerinin aslında oluşturduğu OCR çalışmalarının küçük bir kısmını oluşturur. Gerçek dünya OCR projelerinin büyük kısmı — fatura işleme, sözleşme dijitalleştirme, taranmış form çıkarma, fiş ayıklama, kimlik belgesi okuma — makul şekilde temiz belgelerde basılmış metni içerir. Bu belgelerde,IronOCRotomatik ön işlemeyle %95-99 doğruluk sağlar veIronOCRile ABBYY arasında üretim çıktısında algılanabilir pratik bir fark yoktur. $47,000+ üç yıllık maliyet farkı, uygulamanın kullanıcıya asla göstermediği marjinal bir doğruluk avantajı satın alır.
Kurulum sürtünmesi eşit derecede orantısızdır. Yeni bir proje için OCR değerlendirmesi yapan bir geliştirici bir paketi kurabilmeli, on satır kodu yazabilmeli ve sonuçları görebilmelidir. ABBYY, tek bir OCR kod satırı çalışmadan önce haftalar alan bir satış katılımı gerektirir. Bu, uygulama desteği ve SLA taahhütleri olan $50,000'lık kurumsal bir sözleşme için doğru modeldir. Prototip, yineleme ve sevkiyat yapması gereken bir geliştirme takımı için yanlış modeldir.
IronOCR $749 sürekli lisansla başlamaktadır, bir komutla kurulur ve standart iş belgelerinde herhangi bir ön işleme konfigürasyonu veya lisans dosyası yönetimi gerektirmeden doğru OCR sonuçları üretir. ABBYY'nin zor belge türlerindeki belirli doğruluk avantajları katı bir gereklilik olmadığında ekipler için — ki bu çoğu ekiptir — bu, pratik bir seçimdir.
Sıkça Sorulan Sorular
ABBYY FineReader Engine nedir?
ABBYY FineReader Engine, 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çeneklerinden biridir.
IronOCR, .NET geliştiricileri için ABBYY FineReader Engine ile nasıl karşılaştırılır?
IronOCR, çekirdek motor olarak IronTesseract'ı kullanan, NuGet yerel bir .NET OCR kütüphanesidir. ABBYY FineReader Engine ile karşılaştırıldığında, daha basit dağıtım (SDK yükleyicileri yok), sabit fiyatlandırma ve COM interop veya bulut bağımlılıkları olmadan temiz bir C# API sunar.
IronOCR, ABBYY FineReader Engine'den daha kolay kurulabilir mi?
IronOCR, tek bir NuGet paketi aracılığıyla yüklenir. SDK yükleyicileri, kopyalama lisans dosyaları, COM bileşenlerini kaydetme veya yönetim gerektiren ayrı runtime ikili dosyalar yoktur. Tüm OCR motoru pakede dahil edilmiştir.
ABBYY FineReader Engine ve IronOCR arasında ne gibi doğruluk farklılıkları vardır?
IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranan formlar için yüksek tanıma doğruluğu sağlar. Çeşitli kaynak kalitesine bağlı olarak son derece kötü belgeler veya alışılmadık yazılar için doğruluk değişkenlik gösterebilir. IronOCR, düşük kaliteli girdiler üzerinde tanımayı iyileştirmek için görüntü ön işleme filtrelerini içerir.
IronOCR, PDF metin çıkarımını destekler mi?
Evet. IronOCR, hem yerel PDF'lerden hem de taranan PDF görüntülerinden metin çıkarır. Ayrıca çoklu sayfa TIFF dosyalarını, görüntüleri ve akışları destekler. Taranan PDF'ler için, sayfa başına sonuç nesneleri ile sayfa sayfa OCR uygulanır.
ABBYY FineReader Engine lisanslaması, IronOCR ile nasıl karşılaştırılır?
IronOCR, sayfa başına veya tarama başına ücretler olmaksızın sabit ücretli bir sürekli lisans kullanır. Yüksek hacimli belge işleyen kuruluşlar, hacme bakılmaksızın aynı lisans maliyetini öder. Detaylar ve hacim fiyatlandırması IronOCR lisans sayfasında yer alır.
IronOCR hangi dilleri destekler?
IronOCR, ayrı NuGet dil paketleri aracılığıyla 127 dil destekler. Bir dil eklemek, tek bir 'dotnet add package IronOcr.Languages.{Language}' komutu gerektirir. Manuel dosya yerleştirme veya yol yapılandırması gerekmez.
IronOCR'ü bir .NET projesine nasıl kurarım?
NuGet üzerinden kurulum: Paket Yöneticisi Konsolunda 'Install-Package IronOcr' veya CLI'da 'dotnet add package IronOcr'. Ek dil paketleri aynı şekilde kurulur. Yerel SDK yükleyici gerekmez.
IronOCR, ABBYY FineReader aksine Docker ve konteynerize edilmiştir 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. OCR motoru için lisans dosyaları, SDK yolları veya hacim montajları gerekmez.
IronOCR, ABBYY FineReader'a kıyasla satın almadan önce denenebilir mi?
Evet. IronOCR deneme modu, belgeleri işler ve çıktıda filigranla kaplanmış OCR sonuçları döndürür. Lisans satın almadan önce kendi belgelerinizde doğruluğu doğrulayabilirsiniz.
IronOCR, metin çıkarımıyla birlikte barkod okuma işlevini de destekliyor mu?
IronOCR, metin çıkarımına ve OCR'ye odaklanır. Barkod okuma için, Iron Software, tamamlayıcı bir kütüphane olarak IronBarcode sağlar. Her ikisi de bireysel olarak veya Iron Suite paketi parçası olarak mevcuttur.
ABBYY FineReader Engine'den IronOCR'a geçmek kolay mı?
ABBYY FineReader Engine'den IronOCR'a geçiş genellikle başlatma 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.




