Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

IronOCR vs OCR oparte na LLM: Które powinni wybrać deweloperzy .NET?

Cztery pliki wzorcowe. To pierwsza rzecz, której wymaga RapidOCR.NET, zanim będzie można rozpoznać choćby jeden znak — model wykrywania, klasyfikator kierunku, model rozpoznawania i słownik znaków, z których każdy jest pobierany osobno ze strony wydania na GitHubie i łączony za pomocą wyraźnej konfiguracji ścieżki. Zanim pierwsze wywołanie engine.Run() zwróci wynik, już zarządzasz ręcznym pobieraniem, edytujesz ścieżki plików w kodzie, dodajesz zasady kopiowania MSBuild do .csproj i potwierdzasz, że natywne binaria ONNX Runtime odpowiadają Twojemu celowi wdrożenia. Dla zespołu oceniającego opcje OCR do wdrożenia produkcyjnego ta procedura konfiguracyjna stanowi pełną historię RapidOCR.NET.

Zrozumienie RapidOCR.NET

RapidOCR.NET to utrzymywana przez społeczność biblioteka .NET otaczająca projekt RapidOCR, który sam w sobie jest zoptymalizowanym pod kątem procesora portem modeli głębokiego uczenia się PaddleOCR firmy Baidu do formatu ONNX. Pakiet NuGet (RapidOcrNet) jest utrzymywany przez jednego dewelopera (BobLd na GitHub) na licencji Apache 2.0. Zrozumienie znaczenia pochodzenia: biblioteka znajduje się trzy warstwy abstrakcji od oryginalnej technologii — od Baidu PaddlePaddle, przez PaddleOCR, po konwersję RapidOCR ONNX stworzoną przez społeczność, aż po opakowanie .NET.

Kluczowe cechy architektury:

  • Wymóg modelu 4-plikowego: Detekcja (det.onnx), klasyfikator kierunku (cls.onnx), rozpoznawanie (rec.onnx) i słownik znaków (keys.txt) muszą być obecne w skonfigurowanych ścieżkach przed inicjalizacją silnika.
  • Zależność od ONNX Runtime: Wymaga Microsoft.ML.OnnxRuntime (CPU) lub Microsoft.ML.OnnxRuntime.Gpu (CUDA), co dodaje 30–50 MB do rozmiaru aplikacji. Pliki binarne środowiska uruchomieniowego muszą być zgodne z platformą wdrożeniową.
  • Ograniczenia językowe: Modele są szkolone głównie na języku chińskim i angielskim. Języki europejskie (hiszpański, francuski, niemiećki), alfabety cyrylickie (rosyjski, ukraiński), arabski, hebrajski i alfabety indyjskie nie są obsługiwane. Japoński i koreański mają ograniczone, tworzone przez społeczność modele eksperymentalne.
  • Dane wejściowe zawierające wyłącznie obrazy: RapidOCR.NET nie obsługuje natywnie plików PDF. Przetwarzanie pliku PDF wymaga zewnętrznej biblioteki renderującej do konwersji stron na obrazy, indywidualnego rozpoznawania tekstu (OCR) każdego obrazu oraz ręcznego ponownego złożenia wyników.
  • Opóźnienie przy zimnym starcie: Ładowanie modelu trwa 2–5 sekund przy pierwszym uruchomieniu i zużywa 300–500 MB pamięci w czasie wykonywania.
  • Skala społeczności: Projekt ma ograniczoną obecność na Stack Overflow, minimalną dokumentację poza plikiem README oraz brak komercyjnego wsparcia lub umowy SLA dotyczącej utrzymania.
  • Brak możliwości wyszukiwania w pliku PDF: biblioteka wyodrębnia tekst z obrazów. Nie można zapisywać wyników OCR z powrotem do pliku PDF jako warstwy tekstowej z możliwością wyszukiwania.

Obliczenia związane z konfiguracją 4-modelową

Każda aplikacja RapidOCR.NET rozpoczyna się od tego bloku inicjalizacyjnego, niezależnie od stopnia złożoności:

// RapidOcrNet: 4 paths required — any missing file throws at runtime
var engine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = "./models/det.onnx",      // ~3 MB download
    ClsModelPath = "./models/cls.onnx",      // ~1 MB download
    RecModelPath = "./models/rec_en.onnx",   // ~2–10 MB depending on language
    KeysPath     = "./models/en_keys.txt"    // ~100 KB character dictionary
});

// Text blocks returned — must be sorted and joined manually
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
    .OrderBy(b => b.BoundingBox.Top)
    .ThenBy(b => b.BoundingBox.Left)
    .Select(b => b.Text));
// RapidOcrNet: 4 paths required — any missing file throws at runtime
var engine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = "./models/det.onnx",      // ~3 MB download
    ClsModelPath = "./models/cls.onnx",      // ~1 MB download
    RecModelPath = "./models/rec_en.onnx",   // ~2–10 MB depending on language
    KeysPath     = "./models/en_keys.txt"    // ~100 KB character dictionary
});

// Text blocks returned — must be sorted and joined manually
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
    .OrderBy(b => b.BoundingBox.Top)
    .ThenBy(b => b.BoundingBox.Left)
    .Select(b => b.Text));
Imports System.Linq

' RapidOcrNet: 4 paths required — any missing file throws at runtime
Dim engine = New RapidOcrEngine(New RapidOcrOptions With {
    .DetModelPath = "./models/det.onnx",      ' ~3 MB download
    .ClsModelPath = "./models/cls.onnx",      ' ~1 MB download
    .RecModelPath = "./models/rec_en.onnx",   ' ~2–10 MB depending on language
    .KeysPath = "./models/en_keys.txt"        ' ~100 KB character dictionary
})

' Text blocks returned — must be sorted and joined manually
Dim result = engine.Run(imagePath)
Dim text = String.Join(vbCrLf, result.TextBlocks _
    .OrderBy(Function(b) b.BoundingBox.Top) _
    .ThenBy(Function(b) b.BoundingBox.Left) _
    .Select(Function(b) b.Text))
$vbLabelText   $csharpLabel

