Asprise OCR'dan IronOCR'a Geçiş
Bu rehber, .NET geliştiricilerini IronOCR ileAsprise OCRdeğiştirme sürecinin her adımından geçirir. Mekanik paket değişimi, isim alanı değişiklikleri ve üretimdeki .NET uygulamalarında Asprise kullanımının çoğunluğunu oluşturan dört kod geçiş desenini kapsar. Geçmeye zaten karar vermiş ve somut bir eylem planına ihtiyaç duyan geliştiriciler hedef kitledir.
Asprise OCR'dan Neden Geçiş Yapılır?
Asprise OCR öncelikle bir Java ürünü olarak tasarlandı. .NET yüzeyi, Java kaynaklı yerel bir motorun etrafında bir sarmalayıcıdır ve bu kaynağı, kitaplığın .NET'teki davranışını her yönden şekillendirir — dağıtımdan API tasarımına ve lisans kısıtlamalarına kadar.
JRE ve Yerel İkili Bağımlılık.Asprise OCRfor .NET, uygulamanın çalıştığı her makinede platforma özgü yerel ikililerin (aocr.dll, aocr_x64.dll, libaocr.so, libaocr.dylib) bulunmasını gerektirir. Her ikili, hedef platform ve işlemci mimarisiyle tam olarak eşleşmelidir. 32 bit DLL ile oluşturulan 64 bit Docker konteyneri çalışma zamanında BadImageFormatException fırlatır. libaocr.so eksik olan bir Linux dağıtımı, LD_LIBRARY_PATH üzerinden DllNotFoundException fırlatır. Hata, derleme zamanında yüzeye çıkmaz. Her yeni dağıtım hedefi — yeni bir sunucu, yeni bir konteyner imajı, bir CI ajanı — manuel ikili kaynak bulma egzersizine dönüşür.
Java Mirasından Dize-Sabitli API. Asprise tanıma türü ve çıktı formatı için tamsayı sabitlerini açığa çıkarır: Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT, Ocr.OUTPUT_FORMAT_XML. Bu sabitler doğrudan Java SDK'sının tamsayı tabanlı API'sine bağlanır. .NET geliştiricileri, geçerli sabit değerler hakkında hiçbir IntelliSense rehberliği, bağımsız kombinezonlar üzerinde derleme zamanı güvenliği ve güçlü türde sonuç nesneleri almaz. Yapılandırılmış çıktının çıkarılması, XML dizelerinin manuel olarak ayrıştırılmasını gerektirir.
Geçici Çözümler Olmadan Async Desteği Yok. Asprise yerel async API sağlamaz. Senron Asprise çağrılarını engellemek için Task.Run içerisine sarmalamak, ASP.NET iş parçacıklarını engellemekten kaçınmasına neden olur ve LITE ve STANDARD seviyelerinde eşzamanlı yürütmeyi yasaklayan lisans kısıtlamasını çözmez. Modern .NET uygulamalarındaki async desenler — arka plan hizmetleri, minimal API uç noktaları, Azure Functions — Asprise için temiz bir eşdeğere sahip değildir.
Çoklu-Çerçeve TIFF İşleme Manuel Bölmeyi Gerektirir. Asprise tek resim dosyalarında çalışır. Çok sayfalı bir TIFF işlemek, çerçeveleri bireysel dosyalara ayırmak için harici bir kod gerektirir, ardından her dosyayı döngüde işler. Çerçeve meta verisi veya sayfa numaralandırması çıktıya taşınmaz.
İş Parçacığı Kısıtlaması Üretim Dağıtımını Engeller. LITE (~$299) ve STANDARD (~$699) lisansları, yürütmeyi tek bir iş parçacığı ve tek bir süreçle sınırlamak üzere sözleşmeyle bağlanmıştır. ASP.NET Core, tüm HTTP isteklerini bir iş parçacığı havuzunda işler. Bu katmanlarda Asprise'ı çağıran her web API uç noktası, ilk eşzamanlı istekten itibaren bir lisans ihlalidir. ENTERPRISE'a yükseltmek kısıtlamayı kaldırır, ancak dağıtım kapsamına bağlı olarak fiyat aralığı $2,000-$5,000+ arasında değişen ve satışla iletişime geçilmesi gereken bir fiyat olmaksızın.
Çıktı Formatı Yönetimi Dize Ayrıştırma Gerektirir. OUTPUT_FORMAT_XML belirtildiğinde, Asprise ham bir XML dizesi döndürür. Uygulama, o dizeyi deserialize etmek, yapısını doğrulamak ve kelimeleri ve koordinatlarını çıkarmakla sorumludur. Kelime başına güven puanları XML özniteliklerinde gömülüdür. Bir nesne modeli yoktur — yalnızca dize manipülasyonu vardır.
Temel Sorun
İlk OCR çağrısı çalıştırılmadan önce Asprise, JRE'ye bitişik yerel ikili yapılandırması gerektirir. IronOCR, NuGet paketi dışında hiçbir şey gerektirmez:
// Asprise: native binary must exist in PATH or application directory
// aocr_x64.dll missing → DllNotFoundException at runtime, not at build
Ocr.SetUp(); // Static init — touches native binary
Ocr ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine memory
string text = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine(); // Must call or native memory leaks
// Asprise: native binary must exist in PATH or application directory
// aocr_x64.dll missing → DllNotFoundException at runtime, not at build
Ocr.SetUp(); // Static init — touches native binary
Ocr ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine memory
string text = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine(); // Must call or native memory leaks
' Asprise: native binary must exist in PATH or application directory
' aocr_x64.dll missing → DllNotFoundException at runtime, not at build
Ocr.SetUp() ' Static init — touches native binary
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST) ' Allocates native engine memory
Dim text As String = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine() ' Must call or native memory leaks
// IronOCR: dotnet add package IronOcr — no binary sourcing, no lifecycle calls
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
string text = new IronTesseract().Read(imagePath).Text;
// IronOCR: dotnet add package IronOcr — no binary sourcing, no lifecycle calls
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
string text = new IronTesseract().Read(imagePath).Text;
' IronOCR: dotnet add package IronOcr — no binary sourcing, no lifecycle calls
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read(imagePath).Text
IronOCR ve Asprise OCR: Özellik Karşılaştırması
Aşağıdaki tablo, bu geçişi değerlendiren geliştiriciler için en önemli yetenekleri kapsar.
| Özellik | Asprise OCR | IronOCR |
|---|---|---|
| Birincil platform | Java (miras) | .NET yerel |
| NuGet yükleme | Sarmalayıcı + platforma özgü DLL'ler | Tek paket (IronOcr) |
| Çalışma zamanında yerel ikili olarak gereklidir | Evet (platform başına DLL) | Hayır |
| .NET API stili | Tamsayı sabitleri, dize döndermeleri | Güçlü türde sınıflar ve enumlar |
IDisposable / using deseni |
Uygulanmadı | Evet (OcrInput) |
| Asenkron OCR | Yerel destek yok | Evet (ReadAsync) |
| Çoklu iş parçacığı — LITE/STANDARD katmanı | Lisansla yasaklanmış | İzin verildi |
| Çoklu iş parçacığı — tüm katmanlar | Yalnızca ENTERPRISE | Tüm seviyeler |
| ASP.NET Core Web API desteği | ENTERPRISE gereklidir | Herhangi bir katman |
| Azure Fonksiyonları / AWS Lambda | ENTERPRISE gereklidir | Herhangi bir katman |
| Yerel PDF girişi | Hayır | Evet |
| Çoklu-çerçeve TIFF girişi | Hayır (manuel çerçeve bölme) | Evet (LoadImageFrames) |
| Bayt dizisi ve akış girişi | Sınırlı | Evet |
| Dahili resim ön işleme | Hayır | Evet (9+ filtre) |
| Aranabilir PDF çıktısı | Hayır | Evet (SaveAsSearchablePdf) |
| Yapılandırılmış sonuç nesne modeli | Hayır (yalnızca XML dizesi) | Evet (sayfalar, paragraflar, kelimeler, karakterler) |
| Kelime başına güvenilirlik puanları | Hayır (XML öznitelik ayrıştırma) | Evet (result.Confidence) |
| Kelime piksel koordinatları | XML öznitelik ayrıştırma | Güçlü türde özellikler |
| Dil sayımı | 20+ | 125+ |
| Güçlü türde dil seçimi | Hayır (dize kodları) | Evet (OcrLanguage enum) |
| Barkod okuma | Evet (ayrı tanıma türü) | Evet (yapılandırma bayrağı) |
| hOCR içeri aktarma | Hayır | Evet |
| Çapraz platform dağıtımı | Platform başına manuel ikili dosya | NuGet tüm platformları yönetir |
| Docker / Linux / macOS | Manuel LD_LIBRARY_PATH yapılandırma |
Kutudan çıkar çıkmaz çalışır |
| .NET uyumluluğu | Sınırlı (Java köprüsü) | .NET Framework 4.6.2+, .NET 5–9 |
| Sunucu kullanımı için giriş fiyatı | ENTERPRISE (~$2,000+) | $999 (Lite, tüm özellikler) |
| Lisans türü | Katman başına, Enterprise için satışla iletişime geçin | Süresiz (tek seferlik satın alma) |
Hızlı Başlangıç: Asprise OCR'den IronOCR Geçişi
Adım 1: NuGet Paketini Değiştirin
Asprise OCR'ü kaldırın:
dotnet remove package asprise-ocr-api
dotnet remove package asprise-ocr-api
NuGet paketi sayfasından IronOCR yükleyin:
dotnet add package IronOcr
Adım 2: Ad Alanlarını Güncelleyin
Asprise ad alanınıIronOCR ad alanı ile değiştirin:
// Before (Asprise)
using asprise.ocr;
// After (IronOCR)
using IronOcr;
// Before (Asprise)
using asprise.ocr;
// After (IronOCR)
using IronOcr;
Imports IronOcr
Adım 3: Lisansa İzin Verin
Uygulamanın başlatılmasında lisans anahtarı atamasını ekleyin: OCR çağrılarından önce Program.cs içinde, Startup.Configure içinde veya bir statik yapıcıda:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Ücretsiz bir deneme anahtarı IronOCR lisanslama sayfasından mevcuttur. Geliştirme ve değerlendirme sırasında IronOCR, bir anahtar olmadan çalışır ve çıktıyı bir deneme filigranı ile işaretler.
Kod Göç Örnekleri
JRE Yolu Yapılandırması ve Motor Başlatma Kaldırma
Linux veya macOS üzerinde çalışan Asprise uygulamaları tipik olarak bir JRE yolunu ayarlayan veya herhangi bir OCR çalışması başlamadan önce yerel ikili varlığı doğrulayan başlangıç kodunu içerir. Bu altyapı IronOCR'da eşdeğer bir yapı taşımamaktadır.
Asprise OCR Yaklaşımı:
// AppStartup.cs — native binary validation before accepting any requests
public static void InitializeOcr()
{
// Validate native library is reachable before first use
string nativePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? Path.Combine(AppContext.BaseDirectory, "aocr_x64.dll")
: RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
? "/usr/lib/libaocr.so"
: "/usr/local/lib/libaocr.dylib";
if (!File.Exists(nativePath))
throw new FileNotFoundException(
$"Asprise native binary not found: {nativePath}. " +
"Deploy the correct platform binary before starting.");
// Static global init — must run before any Ocr instance is created
Ocr.SetUp();
}
// AppStartup.cs — native binary validation before accepting any requests
public static void InitializeOcr()
{
// Validate native library is reachable before first use
string nativePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? Path.Combine(AppContext.BaseDirectory, "aocr_x64.dll")
: RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
? "/usr/lib/libaocr.so"
: "/usr/local/lib/libaocr.dylib";
if (!File.Exists(nativePath))
throw new FileNotFoundException(
$"Asprise native binary not found: {nativePath}. " +
"Deploy the correct platform binary before starting.");
// Static global init — must run before any Ocr instance is created
Ocr.SetUp();
}
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
' AppStartup.vb — native binary validation before accepting any requests
Public Module AppStartup
Public Sub InitializeOcr()
' Validate native library is reachable before first use
Dim nativePath As String = If(RuntimeInformation.IsOSPlatform(OSPlatform.Windows),
Path.Combine(AppContext.BaseDirectory, "aocr_x64.dll"),
If(RuntimeInformation.IsOSPlatform(OSPlatform.Linux),
"/usr/lib/libaocr.so",
"/usr/local/lib/libaocr.dylib"))
If Not File.Exists(nativePath) Then
Throw New FileNotFoundException($"Asprise native binary not found: {nativePath}. " &
"Deploy the correct platform binary before starting.")
End If
' Static global init — must run before any Ocr instance is created
Ocr.SetUp()
End Sub
End Module
IronOCR Yaklaşımı:
// Program.cs — license key assignment is the entire initialization
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// That is it.Hayırbinary validation, no path configuration, no SetUp() call.
// NuGet resolved the correct native runtime during package restore.
// Program.cs — license key assignment is the entire initialization
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// That is it.Hayırbinary validation, no path configuration, no SetUp() call.
// NuGet resolved the correct native runtime during package restore.
' Program.vb — license key assignment is the entire initialization
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' That is it. No binary validation, no path configuration, no SetUp() call.
' NuGet resolved the correct native runtime during package restore.
Asprise deseni genellikle birden fazla dosyada 15-30 satırdır: bir başlangıç doğrulayıcı, bir platform anahtarı, bir dağıtım mesajı içeren bir istisna ve SetUp() çağrısı. IronOCR, bunların tümünü tek bir atama ile değiştirir. IronTesseract kurulum kılavuzu, özel tessdata yolları veya çevrimdışı çalışma gerektiren ortamlar için dağıtım yapılandırma seçeneklerini kapsar.
Yapılandırılmış Sonuç Nesneleri ile XML Çıktı Biçimi Değiştirme
Asprise, OUTPUT_FORMAT_XML belirtildiğinde yapılandırılmış çıktıyı ham bir XML dizesi olarak üretir. O dizeden kelime metnini, koordinatlarını ve güvenini çıkarmak XML ayrıştırma kodu gerektirir.IronOCR bir türlenmiş nesne grafiği döndürür.
Asprise OCR Yaklaşımı:
// Asprise: structured output is an XML string — must parse manually
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string xmlOutput = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_XML); // Returns raw XML, not an object
// Parse the XML manually to extract words and coordinates
var doc = System.Xml.Linq.XDocument.Parse(xmlOutput);
var words = doc.Descendants("word")
.Select(w => new
{
Text = (string)w.Attribute("text"),
Confidence = (float)w.Attribute("confidence"),
X = (int)w.Attribute("x"),
Y = (int)w.Attribute("y"),
})
.ToList();
foreach (var word in words)
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence}");
}
finally
{
ocr.StopEngine();
}
// Asprise: structured output is an XML string — must parse manually
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string xmlOutput = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_XML); // Returns raw XML, not an object
// Parse the XML manually to extract words and coordinates
var doc = System.Xml.Linq.XDocument.Parse(xmlOutput);
var words = doc.Descendants("word")
.Select(w => new
{
Text = (string)w.Attribute("text"),
Confidence = (float)w.Attribute("confidence"),
X = (int)w.Attribute("x"),
Y = (int)w.Attribute("y"),
})
.ToList();
foreach (var word in words)
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence}");
}
finally
{
ocr.StopEngine();
}
Imports System.Xml.Linq
' Asprise: structured output is an XML string — must parse manually
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim xmlOutput As String = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_XML) ' Returns raw XML, not an object
' Parse the XML manually to extract words and coordinates
Dim doc As XDocument = XDocument.Parse(xmlOutput)
Dim words = doc.Descendants("word") _
.Select(Function(w) New With {
.Text = CStr(w.Attribute("text")),
.Confidence = CSng(w.Attribute("confidence")),
.X = CInt(w.Attribute("x")),
.Y = CInt(w.Attribute("y"))
}) _
.ToList()
For Each word In words
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence}")
Next
Finally
ocr.StopEngine()
End Try
IronOCR Yaklaşımı:
// IronOCR: structured result is a typed object — no XML parsing
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
foreach (var word in paragraph.Words)
{
Console.WriteLine(
$"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence:F1}%");
}
}
}
// IronOCR: structured result is a typed object — no XML parsing
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
foreach (var word in paragraph.Words)
{
Console.WriteLine(
$"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence:F1}%");
}
}
}
Imports IronOcr
' IronOCR: structured result is a typed object — no XML parsing
Dim result = New IronTesseract().Read(imagePath)
For Each page In result.Pages
For Each paragraph In page.Paragraphs
For Each word In paragraph.Words
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf={word.Confidence:F1}%")
Next
Next
Next
XML serileştirme, öznitelik dönüşümü, şema varsayımları yok. OcrResult nesne modeli sayfalar, paragraflar, satırlar, kelimeler ve karakterleri tipli özelliklerle açığa çıkarır. sonuçları okuma kılavuzu, otomatik iş akışları için güven eşiğine göre nasıl filtreleneceğini de içeren tam hiyerarşi ve koordinat sistemi kapsamaktadır.
Çoklu Çerçeve TIFF İşleme
Asprise, tek resim dosyalarını kabul eder. Belge tarama iş akışlarında yaygın olan çoklu-çerçeve TIFF, Asprise işlemini gerçekleştiremeden önce bireysel çerçeve dosyalarına bölünmelidir.IronOCR çok kareli TIFF'leri doğrudan LoadImageFrames ile kabul eder.
Asprise OCR Yaklaşımı:
// Asprise: no multi-frame TIFF support — split frames externally first
// Using an external imaging library (e.g., System.Drawing or Magick.NET)
var frameFiles = new List<string>();
using (var tiff = System.Drawing.Image.FromFile("scanned-batch.tiff"))
{
int frameCount = tiff.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
tiff.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
string framePath = $"frame_{i}.png";
tiff.Save(framePath);
frameFiles.Add(framePath);
}
}
// Now process each frame individually — sequential on LITE/STANDARD
var allText = new System.Text.StringBuilder();
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var framePath in frameFiles)
{
string pageText = ocr.Recognize(
framePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.AppendLine(pageText);
}
}
finally
{
ocr.StopEngine();
// Clean up temporary frame files
foreach (var f in frameFiles)
File.Delete(f);
}
Console.WriteLine(allText.ToString());
// Asprise: no multi-frame TIFF support — split frames externally first
// Using an external imaging library (e.g., System.Drawing or Magick.NET)
var frameFiles = new List<string>();
using (var tiff = System.Drawing.Image.FromFile("scanned-batch.tiff"))
{
int frameCount = tiff.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
tiff.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
string framePath = $"frame_{i}.png";
tiff.Save(framePath);
frameFiles.Add(framePath);
}
}
// Now process each frame individually — sequential on LITE/STANDARD
var allText = new System.Text.StringBuilder();
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var framePath in frameFiles)
{
string pageText = ocr.Recognize(
framePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.AppendLine(pageText);
}
}
finally
{
ocr.StopEngine();
// Clean up temporary frame files
foreach (var f in frameFiles)
File.Delete(f);
}
Console.WriteLine(allText.ToString());
Imports System.Drawing
Imports System.Text
Imports System.IO
' Asprise: no multi-frame TIFF support — split frames externally first
' Using an external imaging library (e.g., System.Drawing or Magick.NET)
Dim frameFiles As New List(Of String)()
Using tiff As Image = Image.FromFile("scanned-batch.tiff")
Dim frameCount As Integer = tiff.GetFrameCount(Imaging.FrameDimension.Page)
For i As Integer = 0 To frameCount - 1
tiff.SelectActiveFrame(Imaging.FrameDimension.Page, i)
Dim framePath As String = $"frame_{i}.png"
tiff.Save(framePath)
frameFiles.Add(framePath)
Next
End Using
' Now process each frame individually — sequential on LITE/STANDARD
Dim allText As New StringBuilder()
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
For Each framePath As String In frameFiles
Dim pageText As String = ocr.Recognize(framePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
allText.AppendLine(pageText)
Next
Finally
ocr.StopEngine()
' Clean up temporary frame files
For Each f As String In frameFiles
File.Delete(f)
Next
End Try
Console.WriteLine(allText.ToString())
IronOCR Yaklaşımı:
// IronOCR: multi-frame TIFF loads directly — no frame splitting, no temp files
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff"); // All frames, one call
var result = new IronTesseract().Read(input);
// Access each page independently with its page number
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
// IronOCR: multi-frame TIFF loads directly — no frame splitting, no temp files
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff"); // All frames, one call
var result = new IronTesseract().Read(input);
// Access each page independently with its page number
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
Imports IronOcr
' IronOCR: multi-frame TIFF loads directly — no frame splitting, no temp files
Using input As New OcrInput()
input.LoadImageFrames("scanned-batch.tiff") ' All frames, one call
Dim result = New IronTesseract().Read(input)
' Access each page independently with its page number
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
Next
End Using
Asprise yaklaşımı bir harici görüntüleme bağımlılığı, geçici dosya yönetimi, manuel temizleme ve çerçeve başına ardışık işleme gerektirir. IronOCR, tüm çerçeveleri tek geçişte işler. TIFF ve GIF giriş kılavuzu, yalnızca belirli sayfaların gerekli olduğu büyük TIFF'ler için çerçeve aralığı seçimini kapsar.
Aranabilir PDF Oluşturma
Asprise herhangi bir lisans katmanında aranabilir PDF çıktısı yeteneğine sahip değildir. Taranmış bir belgeden gömülü OCR metni ile bir PDF oluşturmak, bir dış PDF kitaplığı, metin konumlarını almak için ayrı bir OCR geçişi ve manuel kaplama yapımı gerektirir. IronOCR, tanıma sonucundan doğrudan aranabilir PDF'ler üretir.
Asprise OCR Yaklaşımı:
// Asprise: no searchable PDF output — external PDF library required
// Step 1: OCR the document to get text
Ocr.SetUp();
Ocr ocr = new Ocr();
string recognizedText;
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
recognizedText = ocr.Recognize(
"scanned-contract.jpg",
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT); // Only plain text — no position data
}
finally
{
ocr.StopEngine();
}
// Step 2: Use an external PDF library to embed text over the image
// (iTextSharp, PdfSharp, or similar — adds another dependency and license)
// Text positioning requires coordinate data Asprise cannot provide in plain text mode
// ... 40-80 lines of PDF construction code
Console.WriteLine("Searchable PDF: not achievable with Asprise alone");
// Asprise: no searchable PDF output — external PDF library required
// Step 1: OCR the document to get text
Ocr.SetUp();
Ocr ocr = new Ocr();
string recognizedText;
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
recognizedText = ocr.Recognize(
"scanned-contract.jpg",
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT); // Only plain text — no position data
}
finally
{
ocr.StopEngine();
}
// Step 2: Use an external PDF library to embed text over the image
// (iTextSharp, PdfSharp, or similar — adds another dependency and license)
// Text positioning requires coordinate data Asprise cannot provide in plain text mode
// ... 40-80 lines of PDF construction code
Console.WriteLine("Searchable PDF: not achievable with Asprise alone");
' Asprise: no searchable PDF output — external PDF library required
' Step 1: OCR the document to get text
Ocr.SetUp()
Dim ocr As New Ocr()
Dim recognizedText As String
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
recognizedText = ocr.Recognize( _
"scanned-contract.jpg", _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT) ' Only plain text — no position data
Finally
ocr.StopEngine()
End Try
' Step 2: Use an external PDF library to embed text over the image
' (iTextSharp, PdfSharp, or similar — adds another dependency and license)
' Text positioning requires coordinate data Asprise cannot provide in plain text mode
' ... 40-80 lines of PDF construction code
Console.WriteLine("Searchable PDF: not achievable with Asprise alone")
IronOCR Yaklaşımı:
// IronOCR: searchable PDF in two lines — no external PDF library
var result = new IronTesseract().Read("scanned-contract.jpg");
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Batch: convert a folder of scanned images to searchable PDFs
foreach (var imagePath in Directory.GetFiles("scans", "*.jpg"))
{
var batchResult = new IronTesseract().Read(imagePath);
string outputPath = Path.ChangeExtension(imagePath, ".searchable.pdf");
batchResult.SaveAsSearchablePdf(outputPath);
Console.WriteLine($"Converted: {outputPath}");
}
// IronOCR: searchable PDF in two lines — no external PDF library
var result = new IronTesseract().Read("scanned-contract.jpg");
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Batch: convert a folder of scanned images to searchable PDFs
foreach (var imagePath in Directory.GetFiles("scans", "*.jpg"))
{
var batchResult = new IronTesseract().Read(imagePath);
string outputPath = Path.ChangeExtension(imagePath, ".searchable.pdf");
batchResult.SaveAsSearchablePdf(outputPath);
Console.WriteLine($"Converted: {outputPath}");
}
Imports System.IO
Imports IronOcr
' IronOCR: searchable PDF in two lines — no external PDF library
Dim result = New IronTesseract().Read("scanned-contract.jpg")
result.SaveAsSearchablePdf("searchable-contract.pdf")
' Batch: convert a folder of scanned images to searchable PDFs
For Each imagePath In Directory.GetFiles("scans", "*.jpg")
Dim batchResult = New IronTesseract().Read(imagePath)
Dim outputPath As String = Path.ChangeExtension(imagePath, ".searchable.pdf")
batchResult.SaveAsSearchablePdf(outputPath)
Console.WriteLine($"Converted: {outputPath}")
Next
Aranabilir PDF, doğru koordinatlarla üzerine yerleştirilen görünmez OCR metni ile özgün görüntüyü görsel katman olarak içerir— arşivleme ve uyum iş akışlarının standart formatı. aranabilir PDF nasıl yapılır kılavuzu ve aranabilir PDF örneği, uzun vadeli arşivleme için PDF/A çıktısı dahil seçenekler içerir.
Web Uygulamalarında Async OCR
Asprise'in bir async API'si yoktur. Geliştiriciler senkron çağrıları Task.Run içine sararak eşzamansız .NET uygulamalarına entegre eder, bu işlem iş parçacığı havuzu iş parçacıklarını tüketir ve engellemeyi ortadan kaldırmaz. IronOCR, yerel bir async yol sağlar.
Asprise OCR Yaklaşımı:
// Asprise: no async API — must offload to Task.Run
// This blocks a thread pool thread during the entire OCR operation
// On LITE/STANDARD, concurrent Task.Run calls = license violation
public async Task<string> ProcessUploadAsync(Stream fileStream, string fileName)
{
string tempPath = Path.GetTempFileName();
await using (var fs = new FileStream(tempPath, FileMode.Create))
await fileStream.CopyToAsync(fs);
// Task.Run wraps synchronous Asprise — occupies a thread pool thread
// Two concurrent requests still violate LITE/STANDARD license
return await Task.Run(() =>
{
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
return ocr.Recognize(
tempPath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
}
finally
{
ocr.StopEngine();
File.Delete(tempPath);
}
});
}
// Asprise: no async API — must offload to Task.Run
// This blocks a thread pool thread during the entire OCR operation
// On LITE/STANDARD, concurrent Task.Run calls = license violation
public async Task<string> ProcessUploadAsync(Stream fileStream, string fileName)
{
string tempPath = Path.GetTempFileName();
await using (var fs = new FileStream(tempPath, FileMode.Create))
await fileStream.CopyToAsync(fs);
// Task.Run wraps synchronous Asprise — occupies a thread pool thread
// Two concurrent requests still violate LITE/STANDARD license
return await Task.Run(() =>
{
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
return ocr.Recognize(
tempPath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
}
finally
{
ocr.StopEngine();
File.Delete(tempPath);
}
});
}
Imports System.IO
Imports System.Threading.Tasks
' Asprise: no async API — must offload to Task.Run
' This blocks a thread pool thread during the entire OCR operation
' On LITE/STANDARD, concurrent Task.Run calls = license violation
Public Async Function ProcessUploadAsync(fileStream As Stream, fileName As String) As Task(Of String)
Dim tempPath As String = Path.GetTempFileName()
Await Using fs As New FileStream(tempPath, FileMode.Create)
Await fileStream.CopyToAsync(fs)
End Using
' Task.Run wraps synchronous Asprise — occupies a thread pool thread
' Two concurrent requests still violate LITE/STANDARD license
Return Await Task.Run(Function()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Return ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
Finally
ocr.StopEngine()
File.Delete(tempPath)
End Try
End Function)
End Function
IronOCR Yaklaşımı:
// IronOCR: native async, concurrent requests permitted on all tiers
public async Task<string> ProcessUploadAsync(Stream fileStream, string fileName)
{
using var input = new OcrInput();
input.LoadImage(fileStream); // Stream input directly — no temp file
var ocr = new IronTesseract();
var result = await ocr.ReadAsync(input);
return result.Text;
}
// IronOCR: native async, concurrent requests permitted on all tiers
public async Task<string> ProcessUploadAsync(Stream fileStream, string fileName)
{
using var input = new OcrInput();
input.LoadImage(fileStream); // Stream input directly — no temp file
var ocr = new IronTesseract();
var result = await ocr.ReadAsync(input);
return result.Text;
}
Imports System.IO
Imports System.Threading.Tasks
' IronOCR: native async, concurrent requests permitted on all tiers
Public Async Function ProcessUploadAsync(fileStream As Stream, fileName As String) As Task(Of String)
Using input As New OcrInput()
input.LoadImage(fileStream) ' Stream input directly — no temp file
Dim ocr As New IronTesseract()
Dim result = Await ocr.ReadAsync(input)
Return result.Text
End Using
End Function
IronOCR sürümü geçici dosya yazmayı, Task.Run sarmalayıcısını ve iş parçacığı engelleme davranışını ortadan kaldırır. Her birden fazla eşzamanlı istek kendi IronTesseract örneğini oluşturur; sınıf durumsuzdur ve her örnek bağımsızdır. eşzamanlı OCR kılavuzu, ReadAsync desenleri ve uzun süre çalışan toplu işlemler için iptal belirteci desteğini içerir.
Asprise OCR API'sinden IronOCR Eşleştirme Referansı
| Asprise OCR | IronOCR Karşılığı |
|---|---|
asprise.ocr namespace |
IronOcr namespace |
Ocr.SetUp() |
Gerekli değil |
new Ocr() |
new IronTesseract() |
ocr.StartEngine("eng", Ocr.SPEED_FAST) |
Gerekli değil |
ocr.StartEngine("eng+fra", speed) |
ocr.Language = OcrLanguage.English + OcrLanguage.French |
ocr.Recognize(path, type, format) |
ocr.Read(path) veya ocr.Read(input) |
Ocr.RECOGNIZE_TYPE_TEXT |
Varsayılan davranış |
Ocr.RECOGNIZE_TYPE_BARCODE |
ocr.Configuration.ReadBarCodes = true |
Ocr.RECOGNIZE_TYPE_ALL |
ocr.Configuration.ReadBarCodes = true |
Ocr.OUTPUT_FORMAT_PLAINTEXT |
result.Text |
Ocr.OUTPUT_FORMAT_XML |
result.Pages / result.Pages[n].Words |
Ocr.OUTPUT_FORMAT_PDF |
result.SaveAsSearchablePdf(path) |
Ocr.SPEED_FASTEST |
ocr.Configuration.TesseractEngineMode ayarlama |
Ocr.SPEED_FAST |
Varsayılan yapılandırma |
Ocr.SPEED_SLOW |
Daha yüksek doğruluklu yapılandırma ayarları |
ocr.StopEngine() |
Gerekli değil — OcrInput IDisposable |
result.StartsWith("ERROR:") kontrol |
Standart .NET istisna işleme (try/catch) |
| Platforma özgü DLL (aocr_x64.dll) | NuGet çalışma zamanı paketi (otomatik) |
| Akış girişi için manuel geçici dosya | input.LoadImage(stream) doğrudan |
| Çoklu-çerçeve TIFF için harici kütüphane | input.LoadImageFrames(path) |
| Aranabilir PDF için harici kütüphane | result.SaveAsSearchablePdf(path) |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Yerel İkilileri Kaldırdıktan Sonra DllNotFoundException
Asprise OCR: Asprise NuGet paketini kaldırmak ancak yerel ikili referansları (proje dosya kopyalama kurallarında, Docker COPY talimatlarında veya dağıtım senaryolarında) bırakmak, var olmayan bir ikiliye işaret eden bayat yapılandırmadan DllNotFoundException'nün yeniden ortaya çıkmasına neden olabilir.
Çözüm: aocr, libaocr veya LD_LIBRARY_PATH ayarlara atıfta bulunan herhangi bir dağıtım eserini arayın ve bunları kaldırın. IronOCR'nin karşılık gelen bir yapılandırma gereksinimi yoktur. Dockerfile'da:
# Remove: COPY aocr_x64.dll /app/
# Remove: ENV LD_LIBRARY_PATH=/app
# IronOCR: nothing to add — NuGet handles native runtime packaging
RUN dotnet restore
RUN dotnet publish -c Release -o /app/publish
Çapraz platform dağıtımı için, Docker dağıtım kılavuzu, Linux konteynerlerinde IronOCR için temel imaj gereksinimlerini kapsar.
Sorun 2: Eksik Ocr.SetUp() Kaldırma Başlatmayı Kırar
Asprise OCR: Ocr.SetUp() küresel yerel başlatma yapar. Bazı kod tabanları statik bir oluşturucuda veya Startup.Configure çağırır. Taşındıktan sonra, Asprise isim alanını kaldırmak derleme hatasını kaldırır, ancak SetUp() bir istisnayı bastıran bir try/catch içine sarıldığında, kod hiçbir şeyi başlatmadan sessizce derlenebilir ve çalıştırılabilir.
Çözüm: Tüm SetUp() çağrılarını grep yapın ve tüm başlatma bloğunu kaldırın. Eşdeğer başlangıç kancasınıIronOCR lisans anahtar atamasıyla değiştirin:
grep -rn "Ocr.SetUp\|StartEngine\|StopEngine" --include="*.cs" .
grep -rn "Ocr.SetUp\|StartEngine\|StopEngine" --include="*.cs" .
// Remove all occurrences of the engine lifecycle pattern:
// Ocr.SetUp();
// ocr.StartEngine(...);
// ocr.StopEngine();
// Replace application startup initialization with:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove all occurrences of the engine lifecycle pattern:
// Ocr.SetUp();
// ocr.StartEngine(...);
// ocr.StopEngine();
// Replace application startup initialization with:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
Sorun 3: XML Çıktı Ayrıştırma Kodu İçin Doğrudan Yerine Koyma Yok
Asprise OCR: OUTPUT_FORMAT_XML dizeyi XDocument, XmlReader veya regeks desenleri kullanarak ayrıştıran kodun IronOCR'de eşdeğer bir XML yapısı yoktur. Asprise tarafından üretilen XML şeması doğrudan IronOCR'nin nesne modeline bağlanmaz.
Çözüm: XML ayrıştırma kodunu OcrResult üzerinde doğrudan özellik erişimi ile değiştirin. Eşleme:
// Asprise XML parsing (remove)
var words = XDocument.Parse(xmlOutput)
.Descendants("word")
.Select(w => new { Text = (string)w.Attribute("text"), X = (int)w.Attribute("x") });
//IronOCR object model (replace with)
var result = new IronTesseract().Read(imagePath);
var words = result.Pages
.SelectMany(p => p.Paragraphs)
.SelectMany(para => para.Words)
.Select(w => new { w.Text, w.X });
// Asprise XML parsing (remove)
var words = XDocument.Parse(xmlOutput)
.Descendants("word")
.Select(w => new { Text = (string)w.Attribute("text"), X = (int)w.Attribute("x") });
//IronOCR object model (replace with)
var result = new IronTesseract().Read(imagePath);
var words = result.Pages
.SelectMany(p => p.Paragraphs)
.SelectMany(para => para.Words)
.Select(w => new { w.Text, w.X });
Imports System.Xml.Linq
Imports IronOcr
' Asprise XML parsing (remove)
Dim words = XDocument.Parse(xmlOutput) _
.Descendants("word") _
.Select(Function(w) New With {Key .Text = CType(w.Attribute("text"), String), Key .X = CType(w.Attribute("x"), Integer)})
' IronOCR object model (replace with)
Dim result = New IronTesseract().Read(imagePath)
Dim words = result.Pages _
.SelectMany(Function(p) p.Paragraphs) _
.SelectMany(Function(para) para.Words) _
.Select(Function(w) New With {w.Text, w.X})
sonuçları okuma kılavuzu, kutuları sınırlayıcılar ile karakter düzeyinde verileri içeren tam nesne hiyerarşisini kapsar.
Sorun 4: Task.Run Sarıcılarının İş Parçacığı Havuzu Tükenmesine Neden Olması
Asprise OCR: Asprise'i Task.Run içine saran yüksek eşzamanlı web uygulamaları, OCR hacim artışlarında iş parçacığı havuzunu tüketebilir. Her sıraya giren Task.Run, OCR operasyonu süresince bir iş parçacığı havuzu iş parçacığını tutar.
Çözüm: Task.Run(() => { asprise... }) desenlerini yerel IronOCR async çağrıları ile değiştirin. Her IronTesseract örneği bağımsızdır — istek başına bir tane oluşturun:
// Remove: await Task.Run(() => { ocr.Recognize(...) });
// Replace with:
using var input = new OcrInput();
input.LoadImage(stream);
var result = await new IronTesseract().ReadAsync(input);
return result.Text;
// Remove: await Task.Run(() => { ocr.Recognize(...) });
// Replace with:
using var input = new OcrInput();
input.LoadImage(stream);
var result = await new IronTesseract().ReadAsync(input);
return result.Text;
Imports IronTesseract
Using input As New OcrInput()
input.LoadImage(stream)
Dim result = Await (New IronTesseract()).ReadAsync(input)
Return result.Text
End Using
Sorun 5: Dizge Tabanlı Dil Kodu Doğrulaması
Asprise OCR: Dil kodları dize olarak iletilir ("eng", "fra", "eng+fra"). Bu dizeleri çalışma zamanında doğrulayan uygulamalar — sabit bir listeye karşı kontrol ederek, yapılandırmadan okuyarak — dize biçimi OcrLanguage enum tarzına değiştiğinde güncellenmelidir.
Çözüm: Dize dil parametrelerini OcrLanguage enum değerleriyle değiştirin. Yapılandırma odaklı dil seçimi Enum.Parse ile sorunsuz haritalanır:
// Asprise string-based (remove)
string language = config["OcrLanguage"]; // e.g. "eng+fra"
ocr.StartEngine(language, Ocr.SPEED_FAST);
//IronOCR enum-based (replace with)
// For single language from config:
var ocr = new IronTesseract();
ocr.Language = Enum.Parse<OcrLanguage>(config["OcrLanguage"]); // e.g. "English"
var result = ocr.Read(input);
// Asprise string-based (remove)
string language = config["OcrLanguage"]; // e.g. "eng+fra"
ocr.StartEngine(language, Ocr.SPEED_FAST);
//IronOCR enum-based (replace with)
// For single language from config:
var ocr = new IronTesseract();
ocr.Language = Enum.Parse<OcrLanguage>(config["OcrLanguage"]); // e.g. "English"
var result = ocr.Read(input);
Imports System
Imports IronOcr
' Asprise string-based (remove)
Dim language As String = config("OcrLanguage") ' e.g. "eng+fra"
ocr.StartEngine(language, Ocr.SPEED_FAST)
' IronOCR enum-based (replace with)
' For single language from config:
Dim ocr As New IronTesseract()
ocr.Language = [Enum].Parse(Of OcrLanguage)(config("OcrLanguage")) ' e.g. "English"
Dim result = ocr.Read(input)
çoklu diller kılavuzu geçerli tüm OcrLanguage enum değerlerini ve bunlara karşılık gelen NuGet dil paketi paketlerini listeler.
Sorun 6: Lisans Katmanı Kontrol Mantığı Artık Gerekmiyor
Asprise OCR: Bazı üretim kod tabanları, Asprise lisans katmanını algılayan ve ENTERPRISE altında çalışırken OCR işlemini dizilere ayarlayan çalışma zamanı kontrollerini içerir. Bu önlemler lisans ihlallerini önler ancak karmaşıklık ekler ve throughput'u azaltır.
Çözüm: Tüm katman algılama ve dizileme koruyucularını kaldırın. IronOCR, herhangi bir katmanda iş parçacığı kısıtlaması taşımaz. ConcurrentQueue, SemaphoreSlim veya tek iş parçacıklı dispatcher desenleri Asprise çağrılarını seri hale getirmek için kullanılır ancak taşınma sonrasında hiçbir amaca hizmet etmez:
// Remove: SemaphoreSlim _ocrLock = new SemaphoreSlim(1, 1);
// Remove: await _ocrLock.WaitAsync(); ... _ocrLock.Release();
// IronOCR: direct concurrent access, no guards needed
Parallel.ForEach(documentPaths, path =>
{
var text = new IronTesseract().Read(path).Text;
results[path] = text;
});
// Remove: SemaphoreSlim _ocrLock = new SemaphoreSlim(1, 1);
// Remove: await _ocrLock.WaitAsync(); ... _ocrLock.Release();
// IronOCR: direct concurrent access, no guards needed
Parallel.ForEach(documentPaths, path =>
{
var text = new IronTesseract().Read(path).Text;
results[path] = text;
});
Imports System.Threading.Tasks
' IronOCR: direct concurrent access, no guards needed
Parallel.ForEach(documentPaths, Sub(path)
Dim text = (New IronTesseract()).Read(path).Text
results(path) = text
End Sub)
Asprise OCR Geçiş Kontrol Listesi
Öncesi-Geçiş
Herhangi bir değiştirme kodu yazmadan önce Asprise kullanımını kod tabanında denetleyin:
# Find all files importing asprise namespace
grep -rn "using asprise" --include="*.cs" .
# Find all engine lifecycle calls
grep -rn "SetUp\|StartEngine\|StopEngine" --include="*.cs" .
# Find all integer constant references
grep -rn "RECOGNIZE_TYPE\|OUTPUT_FORMAT\|SPEED_FAST\|SPEED_SLOW" --include="*.cs" .
# Find native binary references in project files and deployment scripts
grep -rn "aocr\|libaocr" --include="*.csproj" --include="Dockerfile" --include="*.yml" .
# Find XML output parsing code
grep -rn "OUTPUT_FORMAT_XML\|XDocument.Parse\|Descendants.*word" --include="*.cs" .
# Find Task.Run wrappers around OCR calls
grep -rn "Task.Run.*ocr\|Task.Run.*Recognize" --include="*.cs" .
# Find all files importing asprise namespace
grep -rn "using asprise" --include="*.cs" .
# Find all engine lifecycle calls
grep -rn "SetUp\|StartEngine\|StopEngine" --include="*.cs" .
# Find all integer constant references
grep -rn "RECOGNIZE_TYPE\|OUTPUT_FORMAT\|SPEED_FAST\|SPEED_SLOW" --include="*.cs" .
# Find native binary references in project files and deployment scripts
grep -rn "aocr\|libaocr" --include="*.csproj" --include="Dockerfile" --include="*.yml" .
# Find XML output parsing code
grep -rn "OUTPUT_FORMAT_XML\|XDocument.Parse\|Descendants.*word" --include="*.cs" .
# Find Task.Run wrappers around OCR calls
grep -rn "Task.Run.*ocr\|Task.Run.*Recognize" --include="*.cs" .
Sonuçların envanterini çıkarın:
asprise.ocriçe aktaran dosyaları sayın — bunların hepsinin namespaceleri güncellenmelidir- Her
StartEngineçağrı konumunu listeleyin — her biriReadçağrısına dönüşür - XML çıktı ayrıştırma kodunu belirleyin - her blok, nesne modeli değişikliği gerektirir
- Herhangi bir lisans katmanı koruyucusunu veya dizileme sarıcılarını not edin - bunlar çıkarılabilir
- Yerel ikili dağıtım betiklerini ve konteyner yapılandırmasını belirleyin
Kod Geçişi
- Tüm projelerden
asprise-ocr-apiNuGet paketini kaldırın - OCR yapan her projeye
IronOcrNuGet paketini yükleyin - Tüm dosyalarda
using asprise.ocr'yiusing IronOcrile değiştirin - Uygulama başlatılmasında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"ekleyin - Tüm başlangıç ve başlatma kodlarından
Ocr.SetUp()çağrılarını kaldırın - Her
Ocr.StartEngine/Recognize/StopEnginebloğununew IronTesseract().Read(path).Textile değiştirin OUTPUT_FORMAT_XMLayrıştırma bloklarınıresult.Pagesnesne gezintisi ile değiştirinOUTPUT_FORMAT_PDFgeçici çözümleriniresult.SaveAsSearchablePdf(path)ile değiştirin- Çok kareli TIFF ayırma kodunu
input.LoadImageFrames(tiffPath)ile değiştirin - Akış tabanlı
Task.Runsarmalayıcılarıawait ocr.ReadAsync(input)ile değiştirin - Asprise'i eş zamanlı kullanımdan koruyan
SemaphoreSlimveya serileştirme korumalarını kaldırın .csprojdosyalarından ve Docker dosyalarından yerel ikili kopyalama talimatlarını kaldırın- Ortam yapılandırması ve CI betiklerinden
LD_LIBRARY_PATHayarlarını kaldırın - Dize dil kodlarını (
"eng","eng+fra")OcrLanguageenum değerleriyle değiştirin result.StartsWith("ERROR:")kontrollerinitry/catchblokları ile değiştirin
Geçiş Sonrası
dotnet builddosyasının eksik yerel kütüphaneler hakkında sıfır uyarı ile tamamlandığını doğrulayın- Tüm hedef ortamlarda (Windows, Linux, Docker) başlangıçta
DllNotFoundExceptionveyaBadImageFormatExceptionoluşmadığını doğrulayın - Temsilci bir resim üzerinde OCR çalıştırın ve metin çıktısının geçiş öncesi temel çizgiye uyduğunu doğrulayın
- Çoklu-çerçeve TIFF işlemini test edin ve tüm sayfaların doğru sayfa numaraları ile döndüğünü doğrulayın
- Aranabilir bir PDF oluşturun ve metnin bir PDF görüntüleyicisi içinde seçilebilir ve aranabilir olduğunu doğrulayın
- OCR'yi çağıran herhangi bir API uç noktasına eş zamanlı HTTP istekleri gönderin ve tüm isteklerin hatasız tamamladığını doğrulayın
- Eşzamanlı yük altında async uç noktaların sonuçları kilitlenmeden döndürdüğünü doğrulayın
- Yapılandırılmış veri çıkarımının (kelime koordinatları ve güvenirlik) bilinen bir belge üzerindeki doğru çıktıyı ürettiğini doğrulayın
- Geçmişe göre uygulama bellek kullanımını kontrol ederek eksik
StopEngine()çağrılarından kaynaklanan yerel bellek sızıntılarını doğrulayın - Linux üzerinde veya bir Docker konteynerinde uygulamayı çalıştırarak çapraz platform dağıtımının ikili yapılandırma olmadan çalıştığını doğrulayın
IronOCR'a Geçişin Ana Faydaları
Dağıtım Tek Bir NuGet Referansına İndirgenmiştir. Geçişten sonra her dağıtım hedefi — geliştirme iş istasyonları, aşama sunucuları, Linux konteynerleri, CI acenteleri — aynı komutla aynı paketi kurar. Hiçbir platform algılama mantığı, mimariye özgü ikili kaynak bulma yoktur ve çalışma zamanı yol yapılandırması yoktur. Önceden manuel yerel ikili KOPYA talimatları gerektiren bir Docker görüntüsü artık dotnet restore dışında hiçbir şey gerektirmez. Linux dağıtım kılavuzu ve Azure dağıtım kılavuzu, uygulanabilir olduğunda ortam spesifik notları kapsar.
Tüm Lisans Seviyeleri Sunucu Düzeyinde Dağıtımı Açıyor. $999 Lite lisansı ASP.NET Core Web API'leri, Windows Hizmetleri, Azure Fonksiyonları, AWS Lambda ve herhangi bir başka çok iş parçacıklı .NET iş yükünü destekler. Asprise'nin 2.000 $–5.000 $+ ücret talep ettiği ENTERPRISE seviyesindeki iş parçacığı yeteneği, her IronOCR seviyesinde dahildir. Asprise ENTERPRISE'den IronOCR Lite'a geçiş yapan ekipler, ENTERPRISE tarafından sağlanmayan yeteneklere sahip olurken OCR lisans maliyetlerini azaltır — yerel PDF, yapılandırılmış çıktı, arama yapılabilir PDF oluşturma ve 125 dil.
Yapılandırılmış OCR Sonuçları XML Dize Ayrıştırmasını Değiştirir. OcrResult nesne modeli, bir belgenin tam kapsamlı yapısını açığa çıkarır: sayfalar, paragraflar, satırlar, kelimeler ve karakterler, her biri piksel hassasiyetinde sınırlayıcı kutu koordinatları ve güven skorlarıyla. Daha önce XDocument veya regex ile Asprise XML dizelerini ayrıştıran kod doğrudan özelliği erişimi haline gelir. OCR sonuçları özellikleri sayfası, koordinat sistemlerini ve otomatik kalite kapılarına göre sonuçları nasıl filtreleyeceğinizi kapsar.
Yerleşik Ön İşleme Dış Görüntü Bağımlılıklarını Kaldırır. OcrInput üzerinden kullanılabilen ön işleme hattı — Deskew, DeNoise, Contrast, Binarize, Sharpen, Dilate, Erode, Scale, Invert ve DeepCleanBackgroundNoise — Asprise entegrasyonlarının gerektirdiği dış görüntü kütüphanesini ortadan kaldırır. Bu bağımlılığı kaldırmak, lisans endişesini ortadan kaldırır, derleme ayakizini azaltır ve ön işleme yapılandırmasını OCR yapılandırmasıyla aynı kod dosyasında doğrudan yan yana getirir. ön işleme özellikleri sayfası ve görüntü kalitesi düzeltme kılavuzu, her filtreyi ne zaman uygulayacağını ve her birinin düşük kaliteli taramalarda sağladığı ölçülebilir doğruluk artışlarını kapsar.
Yerel Eşzamanlılık ve Gerçek Paralellik Üretim Kapasitesini Artırır. ReadAsync, hiçbir iş parçacığı havuzu engellenmeden standart async/await deseniyle entegrasyon sağlar. Parallel.ForEach veya PLINQ ile paralel toplu işlem, mevcut çekirdeklerle orantılı olarak ölçeklenir. Asprise LITE/STANDARD tarafından sırayla çalıştırılması zorunlu olan bir belge grubu — her biri 2 saniye olan 100 belge 3 dakikadan fazla sürer —IronOCR ile 8 çekirdekli bir makinede yaklaşık 25 saniyede çalışır. çok iş parçacıklı örnek, paralel verimlilik desenlerini göstermektedir ve ConcurrentBag için iş parçacığı güvenli sonuç toplama nasıl kullanılır.
Binary Dağılım Olmadan 125'ten Fazla Dil. Dil paketleri, NuGet paketleri olarak yüklenir - dotnet add package IronOcr.Languages.Arabic, dotnet add package IronOcr.Languages.Japanese - ve her diğer bağımlılık gibi uygulama ile birlikte dağıtılır. Elle doldurulacak tessdata klasörü yok, bulunacak dil ikili dosyası yok ve hedef makinede gereken yol yapılandırması yok. diller dizini 125+'tan fazla mevcut dil paketini listeler.
Sıkça Sorulan Sorular
Neden Asprise OCR SDK'dan IronOCR'a geçmeliyim?
Yaygın geçiş nedenleri arasında COM ara bağlamının karmaşıklığını ortadan kaldırmak, dosya tabanlı lisans yönetimini değiştirmek, sayfa başına fatura düzenlemekten kaçınmak, Docker/kapsayıcı dağıtımını etkinleştirmek ve standart .NET araçlarıyla entegre olan bir NuGet doğal iş akışı benimsemek yer almaktadır.
Asprise OCR SDK'dan IronOCR'a geçişteki ana kod değişiklikleri nelerdir?
Asprise OCR başlatma dizilerini IronTesseract oluşturma ile değiştirin, COM yaşam döngüsü yönetimini (açık Oluştur/Yükle/Kapat desenleri) kaldırın ve sonuç özellik adlarını güncelleyin. Sonuç, önemli ölçüde daha az sablon satırıdır.
Geçişi başlatmak için IronOCR'u nasıl kurarım?
Paket Yöneticisi Konsolunda 'Install-Package IronOcr' veya CLI'da 'dotnet add package IronOcr' çalıştırın. Dil paketleri ayrı paketlerdir: Örneğin, Fransızca için 'dotnet add package IronOcr.Languages.French'.
IronOCR, Asprise OCR SDK'nın standart iş belgeleri için OCR doğruluğuna eşit midir?
IronOCR, faturalar, sözleşmeler, makbuzlar ve yazılı formlar dahil olmak üzere standart işletme içerikleri için yüksek doğruluğa ulaşır. Görüntü ön işleme filtreleri (dengelemeyi düzeltme, gürültü kaldırma, kontrast artırma) bozulmuş girdiler üzerindeki tanımayı daha da iyileştirir.
IronOCR, Asprise OCR SDK'nın ayrı olarak yüklediği dil verilerini nasıl ele alır?
IronOCR'daki dil verileri, NuGet paketleri olarak dağıtılır. 'dotnet add package IronOcr.Languages.German' komutuyla Almanca desteği yüklenir. Herhangi bir manuel dosya yerleştirme veya dizin yolu gerekmez.
Asprise OCR SDK'dan IronOCR'a geçiş, dağıtım altyapısında değişiklikler gerektirir mi?
IronOCR, Asprise OCR SDK'dan daha az altyapı değişikliği gerektirir. SDK ikili yolları, lisans dosyası yerleştirmeleri veya lisans sunucu yapılandırmaları yoktur. NuGet paketi, tamamıyla OCR motorunu içerir ve lisans anahtarı uygulama kodunda bir dize olarak ayarlanır.
Geçişten sonra IronOCR lisanslamasını nasıl yapılandırırım?
Uygulama başlangıç kodunda IronOcr.License.LicenseKey = "SİZİN-ANAHTARINIZ" atayın. Docker veya Kubernetes'te, anahtarı bir ortam değişkeni olarak saklayın ve başlangıçta okuyun. Trafiği kabul etmeden önce doğrulamak için License.IsValidLicense kullanın.
IronOCR, PDF'leri Asprise OCR gibi işleyebilir mi?
Evet. IronOCR hem yerel hem de taranmış PDF'leri okur. Bir PDF yolu veya OcrPdfInput olan girdiye ocr.Read(input) çağrısı yapmak için IronTesseract örneği çağırın ve OcrResult sayfalarını yineleyin. Ayrı bir PDF işleme hattı gerekmez.
IronOCR, yüksek hacim işleme sırasında iş parçacığı nasıl ele alır?
IronTesseract, iş parçacığı başına örnek olacak şekilde güvenlidir. Paralel.ForEach veya Görev havuzunda her iş parçacığı için bir örnek oluşturun, OCR'u eşzamanlı olarak çalıştırın ve her örneği iş tamamlandığında bırakın. Küresel durum veya kilitleme gerekmez.
IronOCR metin çıktıktan sonra hangi çıktıları destekler?
IronOCR, metin, kelime koordinatları, güven skorları ve sayfa yapısını içeren yapılandırılmış sonuçlar döndürür. Dışa aktarma seçenekleri düz metin, aranabilir PDF ve aşağı akış işlemesi için yapılandırılmış sonuç nesneleri içerir.
IronOCR'un fiyatlandırması, Asprise OCR SDK'dan daha öngörülebilir mi? İş yüklerini artırırken?
IronOCR, sayfa başına veya hacim ücretlendirmesi olmadan düz oranlı sürekli lisanslama kullanır. 10.000 veya 10 milyon sayfa işleseniz de lisans maliyeti sabit kalır. Hacim ve ekip lisanslama seçenekleri IronOCR fiyatlandırma sayfasındadır.
Asprise OCR SDK'dan IronOCR'a geçişten sonra mevcut testlerime ne olur?
Çıkarılmış metin içeriğini doğrulayan testler, geçişten sonra çalışmaya devam etmelidir. API çağrı şablonlarını veya COM nesne yaşam döngüsünü doğrulayan testler, IronOCR'un daha basit başlatma ve sonuç modelini yansıtacak şekilde güncellenmelidir.

