OCR w Azure vs. IronOCR: Które rozwiązanie do optycznego rozpoznawania znaków najlepiej pasuje do projektów .NET?
Windows.Media.OCR jest dostarczany bezpłatnie z każdą instalacją systemu Windows 10 i Windows 11, co czyni go atrakcyjnym rozwiązaniem, dopóki nie spróbujesz wdrożyć tej samej aplikacji na serwerze Linux, w kontenerzeDockerlub w funkcjiAWS Lambda— w tym momencie API po prostu nie istnieje. Uzależnienie od platformy nie jest w przypadku tej biblioteki sytuacją skrajną; jest to decydujące ograniczenie. Każda decyzja architektoniczna wynikająca z wyboru Windows.Media.OCR wynika z wymogu, aby systemem operacyjnym hosta był komputer stacjonarny z systemem Windows 10 lub Windows 11 albo serwer klasy konsumenckiej. Bez Linuksa, bez macOS, bez Docker, bez Azure Functions na Linuksie, bez AWS Lambda. Dla programistów tworzących wewnętrzne narzędzia dla systemu Windows, którzy nie planują wykraczać poza tę granicę, cena 0 USD jest trudna do podważenia. Dla wszystkich pozostałych osób ukrytym kosztem jest przepisywanie OCR do zupełnie innego systemu, gdy zmieniają się wymagania wdrożeniowe.
Zrozumienie Windows.Media.OCR
Windows.Media.Ocr jest częścią interfejsu API Windows Runtime (WinRT) wprowadzonego w Windows 8.1 i udoskonalonego dla Windows 10 i 11. Udostępnia klasę OcrEngine w przestrzeni nazw Windows.Media.Ocr, która akceptuje SoftwareBitmap — sam w sobie typ WinRT z Windows.Graphics.Imaging — i zwraca OcrResult zawierający rozpoznany tekst i geometrię linii.
API jest oparte na kontrakcie async/await platformy WinRT. Każda operacja przepływa przez wywołania async Task wspierane przez mechanizm WinRT IAsyncOperation: ładowanie StorageFile, otwieranie strumienia, tworzenie BitmapDecoder, uzyskiwanie SoftwareBitmap, a dopiero potem wywoływanie RecognizeAsync. Od .NET 6, korzystanie z interfejsów API WinRT wymaga specyficznego dla Windows Monikera Docelowej Ramy (TFM) takiego jak net8.0-windows10.0.19041.0. Plik projektu bez tego TFM nie może kompilować kodu, który odnosi się do Windows.Media.Ocr, w ogóle — typy te po prostu nie istnieją w grafie zestawień.
Kluczowe cechy architektury:
- Tylko Windows 10/11 — interfejs API WinRT nie jest dostępny w systemieWindows Serverbez środowiska Desktop Experience we wszystkich konfiguracjach, a w systemachLinuximacOSjest całkowicie nieobecny
- Asynchroniczny model WinRT — całe rozpoznanie przepływa przez wywołania asynchroniczne wspierane przez
IAsyncOperation; nie istnieje synchroniczna sciezka - Pakiety językowe z systemu operacyjnego —
OcrEngine.TryCreateFromLanguageiTryCreateFromUserProfileLanguagesrozwiązują dostępne języki z pakietów językowych Windows zainstalowanych przez użytkownika lub administratora IT na tej konkretnej maszynie; nie ma modelu językowego w zestawie lub przenośnego - Wejście tylko obrazowe — API akceptuje bezpośrednio
SoftwareBitmap; na żadnej warstwie API nie istnieje ścieżka wejściowa PDF - Brak potoku przetwarzania wstępnego — surowa mapa bitowa jest przekazywana do modułu rozpoznającego; Korekcja obrotu, usuwanie szumów, poprawianie kontrastu i skalowanie rozdzielczości to zadania programisty, który korzysta z oddzielnych interfejsów API Windows Imaging.
- Brak możliwości wyszukiwania w pliku PDF — rozpoznany tekst jest zwracany jako zwykły ciąg znaków z geometrią wiersza; nie jest dostępna opcja eksportu do formatu PDF
- Wymagana specyficzna dla Windows TFM — pliki projektów muszą celować w
net*-windows*TFM, co uniemożliwia kompilację tego samego projektu między platformami
Stos asynchroniczny WinRT
Każda podstawowa operacja OCR w Windows.Media.Ocr wymaga przejścia przez wiele warstw interfejsu API WinRT, zanim rozpocznie się rozpoznawanie:
// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform
public async Task<string> ExtractTextAsync(string imagePath)
{
// Step 1: WinRT file system access
var file = await StorageFile.GetFileFromPathAsync(imagePath);
// Step 2: Open WinRT stream
using var stream = await file.OpenAsync(FileAccessMode.Read);
// Step 3: Create bitmap decoder
var decoder = await BitmapDecoder.CreateAsync(stream);
// Step 4: Decode to SoftwareBitmap
var bitmap = await decoder.GetSoftwareBitmapAsync();
// Step 5: Check language availability — null if not installed on this machine
var engine = OcrEngine.TryCreateFromLanguage(
new Windows.Globalization.Language("en-US"));
if (engine == null)
throw new Exception("OCR engine not available for this language");
// Step 6: Recognize
var result = await engine.RecognizeAsync(bitmap);
return result.Text;
}
// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform
public async Task<string> ExtractTextAsync(string imagePath)
{
// Step 1: WinRT file system access
var file = await StorageFile.GetFileFromPathAsync(imagePath);
// Step 2: Open WinRT stream
using var stream = await file.OpenAsync(FileAccessMode.Read);
// Step 3: Create bitmap decoder
var decoder = await BitmapDecoder.CreateAsync(stream);
// Step 4: Decode to SoftwareBitmap
var bitmap = await decoder.GetSoftwareBitmapAsync();
// Step 5: Check language availability — null if not installed on this machine
var engine = OcrEngine.TryCreateFromLanguage(
new Windows.Globalization.Language("en-US"));
if (engine == null)
throw new Exception("OCR engine not available for this language");
// Step 6: Recognize
var result = await engine.RecognizeAsync(bitmap);
return result.Text;
}
Imports System.Threading.Tasks
Imports Windows.Media.Ocr
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Storage.Streams
Imports Windows.Globalization
Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
' Step 1: WinRT file system access
Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)
' Step 2: Open WinRT stream
Using stream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)
' Step 3: Create bitmap decoder
Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
' Step 4: Decode to SoftwareBitmap
Dim bitmap As SoftwareBitmap = Await decoder.GetSoftwareBitmapAsync()
' Step 5: Check language availability — Nothing if not installed on this machine
Dim engine As OcrEngine = OcrEngine.TryCreateFromLanguage(New Language("en-US"))
If engine Is Nothing Then
Throw New Exception("OCR engine not available for this language")
End If
' Step 6: Recognize
Dim result As OcrResult = Await engine.RecognizeAsync(bitmap)
Return result.Text
End Using
End Function
Sprawdzenie null dla engine nie jest opcjonalne. Jeżeli celowy pakiet językowy nie jest zainstalowany na maszynie działającej z kodem, TryCreateFromLanguage zwraca null i rozpoznanie nie jest możliwe. Nie ma wersji awaryjnej; aplikacja musi wyświetlić użytkownikowi komunikat o błędzie lub zakończyć działanie bez komunikatu.
Zrozumienie IronOCR
IronOCR to komercyjna biblioteka OCR dla platformy .NET, oparta na zoptymalizowanym silniku Tesseract 5 z warstwą zarządzanego interfejsu API, która obsługuje przetwarzanie wstępne, odczyt plików PDF, rozpoznawanie wielu języków oraz generowanie danych strukturalnych. Instalacja odbywa się jako pojedynczy pakiet NuGet, bez konieczności oddzielnego wdrażania zewnętrznych plików binarnych, zarządzania folderami tessdata oraz stosowania plików TFM specyficznych dla danej platformy.
Kluczowe cechy:
- Zaprojektowana jako wielopłatformowa — działa na systemach Windows, Linux, macOS, Docker, Azure App Service (Windows lub Linux),AWS Lambdai GCP Cloud Run bez konieczności wprowadzania zmian w kodzie
- Automatyczne wstępne przetwarzanie — prostowanie, wyciszanie, zwiększanie kontrastu, binaryzacja i skalowanie rozdzielczości są stosowane automatycznie na słabej jakości wejściu, z możliwością ręcznej kontroli dostępnej poprzez metody filtra
OcrInput - Natywne wejście PDF —
IronTesseract.Readakceptuje ścieżki PDF bezpośrednio; bez etapu konwersji, bez biblioteki zewnętrznej - Ponad 125 wbudowanych języków — pakiety językowe to pakiety NuGet, które są wdrażane wraz z aplikacją; brak zależności od danych językowych zainstalowanych w systemie operacyjnym
- Wyjście PDF z możliwością przeszukiwania —
OcrResult.SaveAsSearchablePdftworzy PDF z warstwą tekstową z każdego zeskanowanego wejścia - Ustrukturyzowany model wynikowy —
OcrResultudostępniaPages,Paragraphs,Lines,Words, oraz oceny pewności per słowo i ramki ograniczające - Bezpieczny dla wątków — instancje
IronTesseractwspierają równoległe obciążenia robocze bez dodatkowej synchronizacji - Licencjonowanie wieczyste — $999 Lite po $5,999 Unlimited, jednorazowy zakup, przetwarzanie nieograniczonej liczby dokumentów
Porównanie funkcji
| Funkcja | Windows.Media.Ocr | IronOCR |
|---|---|---|
| Platforma | TylkoWindows 10/11 | Windows, Linux, macOS, Docker, chmura |
| Cena | Bezpłatne | $5,999 wieczysty |
| Plik wejściowy PDF | Nie | Język ojczysty |
| Model językowy | Pakiety zainstalowane w systemie operacyjnym | Ponad 125 pakietów dostępnych za pośrednictwem NuGet |
| Przetwarzanie wstępne | None | Filtry automatyczne + jawne |
| Wynik w formacie PDF z możliwością wyszukiwania | Nie | Tak |
| Model API | WinRT async | .NET Standard |
Szczegółowe porównanie funkcji
| Funkcja | Windows.Media.Ocr | IronOCR |
|---|---|---|
| Obsługa platform | ||
| Windows 10/11 | Tak | Tak |
| Windows Server | Ograniczone | Tak |
| Linux | Nie | Tak |
| macOS | Nie | Tak |
| Docker | Nie | Tak |
| Azure Functions (Linux) | Nie | Tak |
| AWS Lambda | Nie | Tak |
| Formaty danych wejściowych | ||
| JPEG / PNG / BMP | Tak (poprzez potok WinRT) | Tak |
| PDF (zeskanowany) | Nie | Tak |
| PDF (chroniony hasłem) | Nie | Tak |
| TIFF / wielostronicowy | Nie | Tak |
| Strumień / tablica bajtów | Nie (tylko WinRT StorageFile) | Tak |
| URL | Nie | Tak |
| Obsługa języków | ||
| Język źródłowy | Pakiety językowe zainstalowane w systemie operacyjnym | Ponad 125 pakietów NuGet w zestawie |
| Instalacja bez uprawnień administratora systemu | Nie | Tak (NuGet) |
| Wielojęzyczne tłumaczenie symultaniczne | Nie | Tak |
| Przenośność językowa między komputerami | Nie | Tak |
| Przetwarzanie wstępne | ||
| Wyrównanie | Nie | Tak (input.Deskew()) |
| Denoize | Nie | Tak (input.DeNoise()) |
| Wzmocnienie kontrastu | Nie | Tak (input.Contrast()) |
| Binaryzacja | Nie | Tak (input.Binarize()) |
| Skalowanie rozdzielczości | Nie | Tak (input.EnhanceResolution(300)) |
| Wynik | ||
| Zwykły tekst | Tak | Tak |
| PDF z funkcją wyszukiwania | Nie | Tak |
| hOCR / HTML | Nie | Tak |
| Ramki ograniczające na poziomie WORD | Częściowe (geometria linii) | Tak |
| Wyniki pewności dla poszczególnych słów | Nie | Tak |
| Projektowanie API | ||
| Ograniczenie TFM | wymagane net*-windows* |
None |
| Ścieżka synchroniczna | Nie | Tak |
| Odczytywanie BarCode podczas OCR | Nie | Tak |
| OCR oparte na regionie | Nie | Tak |
Związanie z platformą a wdrażanie wielopłatformowe
Najważniejszą różnicą między tymi dwiema bibliotekami nie jest dokładność, przetwarzanie wstępne ani obsługa plików PDF — jest nią topologia wdrożenia. Windows.Media.OCR nie istnieje poza systemem Windows 10/11. Nie jest to problem konfiguracyjny ani brakujący pakiet NuGet; Środowisko uruchomieniowe WinRT, które obsługuje API, nie występuje w żadnym innym systemie operacyjnym.
Podejście Windows.Media.OCR
Zależność od WinRT pojawia się w pliku projektu, zanim zostanie uruchomiona choćby jedna linijka kodu. TargetFramework musi określać wersję platformy Windows:
<PropertyGroup>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>
Z tym plikiem TFM projekt nie może być używany z kontenera Linux. ObrazDockeroparty na mcr.microsoft.com/dotnet/aspnet:8.0 — standardowym obrazie bazowymLinuxdla wdrożeń ASP.NET — nie ma runtime WinRT. Próba odniesienia do typów Windows.Media.Ocr w projekcie docelowym net8.0 (bez przyrostka Windows) powoduje błędy kompilacji, a nie błędy czasu wykonania. Ograniczenie to jest egzekwowane w czasie kompilacji.
Gdy pojawiają się wymagania dotyczące OCR w architekturze mikrousług, gdzie moduł OCR działa na systemie Linux, lub w potoku CI/CD, który generuje wielopłatformowe obrazy Docker, Windows.Media.Ocr nie wchodzi w grę — jest eliminowany jeszcze przed pierwszym spike'iem.
Podejście IronOCR
IronOCR obsługuje net6.0, net7.0, net8.0, i net9.0 bez specyficznych dla platform TFM. Ten sam pakiet NuGet i ten sam plik binarny aplikacji działają w systemach Windows,Linuxi macOS. Wdrożenie IronOCR do Docker wymaga jednej linii apt-get dla libgdiplus na bazowym obrazie Linux, nic więcej:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
#Linuxdependency for System.Drawing
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
Sam kod aplikacji pozostaje niezmieniony w wersjach dla systemów Windows i Linux:
// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// Nie platform TFM, no WinRT, no conditional compilation
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// Nie platform TFM, no WinRT, no conditional compilation
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read("document.jpg").Text
IronOCR działa na AWS Lambda, Azure Functions w systemie Linux oraz bezpośrednio na serwerach Linux bez konieczności modyfikacji kodu. Cel wdrożenia jest kwestią konfiguracji, a nie ograniczeniem architektonicznym.
Obsługa języków: zależność od systemu operacyjnego a pakiety dołączone do oprogramowania
Windows.Media.OCR całkowicie przekazuje dostępność języków komputerowi hosta. Zestaw języków, które aplikacja może rozpoznać, zależy od tego, jakie pakiety językowe użytkownik — lub administrator IT — zainstalował w tej konkretnej instalacji systemu Windows. Powoduje to powstanie klasy błędu produkcyjnego, która nie ma nic wspólnego z Twoim kodem.
Podejście Windows.Media.OCR
OcrEngine.TryCreateFromLanguage zwraca null, gdy żądany język nie jest zainstalowany. TryCreateFromUserProfileLanguages zwraca null, gdy nie istnieje żaden pakiet językowy zdolny do OCR. Obie ścieżki wymagają obsługi wartości null i żadna z nich nie zapewnia płynnego powrotu do normalnego działania — nie ma możliwości zainstalowania języka z kodu ani dołączenia go do aplikacji:
// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine
var engine = OcrEngine.TryCreateFromLanguage(
new Windows.Globalization.Language("fr-FR"));
if (engine == null)
{
// French OCR is simply unavailable — no recovery path
// User must go to Windows Settings > Language to install French
throw new InvalidOperationException(
"French OCR unavailable. Install the French language pack in Windows Settings.");
}
var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine
var engine = OcrEngine.TryCreateFromLanguage(
new Windows.Globalization.Language("fr-FR"));
if (engine == null)
{
// French OCR is simply unavailable — no recovery path
// User must go to Windows Settings > Language to install French
throw new InvalidOperationException(
"French OCR unavailable. Install the French language pack in Windows Settings.");
}
var result = await engine.RecognizeAsync(bitmap);
Imports Windows.Globalization
Imports Windows.Media.Ocr
' Windows.Media.Ocr: language availability is a runtime unknown
' Returns Nothing if the language pack is not installed on this machine
Dim engine = OcrEngine.TryCreateFromLanguage(New Language("fr-FR"))
If engine Is Nothing Then
' French OCR is simply unavailable — no recovery path
' User must go to Windows Settings > Language to install French
Throw New InvalidOperationException("French OCR unavailable. Install the French language pack in Windows Settings.")
End If
Dim result = Await engine.RecognizeAsync(bitmap)
Wdrożenie wielojęzycznej aplikacji do przetwarzania dokumentów z wykorzystaniem Windows.Media.OCR wymaga koordynacji instalacji pakietów językowych Windows na wszystkich komputerach w środowisku docelowym. Na serwerze współdzielonym lub komputerze użytkownika zarządzanym przez zasady grupy nie leży to w gestii programisty.
Podejście IronOCR
IronOCR dostarcza modele językowe jako dedykowane pakiety NuGet, które są wdrażane wraz z plikiem binarnym aplikacji. Dane językowe są przenoszone wraz z artefaktem kompilacji, a nie wraz z konfiguracją systemu operacyjnego. Wsparcie dla 125+ języków jest operacją dotnet add package:
dotnet add package IronOcr.Languages.French, IronOcr.Languages.German, IronOcr.Languages.Arabic, IronOcr.Languages.ChineseSimplified
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
Imports IronOcr
' IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)
' Works on any machine, any OS, zero OS configuration required
Dim result = ocr.Read("multilingual-document.jpg")
Console.WriteLine(result.Text)
Pełny katalog języków obejmuje łacinę, CJK, arabski, hebrajski, dewanagari, cyrylicę oraz zestawy specjalistyczne, w tym notację matematyczną. Każdy pakiet językowy jest powiązany z wersją pakietu IronOCR, dzięki czemu model językowy w środowisku produkcyjnym odpowiada modelowi testowanemu lokalnie.
Brak przetwarzania wstępnego
Skanów niskiej jakości — lekko obróconych stron, fotokopii tekstu z plamkami, wyblakłego atramentu na papierze w kolorze złamanej bieli — powodują niską dokładność OCR w każdym silniku, który otrzymuje je w niezmienionej postaci. Przetwarzanie wstępne koryguje te błędy przed uruchomieniem rozpoznawania. Windows.Media.OCR nie zapewnia żadnej warstwy przetwarzania wstępnego.
Podejście Windows.Media.OCR
API akceptuje SoftwareBitmap i zwraca tekst. Nie można konfigurować jakości obrazu między tymi dwoma punktami. Deweloperzy, którzy potrzebują poprawić dokładność na suboptymalnym wejściu, muszą samodzielnie zaimplementować przetwarzanie wstępne używając API Windows Imaging Component przed skonstruowaniem SoftwareBitmap. Jest to oddzielna baza kodu, która wymaga własnej konserwacji i pozostaje specyficzna dla systemu Windows z tego samego powodu, co samo API OCR:
// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option
var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option
var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
Imports System.Threading.Tasks
' Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
' Skewed, noisy, or low-resolution images degrade accuracy with no remedy
' Manual preprocessing via separate Windows Imaging APIs is the only option
Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
' bitmap goes directly to recognition with no quality improvement
Dim result = Await engine.RecognizeAsync(bitmap)
W przypadku standardowych, wyraźnych skanów dokumentów (kontrolowane środowisko skanowania, stałe oświetlenie, co najmniej 300 DPI, prawidłowa orientacja) ograniczenie to jest do pokonania. W przypadku potoków przetwarzania dokumentów, które odbierają obrazy z aparatów w telefonach komórkowych, skanerów płaskich z automatycznym podawaniem i przesunięciem, dokumentów faksowanych lub materiałów fotokopiowanych, oznacza to albo zbudowanie warstwy przetwarzania wstępnego od podstaw, albo pogodzenie się z obniżeniem dokładności.
Podejście IronOCR
Klasa OcrInputIronOCR zapewnia pipeline przetwarzania wstępnego z indywidualnymi metodami filtra, które stosują się w kolejności. Filtry korekcji jakości obrazu eliminują najczęstsze czynniki obniżające dokładność podczas przetwarzania dokumentów produkcyjnych:
// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation up to ~40 degrees
input.DeNoise(); // Remove scanner speckle and compression artifacts
input.Contrast(); // Boost contrast on faded or washed-out text
input.Binarize(); // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation up to ~40 degrees
input.DeNoise(); // Remove scanner speckle and compression artifacts
input.Contrast(); // Boost contrast on faded or washed-out text
input.Binarize(); // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' IronOCR: explicit preprocessing pipeline
' Each filter targets a specific quality defect
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct page rotation up to ~40 degrees
input.DeNoise() ' Remove scanner speckle and compression artifacts
input.Contrast() ' Boost contrast on faded or washed-out text
input.Binarize() ' Convert to black/white with optimal threshold
input.EnhanceResolution(300) ' Scale image to 300 DPI for recognition
Dim result = New IronTesseract().Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
W przypadku powszechnego przypadku,IronOCR stosuje automatyczne przetwarzanie wstępne, gdy wywołuje Read bezpośrednio na ścieżce pliku — silnik wykrywa problemy z jakością i koryguje je bez konieczności ręcznej konfiguracji filtra. Samouczek filtrów obrazu obejmuje pełen zestaw filtrów w tym Sharpen, Dilate, Erode, Invert, i ToGrayScale dla specjalnych scenariuszy. Filtry korekcji kolorów i korekcji orientacji rozszerzają możliwości przetwarzania dokumentów o niestandardowych profilach kolorów lub obróconych o wiele kątów.
Brak obsługi formatu PDF
PDF jest dominującym formatem dokumentów w środowiskach Enterprise. Umowy, faktury, zeskanowane archiwa i formularze urzędowe są dostarczane w formacie PDF. Windows.Media.OCR nie obsługuje plików PDF — akceptuje wyłącznie dane obrazówe. OCR dokumentu PDF wymaga oddzielnej biblioteki do renderowania plików PDF, rasteryzacji strona po stronie oraz ręcznego zestawiania wyników.
Podejście Windows.Media.OCR
W API nie ma ścieżki do pliku PDF. Aby przeprowadzić OCR zeskanowanego PDF za pomocą Windows.Media.Ocr, programista musi: wyrenderować każdą stronę do SoftwareBitmap używając oddzielnej biblioteki renderowania PDF (żadna z nich nie jest wbudowana w Windows), iterować przez strony, wywoływać RecognizeAsync dla każdej strony i ręcznie sklejać wyniki. Sama biblioteka renderująca wiąże się z dodatkowymi kwestiami dotyczącymi licencji i wdrażania. Kod Windows.Media.OCR stanowi niewielką część całej implementacji:
// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs
// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
throw new Exception("No OCR language available");
// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs
// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
throw new Exception("No OCR language available");
// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
' Windows.Media.Ocr: no PDF support
' Requires external PDF renderer to rasterize pages before OCR
' Conceptual pattern — a PDF rendering library is not provided by Windows APIs
' Step 1: Use external PDF library to render page to bitmap (not shown)
' Step 2: Pass rendered bitmap to Windows OCR
' Dim bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex) ' external library required
Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
If engine Is Nothing Then
Throw New Exception("No OCR language available")
End If
' Step 3: Recognize the rasterized page
' Dim result = Await engine.RecognizeAsync(bitmap)
' Step 4: Collect and concatenate results across all pages manually
Sam etap zewnętrznego renderowania plików PDF powoduje powstanie zależności, wymaga osobnej nauki obsługi i stanowi dodatkowe źródło błędów w rozwiązaniu, które początkowo miało być "bezpłatne i wbudowane".
Podejście IronOCR
IronOCR odczytuje pliki PDF w sposób natywny. Bez zewnętrznego renderera, bez etapu rasteryzacji, bez ręcznego składania stron. Ta sama metoda IronTesseract.Read, która akceptuje ścieżki obrazu, akceptuje także ścieżki PDF. OCR plików PDF w .NET to jedna linijka:
// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;
// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// PDF z funkcją wyszukiwania output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;
// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// PDF z funkcją wyszukiwania output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
' IronOCR: native PDF support — no external renderer needed
Dim text As String = New IronTesseract().Read("scanned-document.pdf").Text
' Password-protected PDFs
Using input As New OcrInput()
input.LoadPdf("encrypted.pdf", Password:="secret")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' PDF z funkcją wyszukiwania output: make a scanned PDF text-searchable
Dim ocrResult = New IronTesseract().Read("scanned-archive.pdf")
ocrResult.SaveAsSearchablePdf("searchable-output.pdf")
Funkcja przeszukiwalnego pliku PDF osadza warstwę tekstową na oryginalnym zeskanowanym obrazie, tworząc plik PDF, który zachowuje wierność wizualną, a jednocześnie umożliwia wyszukiwanie pełnotekstowe oraz kopiowanie i wklejanie. Jest to powszechny wymóg w przypadku systemów zarządzania dokumentami i archiwów zgodności. Windows.Media.OCR nie może wygenerować tego wyniku na żadnym poziomie swojego API.
Przewodnik po mapowaniu API
| Windows.Media.Ocr | Odpowiednik IronOCR |
|---|---|
OcrEngine.TryCreateFromLanguage(lang) |
new IronTesseract() z ocr.Language = OcrLanguage.X |
OcrEngine.TryCreateFromUserProfileLanguages() |
new IronTesseract() (domyślny język rozwiązywany automatycznie) |
engine.RecognizeAsync(softwareBitmap) |
ocr.Read("image.jpg") lub ocr.Read(ocrInput) |
OcrResult.Text |
OcrResult.Text |
OcrResult.Lines |
OcrResult.Lines (z rozszerzonymi metadanymi) |
OcrLine.Text |
OcrResult.Lines[i].Text |
OcrLine.Words |
OcrResult.Words (z ramkami ograniczającymi + pewnością) |
OcrWord.BoundingRect |
OcrResult.Words[i].X, .Y, .Width, .Height |
BitmapDecoder.CreateAsync(stream) |
input.LoadImage(stream) przez OcrInput |
StorageFile.GetFileFromPathAsync(path) |
ocr.Read("path") bezpośrednio |
| Brak odpowiednika (plik PDF nie jest obsługiwany) | ocr.Read("document.pdf") |
| Brak odpowiednika (plik PDF nie jest obsługiwany) | input.LoadPdf("file.pdf", Password: "x") |
| Brak odpowiednika (brak pliku PDF do przeszukiwania) | result.SaveAsSearchablePdf("output.pdf") |
| Brak odpowiednika (brak przetwarzania wstępnego) | input.Deskew(), input.DeNoise(), input.Contrast() |
| Brak odpowiednika (brak wersji wielojęzycznej) | ocr.AddSecondaryLanguage(OcrLanguage.X) |
| Brak odpowiednika (brak pewności) | result.Confidence, word.Confidence |
Kiedy zespoły rozważają przejście z Windows.Media.OCR na IronOCR
Aplikacja wykracza poza środowisko Windows Desktop
Najczęstszym czynnikiem wywołującym jest zmiana wymagań, która wprowadza cel wdrożenia inny niż Windows. Narzędzie desktopowe, które początkowo funkcjonowało jako wewnętrzne narzędzie systemu Windows, zostaje przekształcone w usługę internetową, mikrousługę opartą na Dockerze lub funkcję w chmurze. W momencie, gdy to nastąpi, Windows.Media.OCR staje się przeszkodą. Komponent OCR wymaga całkowitego przepisania, ponieważ API nie istnieje na platformie docelowej — nie ma portu, nie ma shimu kompatybilności ani flagi kompilacji warunkowej, która rozwiązałaby ten problem. Zespoły, które zaplanowały wszystko z wyprzedzeniem dzięki IronOCR, nie muszą zajmować się tym przepisywaniem.
Wymagania językowe przekraczają zainstalowane pakiety
Procesy przetwarzania dokumentów często rozszerzają zakres działania. System stworzony do przetwarzania faktur w języku angielskim musi teraz obsługiwać dokumenty w języku francuskim, niemiećkim, arabskim lub japońskim. W przypadku Windows.Media.OCR obsługa tych języków wymaga koordynacji instalacji pakietów językowych systemu operacyjnego we wszystkich miejscach wdrożenia — na komputerach programistów, maszynach wirtualnych do testów, serwerach produkcyjnych oraz wszelkich kontenerach w środowisku. W środowiskach zarządzanych przez zasady grupy lub w maszynach wirtualnych w chmurze o minimalnym obciążeniu systemu operacyjnego taka koordynacja jest niepraktyczna. Pakiety językowe IronOCR oparte na NuGet są wdrażane wraz z aplikacją i nie wymagają koordynacji z systemem operacyjnym.
Przetwarzanie plików PDF dodano do zakresu
Gdy pierwotnym wymaganiem było "OCR obrazów ze skanera płaskiego", sprawdza się Windows.Media.Ocr. Gdy wymagania rozszerzają się o "przetwarzanie zaległości zeskanowanych plików PDF w naszym archiwum", do stosu dołącza druga biblioteka. Ta biblioteka stanowi dodatkową zależność, dodatkowy aspekt licencyjny oraz dodatkowy obszar potencjalnych awarii. Zespoły, które potrzebują zarówno OCR obrazów, jak i OCR plików PDF w ramach ujednoliconego API, przekonują się, że IronOCR od samego początku eliminuje konieczność stosowania architektury opartej na dwóch bibliotekach.
Spadek dokładności przy danych wejściowych z rzeczywistych źródeł
Kontrolowane środowiska skanowania zapewniają czyste obrazy. Dane wejściowe pochodzące ze świata rzeczywistego — zdjęcia wykonane telefonami komórkowymi, lekko przekrzywione skany z płaskiego skanera, starsze dokumenty otrzymane faksem, materiały fotokopiowane — powodują pogorszenie dokładności, którego nie da się naprawić w ramach Windows.Media.OCR. Kiedy zaczynają napływać skargi klientów dotyczące brakującego tekstu, zespoły odkrywają, że pominięty etap przetwarzania wstępnego stał się konieczny. Modernizacja przetwarzania wstępnego przy użyciu interfejsów API Windows Imaging wymaga znacznego nakładu pracy programistycznej i sprawia, że rozwiązanie jest dostępne wyłącznie w systemie Windows. Potok przetwarzania wstępnego IronOCR już istnieje.
Pojawia się pytanie o wdrożenie serwera
Dokumentacja Windows.Media.OCR wyraźnie pozycjonuje API jako przeznaczone dla aplikacji klienckich. Uruchomienie go w kontekście serwera — aplikacji ASP.NET przetwarzającej dokumenty przesłane przez użytkowników, usługi Windows korzystającej z kolejki dokumentów — wymaga środowiskaWindows Serverz zainstalowanym Desktop Experience, które jest cięższym i droższym profilem maszyny wirtualnej niż kontener Linux. Gdy zespół ds. infrastruktury zapyta, czy moduł OCR może działać na instancji systemuLinuxw celu obniżenia kosztów hostingu, odpowiedź w przypadku Windows.Media.OCR brzmi: nie.
Typowe kwestie związane z migracją
Plik projektu Zmiana TFM
Windows.Media.Ocr wymaga specyficznego dla Windows TFM w pliku projektu (net8.0-windows10.0.19041.0 lub podobny). Usunięcie tej zależności w celu obsługi platform wielopłatformowych oznacza usunięcie przyrostka TFM.IronOCR obsługuje net6.0, net8.0, i net9.0 bez specyficznych dla Windows przyrostków. Podczas migracji należy upewnić się, że żadne inne zależności API WinRT w projekcie nie wymagają biblioteki Windows TFM — inne funkcje platformy Windows (integracja z powłoką, powiadomienia systemu Windows itp.) mogą wymagać abstrakcji za pomocą sprawdzania platformy.
Migracja z trybu asynchronicznego do synchronicznego
Windows.Media.Ocr jest w pełni asynchroniczny — RecognizeAsync zwraca IAsyncOperation<OcrResult>, który mapuje do Task<OcrResult> przez interoperacyjność WinRT.IronOCR zapewnia zarówno synchroniczne, jak i asynchroniczne ścieżki. Synchroniczne ocr.Read("file.jpg") bezpośrednio zastępuje wieloetapowy łańcuch await. W przypadku aplikacji serwerowych, w których wywołanie OCR znajduje się w usłudze działającej w tle lub w potoku opartym na zadaniach, dostępna jest również ścieżka asynchroniczna. Tak czy inaczej, przejście od ponad 6 asynchronicznych kroków do jednego wywołania jest proste:
// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;
// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;
// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Media.Ocr
' Before: Windows.Media.Ocr — 6+ await operations
Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)
Using stream = Await file.OpenAsync(FileAccessMode.Read)
Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
Dim winResult = Await engine.RecognizeAsync(bitmap)
Dim text As String = winResult.Text
End Using
' After: IronOCR— 1 call, same result, any platform
Dim text As String = New IronTesseract().Read(imagePath).Text
Zastąpienie pakietu językowego
Dla każdego języka wcześniej rozwiązawanego przez OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("fr-FR")), zainstaluj odpowiadający pakiet językowy IronOCR i ustaw ocr.Language = OcrLanguage.French. Katalog języków IronOCR zawiera listę wszystkich ponad 125 dostępnych pakietów. Kody językowe mapują się bezpośrednio z tagów BCP-47 do enumeracji OcrLanguage.
Usunięcie obsługi silnika Null
Windows.Media.OCR wymaga sprawdzania wartości null przy każdym wywołaniu tworzenia silnika.IronOCR zgłasza ustrukturyzowane wyjątki zamiast zwracać wartość null w przypadku niepowodzeń konfiguracji lub inicjalizacji. Należy usunąć klauzule zabezpieczające przed wartością null i w razie potrzeby zastąpić je standardową obsługą wyjątków. W rezultacie otrzymujemy bardziej przejrzystą stronę wywołania, pozbawioną błędu typu "język niedostępny w tle".
Dodatkowe możliwości IronOCR
Oprócz funkcji, które bezpośrednio zastępują funkcjonalność Windows.Media.OCR,IronOCR oferuje możliwości, dla których Windows.Media.OCR nie ma odpowiednika:
- Przetwarzanie zeskanowanych dokumentów — specjalnie zaprojektowana obsługa wielostronicowych archiwów skanów, w tym plików TIFF i wielostronicowych plików PDF
- Wyodrębnianie tabel — strukturalne wykrywanie danych tabelarycznych w dokumentach, takich jak pozycje faktur, siatki raportów i matryce formularzy
- Specjalistyczne typy dokumentów — strefy MRZ paszportów, linie czeków MICR, tablice rejestracyjne i tekst pisany odręcznie mają swoje dedykowane ścieżki przetwarzania
- Śledzenie postępów — operacje wsadowe informują o postępach za pomocą zdarzeń, umożliwiając wyświetlanie pasków postępu i monitorowanie szybkości przetwarzania w interfejsach użytkownika aplikacji
Zgodność z platformą .NET i gotowość na przyszłość
IronOCR obsługuje .NET 6, .NET 7, .NET 8 i .NET 9 na standardowych plikach TFM bez rozszerzeń specyficznych dla platformy, a także .NET Framework 4.6.2 do 4.8 w celu obsługi starszych aplikacji. Biblioteka jest regularnie aktualizowana zgodnie z harmonogramem wydawania platformy .NET, a wsparcie dla .NET 10 jest planowane na rok 2026. Windows.Media.OCR jest dostępny w każdej wersji .NET obsługującej współdziałanie z WinRT, począwszy od .NET 5, ale wymóg dotyczący Windows TFM trwałe ogranicza jego zastosowanie do projektów przeznaczonych dla systemu Windows. W miarę dojrzewania wielopłatformowej historii .NET — gdzie coraz więcej zespołów traktuje konteneryLinuxi funkcje chmurowe jako pierwszorzędne cele wdrożeniowe — ograniczenie TFM w Windows.Media.OCR staje się bardziej wyraźną odpowiedzialnością architektoniczną niż drobnym zastrzeżeniem.
Wnioski
Windows.Media.OCR zajmuje konkretną i uzasadnioną niszę: jest to aplikacja desktopowa dla systemuWindows 10/11bez ambicji wielopłatformowości, przeznaczona do podstawowych zadań OCR obrazów i charakteryzująca się ścisłym ograniczeniem budżetowym wynoszącym 0 USD. W tej niszy sprawdza się dobrze. Poza tą niszą — gdy wdrożenie ma na celu kontener Linux, funkcję chmury, serwer z wymaganiami dotyczącymi wielu języków lub potok dokumentów przetwarzający pliki PDF — API nie istnieje na platformie docelowej i kod musi zostać zastąpiony.
Głębszym problemem jest to, że ograniczenia Windows.Media.OCR mają charakter architektoniczny, a nie przypadkowy. Związanie z platformą nie jest flagą konfiguracyjną, którą można wyłączyć; jest wbudowany w środowisko uruchomieniowe WinRT, od którego zależy API. Dostępność języków nie jest pakietem do dołączenia w czasie kompilacji; jest to zadanie powierzone administratorom systemu operacyjnego. Obsługa plików PDF nie jest funkcją, której brakuje w pakiecie NuGet; jest całkowicie nieobecny w interfejsie API. Każde ograniczenie wymaga oddzielnego systemu, który je kompensuje, a każdy system kompensacyjny ponownie wprowadza zależności od platformy.
IronOCR spełnia wszystkie cztery wymagania — dotyczące platformy, języka, przetwarzania wstępnego i plików PDF — w jednym pakiecie. Cena wejściowa $999 nie wynosi 0 USD, a w przypadku narzędzia dla desktop z kontrolowanym wejściem i dokumentami tylko w języku angielskim, Windows.Media.Ocr pozostaje rozsądnym wyborem. Dla każdego projektu z szerszymi wymaganiami, koszt budowy wokół ograniczeń Windows.Media.Ocr może przewyższyć koszt licencji IronOCR w godzinach roboczych dewelopera, zanim projekt osiągnie swoje pierwsze wdrożenie produkcyjne.
Test praktyczny jest prosty: jeśli celem wdrożenia może być Linux,Dockerlub funkcja w chmurze, a dokumenty wejściowe mogą być plikami PDF lub pochodzić w językach innych niż domyślny pakiet systemu operacyjnego, Windows.Media.OCR nie jest właściwą podstawą. Odkrycie tego w trakcie projektu jest znacznie droższe niż wybór odpowiedniego narzędzia na samym początku. Najskuteczniejszym sposobem podjęcia decyzji jest ocena zestawu funkcji IronOCR pod kątem konkretnych wymagań przed podjęciem decyzji o wyborze jednego z kierunków.
Często Zadawane Pytania
Co to jest Windows.Media.Ocr?
Windows.Media.Ocr to rozwiązanie OCR, z ktorego korzystaja deweloperzy i przedsiebiorstwa, aby wydobyć tekst z obrazów i dokumentów. Jest to jedna z kilku opcji OCR ocenianych razem z IronOCR do tworzenia aplikacji .NET.
Jak IronOCR wypada w porownaniu z Windows.Media.Ocr dla deweloperow .NET?
IronOCR to natywna biblioteka OCR .NET w NuGet, wykorzystujaca IronTesseract jako swoj główny silnik. W porownaniu z Windows.Media.Ocr oferuje prostsze wdrożenie (bez instalatorow SDK), cennik staly i czysty interfejs API C# bez interop COM lub zewnętrznych zależności chmurowych.
Czy IronOCR jest łatwiejszy do skonfigurowania niz Windows.Media.Ocr?
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 roznice w dokładności istnieja miedzy Windows.Media.Ocr 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 porownuje sie licencjonowanie Windows.Media.Ocr i 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 sie do wdrozen w kontenerach Docker, w przeciwienstwie do Windows.Media.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ę wyprobowac IronOCR przed zakupem, w porownaniu z Windows.Media.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 przejsc z Windows.Media.Ocr na IronOCR?
Migracja z Windows.Media.Ocr na IronOCR zazwyczaj polega na zastepowaniu sekwencji inicjalizacyjnych instancjonowaniem IronTesseract, usunieciu zarządzania cyklem zycia COM i aktualizacji wywolan API. Wiekszosc migracji znacznie zmniejsza zlozonosc kodu.