Przełączenie na chiński OCR nie jest zmianą konfiguracji - to zamiana plików. Angielski model rozpoznawania (en_rec.onnx / en_keys.txt) i chiński model rozpoznawania (ch_rec.onnx / ch_keys.txt) to osobne pliki do pobrania. Jeśli dokument zawiera zarówno tekst w języku chińskim, jak i hiszpańskim, nie ma rozwiązania: w katalogu modeli RapidOCR w ogóle nie ma modeli hiszpańskich.

.csproj również wymaga explicytnych wpisów MSBuild do kopiowania wszystkich czterech plików podczas budowy:

<ItemGroup>
  <Content Include="models\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
<ItemGroup>
  <Content Include="models\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
XML

Pominięcie tego kroku spowoduje, że wdrożenie produkcyjne po cichu zawiedzie w czasie wykonywania, gdy ścieżki nie będą prowadzić do żadnego miejsca.

Zrozumienie IronOCR

IronOCR to komercyjna biblioteka OCR dla platformy .NET, oparta na zoptymalizowanym silniku Tesseract 5, zaprojektowana do pracy z pojedynczego pakietu NuGet bez zewnętrznych plików modeli, zarządzania danymi tessdata i natywnej konfiguracji binarnej. Obejmuje on pełen zakres scenariuszy programowania w środowisku .NET — aplikacje internetowe ASP.NET, konsolowe procesory wsadowe, narzędzia desktopowe WPF, Azure Functions, AWS Lambda, kontenery Docker oraz aplikacje mobilne MAUI — na systemach Windows, Linux, macOS i ARM.

Kluczowe cechy:

  • Oprogramowanie jedno-pakietowe: dotnet add package IronOcr to pełna instalacja. Wszystkie pliki binarne silnika, dane językowe dla domyślnej konfiguracji (angielskiej) oraz algorytmy przetwarzania wstępnego znajdują się w pakiecie.
  • Automatyczny proces przetwarzania wstępnego: korekcja przekrzywienia, usuwanie szumów, wzmocnienie kontrastu, binarizacja i normalizacja rozdzielczości są wykonywane automatycznie na obrazach, które tego wymagają. W razie potrzeby można zastosować ręczne filtrowanie.
  • Natywne wsparcie dla PDF: PDFy są podawane bezpośrednio do IronTesseract.Read() bez kroku konwersji. PDFy chronione hasłem akceptują parametr Password. Wyjście w postaci przeszukiwalnego pliku PDF jest wynikiem pojedynczego wywołania metody.
  • 125+ języków przez NuGet: Pakiety językowe (IronOcr.Languages.French, IronOcr.Languages.Arabic, itd.) są instalowane jako zależności NuGet. Zmiana języka to przypisanie właściwości, a nie pobieranie pliku.
  • Model wyników strukturalnych: OcrResult udostępnia .Pages, .Paragraphs, .Lines, .Words i oceny pewności co do słów z koordynatami obiektów otaczających.
  • Bezpieczne dla wątków i bezstanowe: Wiele instancji IronTesseract działa równolegle bez blokad lub wspólnego stanu.
  • Wsparcie komercyjne: Licencjonowane wieczyście zaczynając od $999 (Lite), z wsparciem email i wersjonowaną API pod aktywną utrzymanką.

Porównanie funkcji

Funkcja RapidOCR.NET IronOCR
Instalacja NuGet + 4 ręczne pobrania modeli Pojedynczy pakiet NuGet
Obsługa języków ~5(tylko CJK + angielski) Ponad 125 pakietów językowych dostępnych za pośrednictwem NuGet
Natywne wprowadzanie plików PDF Nie Tak
Wynik w formacie PDF z możliwością wyszukiwania Nie Tak
Wbudowane przetwarzanie wstępne Nie Tak (filtry automatyczne + ręczne)
Wsparcie komercyjne Brak (społeczność) Tak (wliczone w licencję)

Szczegółowe porównanie funkcji

Kategoria / Funkcja RapidOCR.NET IronOCR
Konfiguracja i instalacja
Instalacja NuGet Tak Tak
Wymagane pobranie modeli zewnętrznych Tak (4 pliki) Nie
Wymagana konfiguracja ścieżki Tak Nie
Wymagane reguły kopiowania MSBuild Tak Nie
Działa natychmiast po instalacji z NuGet Nie Tak
Obsługa języków
Angielski Tak Tak
Chiński uproszczony / tradycyjny Tak (główny cel) Tak
Japoński Tylko w wersji eksperymentalnej Tak
Koreański Tylko w wersji eksperymentalnej Tak
Języki europejskie (hiszpański, francuski, niemiećki itp.) Nie Tak (30+)
Cyrylica (rosyjski, ukraiński itp.) Nie Tak (15+)
Arabski / Hebrajski Nie Tak
Pisma indyjskie (hindi, bengalski, tamilski) Nie Tak (10+)
Wielojęzyczne jednoczesne OCR Nie Tak
Łączna liczba obsługiwanych języków ~5 125+
Formaty danych wejściowych
JPEG / PNG / BMP / TIFF Tak Tak
PDF (natywny, bez konwersji) Nie Tak
Plik PDF chroniony hasłem Nie Tak
Strumień / tablica bajtów Ograniczone Tak
Wprowadź adres URL Nie Tak
Wynik
Zwykły tekst Tak Tak
Ramki ograniczające bloki tekstu Tak Tak
Struktura słów / wierszy / akapitów Częściowe (tylko bloki) Tak
Wyniki pewności dla poszczególnych słów Tak (na blok) Tak
PDF z funkcją wyszukiwania Nie Tak
eksport hOCR Nie Tak
Przetwarzanie wstępne
Automatyczne przetwarzanie wstępne Nie Tak
Wyrównanie Nie Tak
Denoize Nie Tak
Kontrast / binarizacja Nie Tak
Poprawa rozdzielczości Nie Tak
Wdrożenie
Samodzielny pojedynczy pakiet Nie (4+ pliki zewnętrzne) Tak
Obsługa Docker Wymagana ręczna kopia modelu Tak (od razu po uruchomieniu)
Obsługa systemu Linux Wymagane są natywne pliki binarne ONNX Runtime Tak
Obsługa systemu macOS Wymagane są natywne pliki binarne ONNX Runtime Tak
Wsparcie i konserwacja
Wsparcie komercyjne / SLA Nie Tak
Aktywna obsługa techniczna zapewniana przez firmę Nie (pojedynczy programista społecznościowy) Tak
Rodzaj licencji Apache 2.0 (bezpłatna) Wieczysta komercyjna ($999+)

