Porównanie pomiędzy IronOCR a Aspose.OCR
Asprise OCR dostarcza bibliotekęJavaw pierwszej kolejności i traktuje.NET/jako drugorzędny cel — ta decyzja projektowa jest widoczna na każdej warstwie produktu, od dokumentacji napisanej w przykładach Javy, po natywny model wdrożenia binarnego, który wymaga platformowo-specyficznych bibliotek DLL (aocr.dll, aocr_x64.dll, libaocr.so, libaocr.dylib) na każdej maszynie, która uruchamia oprogramowanie. Model wątków dodatkowo komplikuje sprawę: licencje LITE i STANDARD są umownie ograniczone do wykonywania w jednym wątku i jednym procesie, co oznacza, że każdy punkt końcowy ASP.NET Core, usługa Windows lub funkcja Azure, która wywołuje Asprise na tych warstwach, narusza Umowę licencyjną. Dla zespołów.NET/tworzących systemy produkcyjne nie są to kwestie teoretyczne — są to przeszkody we wdrożeniu, które wymuszają albo kosztowne Licencje Enterprise, albo zmianę biblioteki przed przejściem do produkcji.
Zrozumienie Asprise OCR
Asprise OCR to komercyjny produkt OCR firmy Asprise Inc. Produkt powstał jako silnik OCR dla języka Java. Obsługa platformy.NET/została dodana później poprzez natywne biblioteki-owijki, które łączą zarządzany kod C# z bazowymi, niezarządzanymi plikami binarnymi OCR. Ta architektura mostkowa jest cechą charakterystyczną biblioteki dla programistów .NET.
Kluczowe cechy architektury:
- Projekt zorientowany na Javę: Cała podstawowa dokumentacja, przykładowy kod i przykłady SDK są napisane w Javie. Programiści.NET/tłumaczą sobie wszystko z Javy w głowie albo polegają na skąpych materiałach dodatkowych.
- Natywna zależność binarna: Niezarządzane biblioteki DLL specyficzne dla platformy muszą znajdować się w katalogu wdrożeniowym lub ścieżce systemowej. Poprawna biblioteka binarna musi odpowiadać architekturze procesu — 32-bitowe procesy wymagają
aocr.dll, 64-bitowe procesy wymagająaocr_x64.dll. - Ręczny cykl życia silnika: Biblioteka udostępnia wzorzec inicjalizacji w stylu C (
Ocr.SetUp(),ocr.StartEngine(),ocr.StopEngine()) odziedziczony z jego początków w Javie. Nie ma implementacjiIDisposable. Zapomnienie oStopEngine()powoduje wycieki pamięci natywnej. - Ograniczenia dotyczące licencji: poziomy Lite (~299 USD) i STANDARD (~699 USD) pozwalają tylko na wykonywanie w jednym wątku i jednym procesie. Wielowątkowość wymaga wersji Enterprise, co wymaga skontaktowania się z działem sprzedaży.
- Kody błędów, nie wyjątki: Niepowodzenia rozpoznawania pojawiają się jako puste zwroty lub ciągi znaków poprzedzone
"ERROR:", zgodnie z konwencjami kodów błędów C/Java zamiast z wzorcami wyjątków .NET. - Ponad 20 języków OCR: znacznie mniej niż w przypadku alternatywnych rozwiązań stworzonych dla ekosystemu .NET.
Problem cyklu życia silnika
Każde wywołanieAsprise OCRwymaga wyraźnego zarządzania silnikiem. Schemat składa się z czterech obowiązkowych kroków: statycznej konfiguracji globalnej, utworzenia instancji, uruchomienia silnika z ciągiem językowym oraz zatrzymania silnika po zakończeniu. Silnik pomija wycieki zasobów natywnych, ponieważ moduł czyszczący pamięci nie może zwolnić pamięci niezarządzanej:
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
' Asprise: four required steps before reading a single image
Ocr.SetUp() ' Static global init
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST) ' Allocates native engine
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine() ' Must call — no IDisposable fallback
End Try
Ten wzorzec cicho zawodzi w trzech typowych sytuacjach: nieobłyszony wyjątek przed wywołaniem StopEngine(), zrefaktoryzowana ścieżka kodu pomijająca sprzątanie oraz równoczesne użycie w LITE/STANDARD, gdzie licencja zabrania wątkowania, które pozwalałoby na równoległość. Blok finally ogranicza pierwszy problem, ale ograniczenie licencji czyni wzorzec bezużytecznym dla obciążeń serwerowych w każdym razie.
Zrozumienie IronOCR
IronOCR to komercyjna biblioteka OCR stworzona od podstaw dla platformy .NET. Zawiera zoptymalizowany silnik Tesseract 5 z automatycznym przetwarzaniem wstępnym, natywną obsługą plików PDF oraz zarządzanym interfejsem API, który w całości jest zgodny ze standardowymi konwencjami platformy.NET/Standard.
Kluczowe cechy:
- Pojedyncza paczka NuGet:
dotnet add package IronOcrinstaluje wszystko — brak zarządzania natywnymi binarnymi, brak folderów tessdata, brak platformowo-specyficznej konfiguracji. - Zarządzanie zasobami
IDisposable:OcrInputimplementujeIDisposable. Instrukcjausingautomatycznie zajmuje się sprzątaniem. - Bezpieczeństwo wątków we wszystkich poziomach licencji: brak sztucznych ograniczeń dotyczących wątków. Instancje
IronTesseractsą bezpieczne do użycia równoległego na licencji $999 Lite. - Automatyczne przetwarzanie wstępne: Wbudowane metody
Deskew(),DeNoise(),Contrast(),Binarize()iEnhanceResolution()usuwają potrzebę korzystania z zewnętrznych bibliotek przetwarzania obrazów. - Natywne wprowadzanie plików PDF: Przekaż ścieżkę do pliku PDF bezpośrednio — nie jest wymagana żadna zewnętrzna biblioteka renderująca do konwersji stron na obrazy.
- 125+ języków: Dostępne jako oddzielne paczki NuGet (
IronOcr.Languages.Frenchitp.), instalowane tylko wtedy, gdy są potrzebne. - Wynik PDF z możliwością przeszukiwania:
result.SaveAsSearchablePdf()generuje zgodny z PDF/A wynik z dowolnego wyniku OCR. - Dostęp do danych strukturalnych: Wyniki przedstawiają tekst na poziomie słów, wierszy i akapitów wraz ze współrzędnymi pikselowymi oraz wynikami pewności dla poszczególnych słów.
Porównanie funkcji
| Funkcja | Asprise OCR | IronOCR |
|---|---|---|
| Główna platforma | Java | .NET |
| Wdrożenie NuGet | Wrapper + natywne biblioteki DLL | Pojedynczy pakiet, bez dodatków |
| Wątkowanie (wszystkie poziomy) | TYLKO DLA ENTERPRISE | Wszystkie poziomy |
| Wykorzystanie na serwerze/w aplikacji internetowej | TYLKO DLA ENTERPRISE | Wszystkie poziomy |
| Natywne wprowadzanie plików PDF | Nie | Tak |
| Wbudowane przetwarzanie wstępne | Nie | Tak |
| Języki OCR | 20+ | 125+ |
| Wynik w formacie PDF z możliwością wyszukiwania | Nie | Tak |
Szczegółowe porównanie funkcji
| Funkcja | Asprise OCR | IronOCR |
|---|---|---|
| Architektura | ||
| Pochodzenie projektu | Java,.NETjako języki dodatkowe | .NET natywne |
| Styl API | Styl C# z stałymi całkowitoliczbowymi | Biegła znajomość języka C# |
IDisposable / wzorzec using |
Nie zaimplementowano | Tak (OcrInput) |
| Obsługa błędów | Zwraca wartość null / ciąg błędu | Wyjątki.NET |
| Propagacja wyjątków z języka natywnego | Luki w interoperacyjności | Wyjątki obsługiwane |
| Wątki i wykorzystanie serwera | ||
| Wielowątkowość — poziom Lite | Zabronione | Dopuszczalne |
| Wielowątkowość — poziom STANDARD | Zabronione | Dopuszczalne |
| Wielowątkowość — Enterprise/wyższy poziom | Dopuszczalne | Dopuszczalne |
| ASP.NET Core Web API | Wymagany poziom Enterprise | Dowolny poziom |
| Funkcje Azure / AWS Lambda | Wymagany poziom Enterprise | Dowolny poziom |
| Partia Parallel.ForEach | Wymagany poziom Enterprise | Dowolny poziom |
| Obsługa danych wejściowych | ||
| Pliki graficzne (JPG, PNG, TIFF) | Tak | Tak |
| Natywne wprowadzanie plików PDF | Nie (wymagana biblioteka zewnętrzna) | Tak |
| Plik PDF chroniony hasłem | Nie | Tak |
| Tablica bajtów / Wejście strumieniowe | Ograniczone | Tak |
| Wielostronicowy plik TIFF | Ograniczone | Tak |
| Przetwarzanie wstępne | ||
| Wyrównanie | Podręcznik / zewnętrzny | Wbudowane |
| Denoize | Podręcznik / zewnętrzny | Wbudowane |
| Wzmocnienie kontrastu | Podręcznik / zewnętrzny | Wbudowane |
| Binaryzacja | Podręcznik / zewnętrzny | Wbudowane |
| Skalowanie rozdzielczości (DPI) | Podręcznik / zewnętrzny | Wbudowane |
| Wynik | ||
| Zwykły tekst | Tak | Tak |
| Wynik w formacie PDF z możliwością wyszukiwania | Nie | Tak |
| Słowa kluczowe w WORD | Ograniczone | Tak |
| Wyniki pewności dla poszczególnych słów | Nie | Tak |
| eksport hOCR | Nie | Tak |
| Języki | ||
| Liczba słów | 20+ | 125+ |
| Instalacja języka | W pakiecie | Pakiety NuGet |
| Wyliczenie w języku silnie typowanym | Nie (kody łańcuchów) | Tak (OcrLanguage) |
| Wdrożenie | ||
| Wymagany plik binarny w formacie natywnym | Tak (biblioteka DLL specyficzna dla platformy) | Nie |
| Zarządzanie folderami Tessdata | Nie | Nie |
| Docker | Ręczna konfiguracja plików binarnych | Działa od razu po uruchomieniu |
| Linux | Wymaga libaocr.so |
NuGet obsługuje |
| Ceny | ||
| Cena wywoławcza | kontaktuj się z Asprise w celu uzyskania wyceny (LITE, tylko jedno wątkowanie) | $999 (Lite, wszystkie funkcje) |
| Cena wejściowa za korzystanie z serwera | Enterprise (kontakt z działem sprzedaży) | $999 (Lite) |
Architektura natywna.NET/a architektura mostkowa Java
Podstawowym pytaniem dla zespołów.NET/nie jest to, która biblioteka ma więcej funkcji na papierze — chodzi o to, która z nich zachowuje się jak pełnoprawny element środowiska.NET/w środowiskach wdrożeniowych i operacyjnych, z których faktycznie korzystają.
Podejście Asprise
Asprise komunikuje się między zarządzanym kodem.NET/a swoim niezarządzanym silnikiem OCR za pośrednictwem marshalingu P/Invoke. Źródło asprise-vs-ironocr-examples.cs pokazuje podstawowy mechanizm:
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
Imports System.Runtime.InteropServices
' Asprise interop layer — bridging managed VB.NET to native OCR engine
Private Class OCRInterop
<DllImport("aocr.dll")>
Private Shared Function OCR(imagePath As String, type As Integer) As IntPtr
End Function
Public Function ExtractText(imagePath As String) As String
' P/Invoke call into unmanaged DLL
Dim result As IntPtr = OCR(imagePath, 0)
Return Marshal.PtrToStringAnsi(result) ' Manual string marshal
End Function
End Class
Na wyższym poziomie API programiści wywołują ten sam most poprzez klasę opakowującą, ale wymagania dotyczące wdrożenia nie ulegają zmianie: każda maszyna docelowa wymaga odpowiedniego pliku binarnego, umieszczonego w odpowiedniej ścieżce i dopasowanego do właściwej architektury procesowej. Wdrożenie 64-bitowe, które dostarcza z aocr.dll zamiast aocr_x64.dll, powoduje wyrzucenie BadImageFormatException podczas uruchamiania. KontenerDockerLinux bez libaocr.so w LD_LIBRARY_PATH wyrzuca DllNotFoundException. Żaden z tych błędów nie jest wykrywany w czasie kompilacji.
Podejście IronOCR
IronOCR instaluje się jako pojedyncze odwołanie NuGet. Pakiet obsługuje wszystkie natywne zależności wewnętrznie poprzez mechanizm wyboru pakietów specyficzny dla platformy NuGet:
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr
' Installation — one command, all platforms
' dotnet add package IronOcr
' License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Basic OCR — no native binary setup, no tessdata, no config files
Dim text As String = New IronTesseract().Read("document.jpg").Text
Instrukcja using na OcrInput zastępuje ręczne wywołania cyklu życia silnika. Nie ma StartEngine() do wywołania i nie ma StopEngine(), które można by było zapomnieć. Kolektor śmieci i wzorzec IDisposable poprawnie zajmują się sprzątaniem w scenariuszach wyjątkowych, nie wymagając rusztowania try/finally wokół każdego wywołania OCR.
Szczegółowe wskazówki dotyczące konfiguracji można znaleźć w przewodniku konfiguracji IronTesseract.
Model wątków
Ograniczenie dotyczące wątków jest najważniejszą różnicą między Asprise a alternatywnymi rozwiązaniami dla programistów serwerów .NET. Nie jest to kwestia wydajności — jest to kwestia zgodności z licencją.
Podejście Asprise
Licencje Lite i STANDARD wyraźnie zabraniają wykonywania wielowątkowego i wieloprocesowego. Każdy kod, który wywołuje Asprise z więcej niż jednego wątku jednocześnie, narusza Umowę licencyjną na tych poziomach..NETCore domyślnie przetwarza żądania w puli wątków. To sprawia, że każdy standardowy kontroler Web API, który wywołuje Asprise, stanowi naruszenie licencji w wersjach Lite/STANDARD:
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
' ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
' Web server thread pool = multiple concurrent threads = prohibited
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Two concurrent requests = two threads = license violation
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
Return Ok(text)
End Function
End Class
Przetwarzanie wsadowe w wersjach Lite/STANDARD jest wymuszone sekwencyjnie, niezależnie od dostępnych rdzeni procesora:
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
' ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
For Each path In imagePaths ' Cannot use Parallel.ForEach — license violation
Dim text As String = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
results.Add(text)
Next
Finally
ocr.StopEngine()
End Try
ENTERPRISE usuwa ograniczenia wątkowe, ale ENTERPRISE wymaga kontaktu z działem sprzedaży Asprise, bez opublikowanej ceny.
Podejście IronOCR
IronTesseract jest bezpieczny wątkowo i nie ma żadnych ograniczeń dotyczących wątków na żadnym poziomie licencji. Równoległe przetwarzanie wsadowe na licencji $999 Lite jest w pełni obsługiwane:
//IronOCR— parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
//IronOCR— parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
Imports System.Linq
'IronOCR— parallel batch on any license tier
' 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
Dim results = imagePaths _
.AsParallel() _
.Select(Function(path) New IronTesseract().Read(path).Text) _
.ToList()
Kontrolery ASP.NET Core działają bez żadnej specjalnej konfiguracji:
//IronOCR— concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
//IronOCR— concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
Dim text = New IronTesseract().Read(tempPath).Text
Return Ok(text)
End Function
End Class
Zobacz przykład wielowątkowości, aby zapoznać się z wzorcami przepustowości równoległej w obciążeniach wsadowych.
Wstępne przetwarzanie obrazów
Asprise przekazuje obrazy do swojego natywnego silnika bez wstępnego przetwarzania. Skanowanie niskiej jakości — przekrzywione strony, zakłócenia, niski kontrast — bezpośrednio obniża dokładność OCR, ponieważ nie ma warstwy przetwarzania wstępnego, która korygowałaby wady obrazu przed uruchomieniem rozpoznawania.
Podejście Asprise
Przetwarzanie wstępne wymaga zewnętrznej biblioteki obrazów. Programista pracujący z Asprise dodaje zależność, taką jak ImageMagick, SkiaSharp lub System.Drawing, ręcznie wykonuje operacje przetwarzania wstępnego, zapisuje przetworzony obraz w pliku tymczasowym, a następnie przekazuje ten plik do Asprise:
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
' Asprise preprocessing: external dependency required
' 1. Load with external library
' 2. Apply corrections (deskew, denoise, contrast) with external library
' 3. Save to temp file
' 4. Pass temp file to Asprise
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
' preprocessedImagePath comes from your external preprocessing pipeline
Dim text As String = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
Powoduje to dodanie zależności kompilacji, zwiększa obciążenie środowiska uruchomieniowego z powodu dodatkowej biblioteki oraz wymaga od programisty wystarczającej znajomości przetwarzania obrazów, aby wprowadzić skuteczne poprawki.
Podejście IronOCR
Przetwarzanie wstępne jest wbudowane w OcrInput. Ten sam proces, który przy użyciu biblioteki zewnętrznej i starannego dostrajania parametrów zajmował 50–100 wierszy kodu, sprowadza się teraz do pięciu wywołań metod:
//IronOCR— preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
//IronOCR— preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' IronOCR— preprocessing built in, no external dependencies
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct page rotation
input.DeNoise() ' Remove scanner artifacts
input.Contrast() ' Improve text/background separation
input.Binarize() ' Convert to black/white for cleaner engine input
input.EnhanceResolution(300) ' Scale to optimal DPI
Dim result = New IronTesseract().Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
W przypadku skanów, w których obrót jest nieprzewidywalny, funkcja automatycznego prostowania radzi sobie z dowolnymi kątami bez konieczności wykrywania lub określania wartości obrotu przez programistę. Przewodnik po korekcji jakości obrazu obejmuje pełny zestaw filtrów oraz informacje o tym, kiedy należy stosować każdy z nich.
Przetwarzanie plików PDF
Wprowadzanie danych z plików PDF jest częstym wymaganiem w procesach przetwarzania dokumentów. Asprise nie zapewnia natywnej obsługi plików PDF — biblioteka działa na plikach graficznych. Przetwarzanie pliku PDF za pomocą Asprise wymaga najpierw konwersji każdej strony na obraz przy użyciu zewnętrznej biblioteki, a następnie indywidualnego przetworzenia każdego pliku obrazu.
Podejście Asprise
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
Imports System.Text
' Asprise PDF workaround — external library required to render PDF pages
Dim images = ExternalPdfLibrary.RenderPages("invoice.pdf")
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim allText As New StringBuilder()
For Each imagePath In images
Dim pageText As String = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
allText.Append(pageText)
Next
Return allText.ToString()
Finally
ocr.StopEngine()
End Try
' Also: clean up temp image files
To podejście dodaje zależność od renderowania PDF (zwykle iText, PDFSharp lub komercyjny renderer), wymaga zarządzania plikami tymczasowymi i traci metadane PDF oraz strukturę, które natywny czytnik PDF by zachował. Pliki PDF chronione hasłem wymagają trzeciego komponentu.
Podejście IronOCR
IronOCR odczytuje pliki PDF bezpośrednio. Metoda OcrInput.LoadPdf() zajmuje się renderingiem wewnętrznie, w tym dokumentami wielostronicowymi i plikami chronionymi hasłem:
//IronOCR— native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
//IronOCR— native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
Imports IronOcr
' IronOCR— native PDF input, no external rendering library
Using input As New OcrInput()
input.LoadPdf("invoice.pdf")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' Password-protected PDFs — same API, one parameter
Using secureInput As New OcrInput()
secureInput.LoadPdf("confidential.pdf", Password:="secret")
Dim secureResult = New IronTesseract().Read(secureInput)
End Using
' Generate searchable PDF from a scanned document
Dim scanResult = New IronTesseract().Read("scanned-contract.pdf")
scanResult.SaveAsSearchablePdf("searchable-contract.pdf")
Przewodnik dotyczący OCR plików PDF obejmuje wybór zakresu stron, obsługę mieszanych typów plików PDF oraz tworzenie plików PDF z możliwością wyszukiwania na potrzeby procesów archiwizacji.
Przewodnik po mapowaniu API
| Asprise OCR | Odpowiednik IronOCR |
|---|---|
Ocr.SetUp() |
Nie jest wymagane |
new Ocr() |
new IronTesseract() |
ocr.StartEngine("eng", Ocr.SPEED_FAST) |
Nie jest wymagane (silnik inicjuje się przy pierwszym użyciu) |
ocr.Recognize(path, type, format) |
ocr.Read(path) |
Ocr.RECOGNIZE_TYPE_TEXT |
Domyślne zachowanie |
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.Words / wynik strukturalny |
Ocr.OUTPUT_FORMAT_PDF |
result.SaveAsSearchablePdf() |
Ocr.SPEED_FASTEST |
ocr.Configuration ustawienia prędkości |
Ocr.SPEED_FAST |
Konfiguracja domyślna |
Ocr.SPEED_SLOW |
Konfiguracja wyższej dokładności |
ocr.StopEngine() |
Nie wymagane (using zajmuje się sprzątaniem) |
Ciąg językowy "eng+fra" |
ocr.Language = OCRLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French) |
| Ręczne czyszczenie try/finally | using var input = new OcrInput() |
| Wartość zwracana ciągu błędu | Standardowe wyjątki.NET/Standard |
Kiedy zespoły rozważają przejście z Asprise na IronOCR
Przeszkoda w gotowości produkcyjnej
Ograniczenie dotyczące wątków stanowi poważną przeszkodę dla większości produkcyjnych obciążeń .NET. Zespół tworzy funkcję OCR przy użyciu Asprise Lite podczas rozwoju — testy jednowątkowe przebiegają pomyślnie, wszystko działa. Następnie funkcja trafia do środowiska stagingowego za interfejsem API.NET/Core, pojawiają się równoczesne żądania testowe, a aplikacja albo generuje błędy, albo działa w stanie niezgodnym z wymaganiami technicznymi. Rozwiązaniem jest albo przejście na wersję Enterprise (z związanymi z tym kosztami i zaangażowaniem działu sprzedaży), albo wymiana biblioteki. Zespoły, które osiągają ten etap podczas testów, a nie w środowisku produkcyjnym, mają szczęście; osoby, które odkryją to po uruchomieniu, staną przed koniecznością pilniejszej migracji.IronOCR usuwa całą tę klasę problemów — licencja $999 Lite wspiera przetwarzanie żądań jednoczesnych, równoległość wsadową, Usługi Windows i funkcje chmurowe bez ograniczeń.
Koszt złożoności wdrożenia
Zespoły działające w nowoczesnych środowiskach wdrożeniowych — kontenerach Docker, maszynach wirtualnych Linux, podach Kubernetes — ponoszą w ramach Asprise stałe koszty utrzymania, które nie występują w przypadku samych pakietów NuGet. Każda kompilacja obrazu kontenera musi zawierać poprawny plik binarny dla architektury docelowej. Każdy potok CI/CD przeznaczony dla wielu platform musi obsługiwać dołączanie plików specyficznych dla danej platformy. Brak biblioteki natywnej w produkcyjnym kontenerzeLinuxjest wykrywany w czasie wykonywania, a nie jest błędem kompilacji. Zespoły, które spędziły wiele godzin na debugowaniu 32-bitowej biblioteki DLL załadowanej do procesu 64-bitowego, doskonale rozumieją, ile to kosztuje. Wdrożenie IronOCR wyłącznie za pośrednictwem NuGet eliminuje całą tę kategorię niepowodzeń wdrożeniowych.
Problem z dokumentacją Java
Zespoły tworzące aplikacje.NET/potrzebują przykładów w języku C#, a nie w Javie. Podstawowa dokumentacja Asprise, Dokumentacja API i zasoby społeczności są skierowane do programistów Java. Programista.NET/czytający dokumentację Asprise przekłada składnię Javy, konwencje pakietówJavaoraz wzorce specyficzne dla Javy na odpowiedniki w języku C# — czasami tłumaczenie nie jest bezpośrednie, ponieważ opakowanie.NET/nie udostępnia wszystkich funkcji po stronie Javy. Dokumentacja, samouczki i przykłady kodu IronOCRsą przeznaczone dla programistów C#. Samouczek dotyczący odczytywania tekstu z obrazów oraz pełne centrum samouczków zawierają działające przykłady w języku C# dla każdej funkcji, bez dodatkowych kosztów związanych z tłumaczeniem.
Luka w procesie przetwarzania plików PDF
Zespoły przetwarzające zeskanowane dokumenty, faktury, umowy lub formularze w formacie PDF nie mogą korzystać z Asprise bez dodania biblioteki renderującej pliki PDF do swojego wykresu zależności. Ta biblioteka renderująca wiąże się z własnymi kwestiami licencyjnymi, obciążeniem związanym z utrzymaniem oraz potencjalnymi niezgodnościami. Dla zespołów, które potrzebują OCR + PDF w jednym pakiecie,IronOCR obsługuje obie funkcje natywnie. Możliwość tworzenia plików PDF z funkcją wyszukiwania na podstawie zeskanowanych danych — powszechny wymóg w procesach archiwizacji i zapewniania zgodności — nie ma odpowiednika w żadnym poziomie licencji Asprise.
Luka w pokryciu językowym
Asprise obsługuje ponad 20 języków OCR.IronOCR obsługuje ponad 125 narzędzi, z których każde można zainstalować jako niezależny pakiet NuGet. Zespoły przetwarzające dokumenty w języku arabskim, hindi, tajskim lub w jednym z kilkudziesięciu innych języków obsługiwanych przez IronOCR, ale nie przez Asprise, nie mają dostępu do obsługi wielojęzycznej za pośrednictwem Asprise. Przewodnik dotyczący wielu języków obejmuje instalację i łączenie pakietów językowych, w tym rozpoznawanie jednoczesne w wielu alfabetach.
Typowe kwestie związane z migracją
Zastępowanie kodu cyklu życia silnika
Największą mechaniczną zmianą podczas migracji jest usunięcie wzorca cyklu życia silnika Asprise i zastąpienie go bezpośrednią inicjalizacją IronTesseract. Każde wystąpienie sekwencji SetUp() / StartEngine() / Recognize() / StopEngine() staje się jednym wywołaniem Read():
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After:IronOCR(1 line)
return new IronTesseract().Read(imagePath).Text;
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After:IronOCR(1 line)
return new IronTesseract().Read(imagePath).Text;
' Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine()
End Try
' After: IronOCR (1 line)
Return New IronTesseract().Read(imagePath).Text
Dla kodu wrażliwego na wydajność, który przetwarza wiele dokumentów sekwencyjnie, ponownie użyj instancji IronTesseract zamiast tworzyć nową dla każdego wywołania — inicjalizacja silnika niesie ze sobą narzut, a pojedyncza instancja używana w sposób sekwencyjny jest bardziej efektywna niż tworzenie i usuwanie jednej dla każdego dokumentu.
Zastępowanie kodów językowych opartych na ciągach znaków
Asprise używa parametrów ciągów znaków do wyboru języka ("eng", "fra", "eng+fra").IronOCR używa mocno typizowanego enumeratora OcrLanguage z API języka drugorzędnego. Przewodnik po wielu językach zawiera dostępne identyfikatory języków oraz pakiety NuGet wymagane dla każdego z nich:
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After:IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After:IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
Imports IronOcr
' Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST)
' After: IronOCR strongly-typed language enum
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.French)
Dim result = ocr.Read(imagePath)
Zastępowanie sprawdzania ciągów błędów
W przypadku niepowodzenia rozpoznawania Asprise zwraca wartość null lub ciąg znaków poprzedzony prefiksem błędu.IronOCR generuje wyjątki .NET. Zastąp kontrolę null i prefiksów ciągów znaków standardowymi blokami try/catch. Dzięki temu obsługa błędów OCR jest spójna z pozostałą częścią modelu obsługi wyjątków.NET/i zapewnia dostęp do pełnych śladów stosu oraz hierarchii typów wyjątków, a nie tylko do przeanalizowanych ciągów błędów.
Włączanie przetwarzania równoległego
Po migracji, istniejące pętle wsadowe foreach mogą być przekonwertowane na Parallel.ForEach lub PLINQ bez żadnych obaw licencyjnych. W przypadku partii dokumentów, które wcześniej były przetwarzane sekwencyjnie w trybie Lite/STANDARD, równoległość stanowi bezpośredni mnożnik przepustowości. Przewodnik po asynchronicznym OCR obejmuje wzorce asynchroniczne dla kontekstów aplikacji internetowych, w których nieblokujące OCR jest preferowane w stosunku do nasycenia puli wątków.
Dodatkowe możliwości IronOCR
Oprócz obszarów objętych tym porównaniem,IronOCR oferuje funkcje, które nie mają odpowiednika w Asprise:
- Odczyt kodów kreskowych podczas OCR: Włącz
ocr.Configuration.ReadBarCodes = true, aby wyodrębnić kody kreskowe i kody QR z dokumentów w tym samym przebiegu co rozpoznawanie tekstu — nie jest wymagana druga biblioteka. - OCR oparte na regionach: Użyj
CropRectangledo wyodrębniania tekstu z określonych obszarów dokumentu, przydatne dla nagłówków faktur, pól formularzy i stref danych strukturalnych. - Wyniki pewności: Dostęp do wartości pewności rozpoznawania poszczególnych WORD-ów oraz ogólnej pewności rozpoznawania, aby oznaczyć fragmenty o niskiej pewności do weryfikacji przez człowieka.
- Pobieranie danych ustrukturyzowanych: Przeglądaj obiekty wyników według stron, akapitów, wierszy i słów, z których każdy zawiera współrzędne pikselowe — umożliwiając analizę dokumentów z uwzględnieniem układu, wykraczającą poza zwykły tekst.
- Eksport hOCR: Eksport wyników rozpoznawania w formacie hOCR w celu integracji z narzędziami do dalszego przetwarzania dokumentów.
- Specjalistyczne rozpoznawanie dokumentów: specjalnie zaprojektowane procesy dla paszportów, czeków MICR, tablic rejestracyjnych i pisma ręcznego, wykraczające poza ogólne możliwości rozpoznawania Tesseract.
- Śledzenie postępów: Subskrybuj zdarzenia postępu podczas długotrwałych operacji wsadowych w celu uzyskania informacji zwrotnej i monitorowania interfejsu użytkownika.
Zgodność z platformą.NETi gotowość na przyszłość
IronOCR jest przeznaczony dla platformy.NET/Standard 2.0, która obejmuje.NET/Framework 4.6.1+,.NETCore 2.0+ oraz wszystkie wersje od.NET5 do.NET9 i nowsze. Biblioteka jest regularnie aktualizowana zgodnie z cyklami wydawniczymi platformy.NET/i jest testowana na systemach Windows x64, Windows x86,Linuxx64, macOS, Docker, Azure App Service oraz AWS Lambda. Kompatybilność Asprise z platformą.NETjest ograniczona przez natywny model binarny — nowe platformy docelowe (ARM64, WASM) wymagają nowych kompilacji natywnych od Asprise Inc., a rytm wydawania nowych wersji oparty na Javie oznacza, że aktualizacje platformy.NET/mogą pozostawać w tyle. Dla zespołów, które obecnie korzystają z.NET8 i.NET9, a planują przejść na.NET10 w 2026 r., zarządzana architektura NuGet firmy IronOCR zapewnia prostą ścieżkę kompatybilności bez obaw związanych z natywnymi plikami binarnymi.
Wnioski
Asprise OCR to biblioteka OCR dla językaJavaz nakładką .NET. Dziedzictwo Javy nie jest przypadkowe — określa ono model wdrażania (natywne biblioteki DLL specyficzne dla platformy), styl API (metody cyklu życia w stylu C z stałymi całkowitoliczbowymi), język dokumentacji (przykłady w Javie wymagające tłumaczenia) oraz ograniczenia dotyczące wątków (LITE/STANDARD jednowątkowe zgodnie z umową licencyjną). Dla zespołów Java, które realizują projekt .NET, wielojęzyczne pozycjonowanie Asprise ma sens. Dla zespołów.NET/tworzących systemy produkcyjne te same cechy powodują utrudnienia na każdym etapie.
Szczególną uwagę należy zwrócić na ograniczenie dotyczące wątków. Dwa najtańsze poziomy Asprise — które obejmują większość zespołów oceniających produkt — nie pozwalają na wykonywanie wielowątkowe i wieloprocesowe. Każde ASP.NET Core Web API, każda Usługa Windows z kolejką zadań oraz każda funkcja Azure obsługująca jednoczesne wyzwalacze: to są standardowe wzorce produkcyjne .NET, a wszystkie z nich wymagają licencji ENTERPRISE od Asprise. Licencja IronOCR$999 Lite obejmuje je wszystkie bez ograniczeń.
Złożoność wdrożenia to druga kwestia praktyczna. Zespoły uruchamiające kontenery Docker, budujące na Linuxie lub wykorzystujące międzyplatformowe CI/CD muszą zarządzać platformowo-specyficznymi binariami natywnymi z Asprise. Te błędy — DllNotFoundException, BadImageFormatException — pojawiają się podczas uruchamiania na docelowej infrastrukturze, nie podczas budowy.IronOCR wdraża się przez standardowe zarządzanie pakietami NuGet, a mechanizm wyboru pakietów zajmuje się wewnętrznie platformowo-specyficznymi binariami. Powierzchnia wdrożeniowa to pojedyncze odwołanie NuGet.
Dla zespołów.NET/rozpoczynających nową integrację OCR, punkt startowy jest jasny: pojedynczy dotnet add package IronOcr, przypisanie klucza licencyjnego jednoliniowe i new IronTesseract().Read("document.jpg").Text dla pierwszego wyniku. Brak inicjalizacji silnika, brak pozyskiwania natywnych plików binarnych, brak audytu licencji dotyczących wątków.
Często Zadawane Pytania
Czym jest Asprise OCR SDK?
Asprise OCR SDK to rozwiązanie OCR wykorzystywane przez programistów i przedsiębiorstwa do wyodrębniania tekstu z obrazów i dokumentów. Jest to jedna z kilku opcji OCR ocenianych obok IronOCR for .NET pod kątem tworzenia aplikacji .NET.
Jak IronOCR wypada w porównaniu z Asprise OCR SDK dla programistów .NET?
IronOCR to natywna dla NuGet biblioteka OCR dla platformy .NET, wykorzystująca IronTesseract jako główny silnik. W porównaniu z Asprise OCR SDK oferuje prostsze wdrożenie (brak instalatorów SDK), ryczałtowe ceny oraz przejrzysty interfejs API w języku C# bez interoperacyjności COM i zależności od chmury.
Czy IronOCR jest łatwiejszy w konfiguracji niż Asprise OCR SDK?
IronOCR instaluje się za pomocą jednego pakietu NuGet. Nie ma żadnych instalatorów SDK, plików licencyjnych do skopiowania, komponentów COM do zarejestrowania ani oddzielnych plików binarnych środowiska uruchomieniowego, którymi trzeba by zarządzać. Cały silnik OCR jest zawarty w pakiecie.
Jakie różnice w dokładności występują między Asprise OCR SDK a IronOCR?
IronOCR osiąga wysoką dokładność rozpoznawania standardowych dokumentów biznesowych, faktur, paragonów i zeskanowanych formularzy. W przypadku dokumentów o bardzo niskiej jakości lub rzadkich skryptów dokładność zależy od jakości źródła. IronOCR zawiera filtry wstępnego przetwarzania obrazu, które poprawiają rozpoznawanie danych wejściowych o niskiej jakości.
Czy IronOCR obsługuje wyodrębnianie tekstu z plików PDF?
Tak. IronOCR wyodrębnia tekst zarówno z natywnych plików PDF, jak i ze skanowanych obrazów PDF za pomocą jednego wywołania. Obsługuje również wielostronicowe pliki TIFF, obrazy i strumienie. W przypadku skanowanych plików PDF OCR jest stosowany strona po stronie, z obiektami wynikowymi dla każdej strony.
Jak wygląda licencjonowanie Asprise OCR SDK w porównaniu z IronOCR?
IronOCR korzysta z licencji wieczystej o stałej stawce, bez opłat za stronę lub skan. Organizacje przetwarzające duże ilości dokumentów płacą ten sam koszt licencji niezależnie od ilości. Szczegóły i ceny hurtowe znajdują się na stronie licencji IronOCR.
Jakie języki obsługuje IronOCR?
IronOCR obsługuje 127 języków za pośrednictwem oddzielnych pakietów językowych NuGet. Dodanie języka wymaga wykonania pojedynczego polecenia „dotnet add package IronOcr.Languages.{Language}”. Nie jest wymagane ręczne umieszczanie plików ani konfiguracja ścieżek.
Jak zainstalować IronOCR w projekcie .NET?
Instalacja przez NuGet: „Install-Package IronOcr” w konsoli menedżera pakietów lub „dotnet add package IronOcr” w CLI. Dodatkowe pakiety językowe instaluje się w ten sam sposób. Nie jest wymagany natywny instalator SDK.
Czy IronOCR nadaje się do wdrożeń w Dockerze i kontenerach, w przeciwieństwie do Asprise OCR?
Tak. IronOCR działa w kontenerach Docker za pośrednictwem pakietu NuGet. Klucz licencyjny jest ustawiany za pomocą zmiennej środowiskowej. Silnik OCR nie wymaga żadnych plików licencyjnych, ścieżek SDK ani montowania woluminów.
Czy mogę wypróbować IronOCR przed zakupem, w porównaniu z Asprise OCR?
Tak. Tryb próbny IronOCR przetwarza dokumenty i zwraca wyniki OCR z nakładką znaku wodnego na wyjściu. Przed zakupem licencji można sprawdzić dokładność na własnych dokumentach.
Czy IronOCR obsługuje odczytywanie kodów kreskowych oprócz wyodrębniania tekstu?
IronOCR koncentruje się na wyodrębnianiu tekstu i OCR. Do odczytu kodów kreskowych firma Iron Software udostępnia bibliotekę IronBarcode jako dodatek. Obie biblioteki są dostępne osobno lub w ramach pakietu Iron Suite.
Czy łatwo jest przejść z Asprise OCR SDK na IronOCR?
Migracja z Asprise OCR SDK do IronOCR zazwyczaj obejmuje zastąpienie sekwencji inicjalizacyjnych instancjonowaniem IronTesseract, usunięcie zarządzania cyklem życia COM oraz aktualizację wywołań API. Większość migracji znacznie zmniejsza złożoność kodu.