Zarządzanie modelami ONNX a konfiguracja zerowa

Największą różnicą operacyjną między RapidOCR.NET a IronOCR nie jest dokładność — jest to bieżący koszt zarządzania czterema zewnętrznymi plikami modeli we wszystkich środowiskach, z którymi ma do czynienia aplikacja.

Podejście RapidOCR.NET

Pliki modeli nie są dołączone do pakietu NuGet. Znajdują się one na stronach wydania projektu RapidOCR w serwisie GitHub i należy je pobrać poza kanałem dystrybucji, ręcznie nadać im wersję oraz wdrożyć wraz z aplikacją. Gdy projekt RapidOCR udostępni zaktualizowane modele zapewniające większą dokładność, należy powtórzyć sekwencję pobierania i zastąpić pliki w środowisku produkcyjnym.

W pipeline CI/CD, pliki modelu muszą być albo zaangażowane do repozytorium (dodając 15–25 MB danych binarnych do historii Git) albo pobrane podczas kroku budowy za pomocą niestandardowych skryptów. W kontenerze Docker, zestaw modeli dla każdego języka dodaje osobną instrukcję COPY i nietrywialną warstwę. W wdrożeniu Kubernetes pliki modeli zazwyczaj trafiają do zamontowanego woluminu lub są wbudowane w obraz, co w obu przypadkach wymaga zasad określających sposób propagacji aktualizacji.

Logika walidacji w plikach źródłowych uwidacznia tę wrażliwość:

// RapidOcrNet: Runtime validation needed because any missing file crashes the engine
public static bool ValidateModelFiles()
{
    var requiredFiles = new[]
    {
        Path.Combine(ModelDirectory, "det.onnx"),
        Path.Combine(ModelDirectory, "cls.onnx"),
        Path.Combine(ModelDirectory, "rec_en.onnx"),
        Path.Combine(ModelDirectory, "en_keys.txt")
    };

    var missingFiles = requiredFiles.Where(f => !File.Exists(f)).ToList();

    if (missingFiles.Any())
    {
        Console.WriteLine("ERROR: Missing required model files:");
        foreach (var file in missingFiles)
            Console.WriteLine($"  - {file}");
        return false;
    }

    return true;
}
// RapidOcrNet: Runtime validation needed because any missing file crashes the engine
public static bool ValidateModelFiles()
{
    var requiredFiles = new[]
    {
        Path.Combine(ModelDirectory, "det.onnx"),
        Path.Combine(ModelDirectory, "cls.onnx"),
        Path.Combine(ModelDirectory, "rec_en.onnx"),
        Path.Combine(ModelDirectory, "en_keys.txt")
    };

    var missingFiles = requiredFiles.Where(f => !File.Exists(f)).ToList();

    if (missingFiles.Any())
    {
        Console.WriteLine("ERROR: Missing required model files:");
        foreach (var file in missingFiles)
            Console.WriteLine($"  - {file}");
        return false;
    }

    return true;
}
Imports System
Imports System.IO
Imports System.Linq

Public Class RapidOcrNet
    Public Shared Function ValidateModelFiles() As Boolean
        Dim requiredFiles = {
            Path.Combine(ModelDirectory, "det.onnx"),
            Path.Combine(ModelDirectory, "cls.onnx"),
            Path.Combine(ModelDirectory, "rec_en.onnx"),
            Path.Combine(ModelDirectory, "en_keys.txt")
        }

        Dim missingFiles = requiredFiles.Where(Function(f) Not File.Exists(f)).ToList()

        If missingFiles.Any() Then
            Console.WriteLine("ERROR: Missing required model files:")
            For Each file In missingFiles
                Console.WriteLine($"  - {file}")
            Next
            Return False
        End If

        Return True
    End Function
End Class
$vbLabelText   $csharpLabel

Aplikacje produkcyjne korzystające z RapidOCR.NET rutynowo zawierają tego typu sprawdzanie poprawności podczas uruchamiania, ponieważ brak pliku modelu nie powoduje wyraźnego błędu podczas instalacji pakietu — powoduje on awarię środowiska uruchomieniowego podczas pierwszej inicjalizacji silnika. Ta awaria ujawnia się w środowisku produkcyjnym, a nie podczas rozwoju.

Podejście IronOCR

Nie ma żadnych plików wzorcowych do zarządzania. Po dotnet add package IronOcr, silnik jest gotowy:

// IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
' IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

Podręcznik konfiguracji IronTesseract zawiera pełną ścieżkę instalacji. Pakiety językowe rozszerzające się poza angielski są pakietami NuGet - dotnet add package IronOcr.Languages.French - i krok odzyskiwania zajmuje się wszystkim, w tym w pipeline CI/CD, które już odzyskują zależności NuGet. Nie ma decyzji .gitignore dotyczących plików modelu binarnego, nie ma warstw COPY w Dockerfiles, nie ma skryptów walidacyjnych na start.

Dla zespołów wdrażających do Dockera, przewodnik po IronOCR dla Docker obejmuje jedną wymaganą systemową zależność (libgdiplus na obrazach opartych na Debian/Ubuntu) i nic więcej.

Obsługa języków

Podejście RapidOCR.NET

Zakres językowy RapidOCR.NET odzwierciedla jego pochodzenie. PaddleOCR zostało stworzone przez Baidu w celu obsługi wyszukiwania w Internecie w języku chińskim. Jej modele doskonale sprawdzają się w przypadku chińskiego uproszczonego i tradycyjnego. Obsługa języka angielskiego jest uwzględniona, ale nie była głównym celem projektu. W językach japońskim i koreańskim dostępne są modele opracowane przez społeczność, oznaczone jako eksperymentalne. Wszystkie pozostałe języki — hiszpański, francuski, niemiećki, rosyjski, arabski, hindi, portugalski i ponad 100 innych — nie mają dostępnego modelu.

Przełączanie się między obsługiwanymi językami wymaga pobrania różnych plików modeli:

// RapidOcrNet: Angielski engine
var englishEngine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = Path.Combine(modelPath, "det.onnx"),
    ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    RecModelPath = Path.Combine(modelPath, "en_rec.onnx"),   // English-specific
    KeysPath     = Path.Combine(modelPath, "en_keys.txt")    // English-specific
});

// RapidOcrNet: Chinese engine — different rec and keys files required
var chineseEngine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = Path.Combine(modelPath, "det.onnx"),
    ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"),   // Different download
    KeysPath     = Path.Combine(modelPath, "ch_keys.txt")    // Different download
});

// Spanish? NotSupportedException — no model exists
// RapidOcrNet: Angielski engine
var englishEngine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = Path.Combine(modelPath, "det.onnx"),
    ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    RecModelPath = Path.Combine(modelPath, "en_rec.onnx"),   // English-specific
    KeysPath     = Path.Combine(modelPath, "en_keys.txt")    // English-specific
});

// RapidOcrNet: Chinese engine — different rec and keys files required
var chineseEngine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = Path.Combine(modelPath, "det.onnx"),
    ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"),   // Different download
    KeysPath     = Path.Combine(modelPath, "ch_keys.txt")    // Different download
});

// Spanish? NotSupportedException — no model exists
Imports System.IO

' RapidOcrNet: Angielski engine
Dim englishEngine = New RapidOcrEngine(New RapidOcrOptions With {
    .DetModelPath = Path.Combine(modelPath, "det.onnx"),
    .ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    .RecModelPath = Path.Combine(modelPath, "en_rec.onnx"),   ' English-specific
    .KeysPath = Path.Combine(modelPath, "en_keys.txt")        ' English-specific
})

' RapidOcrNet: Chinese engine — different rec and keys files required
Dim chineseEngine = New RapidOcrEngine(New RapidOcrOptions With {
    .DetModelPath = Path.Combine(modelPath, "det.onnx"),
    .ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
    .RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"),   ' Different download
    .KeysPath = Path.Combine(modelPath, "ch_keys.txt")        ' Different download
})

' Spanish? NotSupportedException — no model exists
$vbLabelText   $csharpLabel

Aplikacja, która musi przetwarzać dokumenty w języku angielskim, chińskim i hiszpańskim z tej samej kolejki, nie ma w RapidOCR.NET realnej ścieżki dla dokumentów hiszpańskich.

Podejście IronOCR

IronOCR obsługuje ponad 125 języków, z których każdy jest dostępny jako pakiet językowy NuGet. Przełączanie to przypisanie właściwości enum na instancji IronTesseract - bez pobierania plików, bez rekreacji silnika:

// IronOCR: language switching is a property change, not a file swap
var ocr = new IronTesseract();

// English
ocr.Language = OcrLanguage.English;

// Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified;

// Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish;

// Arabic — just works
ocr.Language = OcrLanguage.Arabic;

// Russian — just works
ocr.Language = OcrLanguage.Russian;

var result = ocr.Read("document.jpg");
// IronOCR: language switching is a property change, not a file swap
var ocr = new IronTesseract();

// English
ocr.Language = OcrLanguage.English;

// Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified;

// Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish;

// Arabic — just works
ocr.Language = OcrLanguage.Arabic;

// Russian — just works
ocr.Language = OcrLanguage.Russian;

var result = ocr.Read("document.jpg");
Imports IronOcr

Dim ocr As New IronTesseract()

' English
ocr.Language = OcrLanguage.English

' Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified

' Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish

' Arabic — just works
ocr.Language = OcrLanguage.Arabic

' Russian — just works
ocr.Language = OcrLanguage.Russian

Dim result = ocr.Read("document.jpg")
$vbLabelText   $csharpLabel

Dokumenty w różnych językach używają AddSecondaryLanguage:

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English);
var result = ocr.Read("mixed-document.jpg");
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English);
var result = ocr.Read("mixed-document.jpg");
Imports IronOcr

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.English)
Dim result = ocr.Read("mixed-document.jpg")
$vbLabelText   $csharpLabel

Wielojęzyczne instrukcje i przykładowe wersje międzynarodowe szczegółowo opisują instalację pakietów językowych oraz konfigurację języków dodatkowych.

Możliwości przetwarzania i generowania plików PDF

Podejście RapidOCR.NET

RapidOCR.NET przetwarza obrazy. Pliki PDF nie są obrazami. Biblioteka nie posiada funkcji renderowania plików PDF, nie umożliwia zapisywania plików PDF ani nie posiada mechanizmu generowania plików PDF z możliwością wyszukiwania. Wyodrębnianie tekstu ze zeskanowanego pliku PDF za pomocą RapidOCR.NET wymaga co najmniej trzech oddzielnych komponentów:

// RapidOcrNet: PDF processing requires external library + manual assembly
public async Task<string> ExtractTextFromPdf(string pdfPath)
{
    // Step 1: Requires PdfPig, Docotic, or similar external library
    var pageImages = await RenderPdfToImages(pdfPath);

    // Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
    using var engine = new RapidOcrEngine(new RapidOcrOptions
    {
        DetModelPath = "models/det.onnx",
        ClsModelPath = "models/cls.onnx",
        RecModelPath = "models/rec_en.onnx",
        KeysPath     = "models/en_keys.txt"
    });

    // Step 3: OCR each image individually
    var results = new List<string>();
    foreach (var pageImage in pageImages)
    {
        var result = engine.Run(pageImage);
        results.Add(string.Join("\n", result.TextBlocks.Select(b => b.Text)));
    }

    // Step 4: Combine manually — page structure not preserved
    return string.Join("\n\n", results);
}
// RapidOcrNet: PDF processing requires external library + manual assembly
public async Task<string> ExtractTextFromPdf(string pdfPath)
{
    // Step 1: Requires PdfPig, Docotic, or similar external library
    var pageImages = await RenderPdfToImages(pdfPath);

    // Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
    using var engine = new RapidOcrEngine(new RapidOcrOptions
    {
        DetModelPath = "models/det.onnx",
        ClsModelPath = "models/cls.onnx",
        RecModelPath = "models/rec_en.onnx",
        KeysPath     = "models/en_keys.txt"
    });

    // Step 3: OCR each image individually
    var results = new List<string>();
    foreach (var pageImage in pageImages)
    {
        var result = engine.Run(pageImage);
        results.Add(string.Join("\n", result.TextBlocks.Select(b => b.Text)));
    }

    // Step 4: Combine manually — page structure not preserved
    return string.Join("\n\n", results);
}
Imports System.Threading.Tasks
Imports System.Collections.Generic
Imports System.Linq

Public Class PdfTextExtractor
    ' RapidOcrNet: PDF processing requires external library + manual assembly
    Public Async Function ExtractTextFromPdf(pdfPath As String) As Task(Of String)
        ' Step 1: Requires PdfPig, Docotic, or similar external library
        Dim pageImages = Await RenderPdfToImages(pdfPath)

        ' Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
        Using engine As New RapidOcrEngine(New RapidOcrOptions With {
            .DetModelPath = "models/det.onnx",
            .ClsModelPath = "models/cls.onnx",
            .RecModelPath = "models/rec_en.onnx",
            .KeysPath = "models/en_keys.txt"
        })

            ' Step 3: OCR each image individually
            Dim results As New List(Of String)()
            For Each pageImage In pageImages
                Dim result = engine.Run(pageImage)
                results.Add(String.Join(vbLf, result.TextBlocks.Select(Function(b) b.Text)))
            Next

            ' Step 4: Combine manually — page structure not preserved
            Return String.Join(vbLf & vbLf, results)
        End Using
    End Function

    ' Placeholder for the RenderPdfToImages method
    Private Async Function RenderPdfToImages(pdfPath As String) As Task(Of List(Of Object))
        ' Implementation goes here
        Return New List(Of Object)()
    End Function
End Class
$vbLabelText   $csharpLabel

Powoduje to dodanie kolejnej zależności NuGet, kolejnego zestawu interfejsów API do opanowania oraz obciążenie pamięci wynikające z przechowywania w pamięci bitmap renderowanych na stronie w przypadku dużych dokumentów. Wynik w postaci PDF z możliwością wyszukiwania — zapisanie rozpoznanego tekstu jako ukrytej warstwy OCR na oryginalnym skanie — nie jest możliwe na żadnym etapie tego procesu.

Podejście IronOCR

IronOCR odczytuje pliki PDF w sposób natywny. Ta sama metoda IronTesseract.Read() akceptuje zarówno ścieżki obrazów, jak i ścieżki PDF:

// IronOCR: direct PDF OCR — no conversion, no external library
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Plik PDF chroniony hasłem — one parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);

// PDF z funkcją wyszukiwania — one method call on the result
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: direct PDF OCR — no conversion, no external library
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Plik PDF chroniony hasłem — one parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);

// PDF z funkcją wyszukiwania — one method call on the result
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' IronOCR: direct PDF OCR — no conversion, no external library
Dim text As String = New IronTesseract().Read("scanned-document.pdf").Text

' Plik PDF chroniony hasłem — one parameter
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim result = New IronTesseract().Read(input)
End Using

' PDF z funkcją wyszukiwania — one method call on the result
Dim result2 = New IronTesseract().Read("scanned.pdf")
result2.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

Instrukcja obsługi plików PDF obejmuje wybór stron, obsługę haseł oraz przetwarzanie wielostronicowe. W instrukcji w formacie PDF z funkcją wyszukiwania pokazano, jak stworzyć plik zgodny z wymogąmi, który wygląda identycznie jak oryginalny skan, a jednocześnie ma warstwę umożliwiającą wyszukiwanie pełnotekstowe. Dla zespołów tworzących procesy archiwizacji dokumentów ten format wyjściowy jest celem końcowym — i nie wymaga żadnych dodatkowych zależności poza samym pakietem IronOCR.

Gotowość do produkcji i dojrzałość społeczności

Podejście RapidOCR.NET

RapidOCR.NET to nowszy projekt. Repozytorium GitHub ma ograniczoną liczbę gwiazdek i aktywność użytkowników w porównaniu z uznanymi bibliotekami OCR dla platformy .NET. Stack Overflow ma minimalny zasięg. Gdy w środowisku produkcyjnym pojawiają się skrajne przypadki — nietypowe orientacje obrazów, specyficzne zestawy znaków, konflikty wersji ONNX Runtime, konfiguracja trybu GPU — głównym źródłem informacji jest system śledzenia błędów GitHub. Nie ma poziomu wsparcia komercyjnego, umowy SLA dotyczącej utrzymania ani gwarantowanego czasu odpowiedzi.

Łańcuch zależności wiąże się z dodatkowym ryzykiem. RapidOCR.NET opiera się na wersjach modelowych projektu RapidOCR. Projekt RapidOCR opiera się na architekturze modelu PaddleOCR. Każda istotna zmiana na dowolnym poziomie tego łańcucha wymaga reakcji osoby odpowiedzialnej za utrzymanie opakowania .NET, zanim użytkownicy będą mogli dokonać aktualizacji — a opakowanie jest utrzymywane przez pojedynczego programistę ze społeczności, bez wsparcia organizacyjnego.

Wdrożenie ujawnia również problemy związane z wersjonowaniem środowiska uruchomieniowego ONNX. Pakiet Microsoft.ML.OnnxRuntime miał zmiany łamiące kompatybilność pomiędzy mniejszymi wersjami, a natywne binaria dostarczane z nim są specyficzne dla platformy. Obraz kontenera zbudowany na linux/amd64 nie może używać tych samych binariów ONNX Runtime co ten zbudowany na linux/arm64. Każdy cel wdrożenia wymaga walidacji.

Podejście IronOCR

IronOCR jest aktywnie rozwijany komercyjnie od ponad dziesięciu lat. Biblioteka jest dostarczana w ramach wersjonowanego interfejsu API z udokumentowanymi zmianami powodującymi niekompatybilność, regularnymi wydaniami dostosowanymi do wydań .NET SDK oraz wsparciem e-mail w ramach każdej licencji komercyjnej. Zespoły tworzące potoki produkcyjne otrzymują bezpośrednią ścieżkę wsparcia, a nie kolejkę zgłoszeń na GitHubie monitorowaną przez jednego programistę w wolnym czasie.

Konstrukcja oparta na jednym pakiecie całkowicie eliminuje pętlę walidacji wdrożenia. Krok przywracania NuGet jest deterministyczny: ta sama wersja pakietu zapewnia taką samą działającą instalację w systemach Windows, Linux i macOS bez konieczności zarządzania plikami binarnymi specyficznymi dla danej platformy. W przypadku wdrożeń AWS Lambda i Azure pakiet funkcji zawiera wyłącznie opublikowaną aplikację — bez plików modelowych typu sidecar, bez montowania woluminów i bez logiki walidacji startowej.

Przykład skanu o niskiej jakości oraz instrukcja korekcji jakości obrazu obejmują scenariusze przetwarzania wstępnego, które zazwyczaj wymagają niestandardowego kodu w potokach opartych na ONNX — przekrzywione skany, zaszumione tła, dokumenty o niskim kontraście — bez konieczności pisania kodu poza wyborem odpowiednich metod filtrowania.

Przewodnik po mapowaniu API

RapidOCR.NET Odpowiednik IronOCR
new RapidOcrEngine(new RapidOcrOptions { ... }) new IronTesseract()
RapidOcrOptions.DetModelPath Niepotrzebne — w pakiecie
RapidOcrOptions.ClsModelPath Niepotrzebne — w pakiecie
RapidOcrOptions.RecModelPath Niepotrzebne — w pakiecie
RapidOcrOptions.KeysPath Niepotrzebne — w pakiecie
RapidOcrOptions.UseGpu Brak bezpośredniego odpowiednika (zoptymalizowane wewnętrznie pod kątem procesora)
RapidOcrOptions.NumThreads IronTesseract (bezpieczny dla wątków; użyj Parallel.ForEach)
engine.Run(imagePath) new IronTesseract().Read(imagePath)
result.TextBlocks result.Words / result.Lines / result.Paragraphs
result.TextBlocks[i].Text result.Words[i].Text
result.TextBlocks[i].Confidence result.Words[i].Confidence
result.TextBlocks[i].BoundingBox result.Words[i].X, .Y, .Width, .Height
string.Join("\n", result.TextBlocks.Select(b => b.Text)) result.Text
Ręczna zamiana plików językowych ocr.Language = OcrLanguage.French
Konwersja PDF do obrazu + engine.Run() new IronTesseract().Read("doc.pdf")
Niedostępne result.SaveAsSearchablePdf("output.pdf")
Niedostępne result.SaveAsHocrFile("output.hocr")
engine.Dispose() using var ocr = new IronTesseract()

Kiedy zespoły rozważają przejście z RapidOCR.NET na IronOCR

Kiedy zarządzanie plikami modeli staje się wąskim gardłem wdrożenia

Zespoły, które rozpoczęły pracę od RapidOCR.NET w celu stworzenia prototypu, zazwyczaj napotykają przeszkodę w postaci zarządzania plikami modeli, gdy próbują wdrożyć rozwiązanie do produkcji. Cztery pliki modeli muszą być wersjonowane, śledzone, kopiowane podczas kompilacji, dołączane do artefaktów CI, wdrażane do środowiska stagingowego i produkcyjnego — niezależnie od grafu zależności NuGet. W małym zespole te koszty operacyjne są ponoszone jednorazowo i szybko zapominane. W zespole utrzymującym wiele usług, wiele środowisk i wiele pipeline'ów CI, niestandardowe skrypty wokół dystrybucji plików modelu kumulują się w znaczący koszt utrzymania. Kiedy kolega pyta "dlaczego mamy ten folder models/ w repo i co się stanie, jeśli go usunę?" i odpowiedź wymaga pięciu minut wyjaśnienia, zwykle wtedy rozpoczyna się ocena.IronOCR eliminuje całą powierzchnię zarządzania modelami: nie trzeba niczego pobierać osobno, kopiować do CI ani weryfikować przy uruchomieniu.

Gdy dokument przychodzi w języku, który nie jest obsługiwany

Luka w obsłudze języków jest przeszkodą nie do pokonania, a nie problemem konfiguracyjnym. Jeśli organizacja otrzymuje niemiećkie umowy, francuskie faktury, rosyjskie zamówienia lub korespondencję w języku arabskim, RapidOCR.NET nie zapewnia żadnej ścieżki dla tych dokumentów — nie chodzi o "ograniczoną dokładność", ale o brak modelu i brak wyników. Zespoły, które początkowo wybrały RapidOCR.NET do zastosowań związanych z językami chińskim, japońskim i koreańskim, odkrywają tę ograniczenie, gdy po raz pierwszy muszą przetworzyć dokument spoza tego zestawu. Funkcje językoweIronOCR obejmują ponad 125 języków, które można zainstalować za pośrednictwem NuGet, dzięki czemu zakres możliwości potoku OCR rozszerza się bez ingerencji w kod aplikacji — wystarczy dodać pakiet językowy i zmienić właściwość wyliczeniową.

Gdy aplikacja wymaga danych wejściowych lub wyjściowych w formacie PDF

Znaczną część dokumentów biznesowych poddawanych OCR stanowią pliki PDF: zeskanowane umowy, zarchiwizowane faktury, formularze przesłane faksem i przekonwertowane na PDF przez drukarki wielofunkcyjne. RapidOCR.NET nie może odczytać żadnego z nich bez oddzielnej biblioteki renderującej pliki PDF, niestandardowego kodu konwersji oraz zarządzania pamięcią dla bitmap o rozmiarze strony. Zespoły tworzące potoki pozyskiwania dokumentów szybko zauważają, że stos RapidOCR.NET wymaga co najmniej dwóch bibliotek — jednej do renderowania plików PDF, drugiej do OCR — z których każda ma własne cykle aktualizacji i obszary kompatybilności.IronOCR obsługuje obie te funkcje w jednym pakiecie. Możliwość tworzenia plików PDF z funkcją wyszukiwania, przekształcająca zeskanowane archiwum w indeks z funkcją wyszukiwania, całkowicie wykracza poza zakres funkcji RapidOCR.NET i jest realizowana za pomocą pojedynczego wywołania metody w bibliotece IronOCR. Zespoły tworzące aplikacje do zarządzania dokumentami, które muszą spełniać wymogi zgodności, często wskazują możliwość generowania plików PDF z funkcją wyszukiwania jako decydującą cechę.

Kiedy pojawiają się incydenty produkcyjne bez ścieżki wsparcia

Projekty społecznościowe działają w oparciu o dostępność współpracowników. Gdy wdrożenie produkcyjne RapidOCR.NET napotyka nowy, skrajny przypadek — konkretny konflikt wersji ONNX Runtime, błąd wnioskowania modelu w przypadku nietypowego formatu obrazu, wyciek pamięci przy długotrwałym obciążeniu — ścieżką wsparcia jest zgłoszenie na GitHubie i oczekiwanie. Dla zespołów mających zobowiązania wynikające z umowy SLA lub korzystających z procesów przetwarzania dokumentów o znaczeniu krytycznym dla działalności, nie jest to realny model reagowania na incydenty. Licencja komercyjna IronOCR obejmuje bezpośrednie wsparcie e-mail, zapewniając zespołom realny punkt kontaktowy, gdy coś się zepsuje w piątek wieczorem przed poniedziałkowym terminem.

Kiedy projekt wykracza poza założenia prototypu

RapidOCR.NET to rozsądny wybór do eksperymentalnego weryfikowania koncepcji: jest darmowy, nie trzeba negocjować licencji, a instalacja jest szybka, poza konfiguracją modelu. Kiedy ta weryfikacja koncepcji staje się funkcją produkcyjną, ograniczenia, które były akceptowalne w laboratorium — brak obsługi PDF, wąski zakres języków, ręczne zarządzanie modelami, brak wsparcia komercyjnego — stają się przeszkodami. Ścieżka migracji z RapidOCR.NET do IronOCR jest mechaniczna: usuń pakiety, usuń katalog modeli, usuń reguły kopiowania MSBuild, zastąp blok inicjalizacji silnika pojedynczym konstruktorem silnika OCR bez argumentów oraz odblokuj jednocześnie obsługę plików PDF, obsługę 125 języków, automatyczne przetwarzanie wstępne i wynik z możliwością wyszukiwania.

Typowe kwestie związane z migracją

Zastąpienie inicjalizacji silnika

Najbardziej bezpośrednia zmiana kodu to zastąpienie bloku inicjalizacji RapidOcrEngine przez instancję IronTesseract. Obiekt konfiguracji czterech ścieżek znika całkowicie:

// Before: RapidOcrNet — engine needs all 4 paths populated
var engine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = "models/det.onnx",
    ClsModelPath = "models/cls.onnx",
    RecModelPath = "models/rec_en.onnx",
    KeysPath     = "models/en_keys.txt"
});
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
    .OrderBy(b => b.BoundingBox.Top)
    .Select(b => b.Text));

// After:IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
// Before: RapidOcrNet — engine needs all 4 paths populated
var engine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = "models/det.onnx",
    ClsModelPath = "models/cls.onnx",
    RecModelPath = "models/rec_en.onnx",
    KeysPath     = "models/en_keys.txt"
});
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
    .OrderBy(b => b.BoundingBox.Top)
    .Select(b => b.Text));

// After:IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
Imports System.Linq

' Before: RapidOcrNet — engine needs all 4 paths populated
Dim engine = New RapidOcrEngine(New RapidOcrOptions With {
    .DetModelPath = "models/det.onnx",
    .ClsModelPath = "models/cls.onnx",
    .RecModelPath = "models/rec_en.onnx",
    .KeysPath = "models/en_keys.txt"
})
Dim result = engine.Run(imagePath)
Dim text = String.Join(vbCrLf, result.TextBlocks _
    .OrderBy(Function(b) b.BoundingBox.Top) _
    .Select(Function(b) b.Text))

' After: IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

Kolekcja result.TextBlocks z jej ręcznym OrderBy i łańcuchem Select redukuje się do result.Text. Dla aplikacji, które potrzebują danych koordynat obiektów otaczających dostarczonych przez TextBlocks, result.Words udostępnia te same współrzędne i wartości pewności dla słów przeznaczone dla strukturalnego API udokumentowanego w przewodniku odczytu wyników.

Usunięcie infrastruktury plików modeli

Po zamianie kodu, usuń katalog models/, usuń wpisy MSBuild <Content>, które kopiowały pliki modelu przy budowie, i usuń wszelką logikę walidacyjną na start sprawdzającą brakujące pliki. Nie są one potrzebne —IronOCR przesyła swoje dane wewnętrznie. W potokach CI/CD usuń wszelkie etapy, które pobierały lub buforowały pliki modeli. Instrukcja dotycząca wprowadzania obrazów obejmuje wzorce obsługi danych wejściowych dla typowych scenariuszy związanych ze ścieżkami plików, strumieniami i tablicami bajtów, z których prawdopodobnie korzysta istniejący kod RapidOCR.NET.

Postępowanie z obrazami niskiej jakości

Modele ONNX biblioteki RapidOCR.NET stosują wewnętrzne przetwarzanie wstępne podczas wnioskowania, ale biblioteka nie udostępnia wywołującemu API przetwarzania wstępnego. Jeśli istniejący kod stosuje manipulację obrazami przed przejściem do engine.Run(), ten kod został napisany w oddzielnej bibliotece obrazów.IronOCR udostępnia API wstępnego przetwarzania bezpośrednio na OcrInput:

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew();           // Correct skewed scans
input.DeNoise();          // Remove scanner noise
input.Contrast();         // Enhance contrast
input.Binarize();         // Convert to black/white
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew();           // Correct skewed scans
input.DeNoise();          // Remove scanner noise
input.Contrast();         // Enhance contrast
input.Binarize();         // Convert to black/white
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")
    input.Deskew()           ' Correct skewed scans
    input.DeNoise()          ' Remove scanner noise
    input.Contrast()         ' Enhance contrast
    input.Binarize()         ' Convert to black/white
    input.EnhanceResolution(300)

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

Poradnik dotyczący korekcji orientacji obrazu oraz poradnik dotyczący ustawień DPI obejmują dwa zagadnienia związane z przetwarzaniem wstępnym, które najczęściej wpływają na dokładność skanowanych dokumentów. Oceny pewności dostępne są przez result.Confidence i per-word przez result.Words[i].Confidence.

Dodanie obsługi plików PDF

Każdy kod, który wykonywał konwersję PDF do obrazu przed wywołaniem engine.Run(), może być całkowicie usunięty. IronTesseract.Read() akceptuje bezpośrednio ścieżkę PDF. Usuń zależność od biblioteki renderującej pliki PDF wraz z kodem potoku konwersji — jest to rzeczywiste zmniejszenie liczby zależności, a nie ich dodanie.

Dodatkowe możliwości IronOCR

Oprócz funkcji omówionych w sekcjach porównawczych,IronOCR oferuje możliwości, które nie mają odpowiednika w RapidOCR.NET:

Zgodność z platformą .NET i gotowość na przyszłość

IronOCR jest przeznaczony dla platform .NET 8, .NET 9, .NET Standard 2.0 oraz .NET Framework 4.6.2 i nowszych, obejmując pełne spektrum aktualnych środowisk Enterprise .NET. Biblioteka dostarcza binaria międzyplatformowe dla Windows x64/x86, Linux x64, macOS x64 i macOS ARM (Apple Silicon), z obrazami kontenerów testowanymi pod standardowe obrazy bazowe mcr.microsoft.com/dotnet/aspnet. Kompatybilność RapidOCR.NET jest ograniczona przez matrycę wsparcia platformowego ONNX Runtime, która obejmuje podobne cele, ale wymaga platformowo-specyficznego wyboru pakietów NuGet (Microsoft.ML.OnnxRuntime dla CPU vs. Microsoft.ML.OnnxRuntime.Gpu dla CUDA) i nie gwarantuje tej samej prostoty binaria-w-pakiecie.IronOCR zachowuje zgodność z .NET 10 (spodziewanym w listopadzie 2026 r.) dzięki aktywnemu cyklowi wydawniczemu, bez konieczności wprowadzania zmian w kodzie aplikacji po aktualizacji SDK.

Wnioski

RapidOCR.NET dobrze rozwiązuje konkretny problem: uruchamianie zoptymalizowanych pod kątem procesora modeli PaddleOCR w środowisku .NET bez konieczności korzystania z pełnego ekosystemu języka Python. Dla zespołów przetwarzających wyłącznie chińskie lub angielskie obrazy w kontrolowanym środowisku, w którym pliki modeli można zarządzać ręcznie, zapewnia rozsądną dokładność za darmo. To jest zakres jego zastosowania w produkcji.

Ograniczeniem decydującym jest obciążenie związane z zarządzaniem modelami. Cztery oddzielne pliki, pochodzące z zewnętrznego repozytorium GitHub, wdrażane wraz z aplikacją, weryfikowane w czasie wykonywania i aktualizowane ręcznie za każdym razem, gdy projekt nadrzędny wydaje nowe wagi — nie stanowi to problemu w przypadku prototypu. W przypadku usługi produkcyjnej z potokami CI/CD, wdrożeniami w wielu środowiskach i wieloma programistami jest to rodzaj operacyjnych utrudnień, które po cichu pochłaniają godziny pracy w ciągu kwartału inżynieryjnego. Problem pogłębia ograniczenie dotyczące obsługiwanych języków: w momencie, gdy wymagania biznesowe wprowadzają język inny niż chiński, japoński lub koreański, RapidOCR.NET całkowicie znika z obrazu.

IronOCR zaczyna się tam, gdzie kończą się ograniczenia RapidOCR.NET. Jeden pakiet NuGet, brak plików zewnętrznych, ponad 125 języków, natywne dane wejściowe w formacie PDF i pliki wyjściowe z możliwością wyszukiwania, automatyczne przetwarzanie wstępne, ekstrakcja ustrukturyzowanych wyników oraz wsparcie komercyjne w ramach API z wersjami. Licencja Lite $999 to jednorazowy koszt bez opłat za transakcję lub corocznych odnowień. Zespoły, które oszacowały koszt godzin pracy inżynierów poświęconych na zarządzanie modelami, obejścia związane z konwersją plików PDF oraz eskalacje dotyczące języków nieobsługiwanych, konsekwentnie stwierdzają, że z ekonomicznego punktu widzenia biblioteka komercyjna jest korzystniejsza niż darmowa alternatywa.

Dla zespołów, które obecnie używają RapidOCR.NET w środowisku produkcyjnym lub oceniają go pod kątem nowego projektu, centrum samouczków IronOCR oraz przewodniki z instrukcjami stanowią praktyczny punkt wyjścia. Migracja jest mechaniczna, kod jest prostszy, a powierzchnia operacyjna zmniejsza się do jednego odwołania do pakietu.

Zwróć uwagęBitmiracle Docotic.Pdf, PaddleOCR, PdfPig, RapidOCR, Tesseract są zarejestrowanymi znakami towarowymi odpowiednich właścicieli. Ta strona nie jest powiązana z, polecana przez, ani sponsorowana przez Baidu, Bit Miracle, Google, PaddlePaddle, RapidOCR, ani UglyToad. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Często Zadawane Pytania

Czym jest RapidOCR.NET?

RapidOCR.NET 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 RapidOCR.NET 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 RapidOCR.NET oferuje prostsze wdrożenie (brak instalatorów SDK), stałą cenę 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ż RapidOCR.NET?

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 RapidOCR.NET 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 RapidOCR.NET 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 RapidOCR.NET?

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 RapidOCR.NET?

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 RapidOCR.NET na IronOCR?

Migracja z RapidOCR.NET 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.

Kannaopat Udonpant
Inżynier oprogramowania
Zanim stał się inżynierem oprogramowania, Kannapat ukończył doktorat z zasobów środowiskowych na Uniwersytecie Hokkaido w Japonii. W czasie studiowania, Kannapat również został członkiem Laboratorium Robotyki Pojazdów, które jest częścią Wydziału Inżynierii Bioprodukcji. W 2022 roku wykorzystał swoje umiejętności w ...
Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie