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

Porównanie pomiędzy Google OCR a IronOCR

Pakiet NuGet charlesw/tesseract został zarchiwizowany w 2021 roku i odtąd nie był aktualizowany — mimo to wciąż pojawia się w odpowiedziach na Stack Overflow, samouczkach blogowych i nowych szablonach projektowych, ponieważ przed zakończeniem rozwoju zgromadził ponad pięć milionów pobrań NuGet. Zespoły, które wdrożą to rozwiązanie dzisiaj, dziedziczą zamrożoną zależność: wagi modeli Tesseract 4.1.1, brak natywnych udoskonaleń binarnych dla .NET 6/7/8 oraz harmonogram konserwacji, który kończy się powiadomieniem o archiwizacji na GitHubie. Taka jest praktyczna rzeczywistość, zanim uruchomiona zostanie choćby jedna linijka kodu OCR.

Druga rzeczywistość ujawnia się w momencie wdrożenia. Pakiet NuGet Tesseract działa poprzez dostarczanie natywnych binariów specyficznych dla platformy — tesseract50.dll dla Windows x64, osobna wersja dla x86, libtesseract.so dla Linux — oraz biblioteki obrazów Leptonica obok nich. Na stacji roboczej programisty pliki te są rozpoznawane automatycznie. W kontenerze Docker, usłudze Azure App Service lub serwerze Linux opartym na ARM deweloperzy zaczynają pisać logikę wdrażania warunkowego, kopiować pliki DLL do wyniku publikacji i debugować DllNotFoundException w czasie wykonywania. IronOCR dostarcza wszystko w jednym zarządzanym pakiecie NuGet bez zarządzania zewnętrznymi binariami natywnymi.

Zrozumienie charlesw/tesseract

Biblioteka charlesw/tesseract — opublikowana pod identyfikatorem pakietu NuGet Tesseract — jest zarządzaną nakładką .NET wokół silnika Tesseract OCR C++. Charles Weld aktywnie ją utrzymywał od 2012 roku do około 2021 roku, stając się de facto standardem dostępu do Tesseract w aplikacjach .NET. Repozytorium GitHub zostało zarchiwizowane, co oznacza, że pull requesty nie są sprawdzane, zgłoszenia nie otrzymują odpowiedzi, a kolejne wersje NuGet nie są publikowane.

Ostatnia opublikowana wersja wykorzystuje Tesseract 4.1.1 z modelem rozpoznawania opartym na sieci neuronowej LSTM. Tesseract 5 — który pojawił się pod koniec 2021 roku z przeprogramowanym modelem LSTM, zapewniającym zauważalnie większą dokładność w przypadku dokumentów o niskiej jakości — nie jest dostępny w tym pakiecie. Owinięcie jest przeznaczone dla .NET Standard 2.0 i .NET Framework 4.6.2+, co oznacza, że działa na nowoczesnych środowiskach uruchomieniowych .NET, ale podstawowy silnik natywny i jego wyszkolone modele są zamrożone na poziomie z 2021 roku.

Kluczowe cechy architektury:

  • Archiwizowane od 2021 r.: brak konserwacji, brak poprawek błędów, brak poprawek bezpieczeństwa, brak aktualizacji do Tesseract 5
  • Natywne binaria specyficzne dla platformy: Osobne tesseract50.dll (Windows x64), tesseract50.dll (Windows x86), libtesseract.so (Linux x64) i towarzyszące pliki DLL Leptonica wdrożone na każdą platformę
  • Tessdata nie jest dołączona: Pliki modeli językowych (.traineddata) muszą być pobrane z repozytorium GitHub tesseract-ocr/tessdata i wdrożone oddzielnie, dodając ponad 15 MB na język do pakietu wdrożenia
  • Brak wstępnego przetwarzania obrazów: Dokładność Tesseracta w przypadku obrazów nieidealnych (przekrzywionych, o niskiej rozdzielczości, z zakłóceniami) wymaga niestandardowego procesu przetwarzania wstępnego napisanego poza opakowaniem
  • Brak obsługi plików PDF: silnik obsługuje wyłącznie obrazy; Strony PDF muszą zostać przekształcone w obrazy przez oddzielną bibliotekę, zanim będzie można uruchomić OCR
  • Bezpieczeństwo wielowątkowe to odpowiedzialność dzwoniącego: Instancje TesseractEngine nie są bezpieczne do współdzielenia między wątkami

Wdrażanie natywnych plików binarnych

Natywny wzorzec zarządzania plikami binarnymi wcharlesw/tesseractstanowi główny praktyczny problem dla zespołów wychodzących poza lokalną maszynę programistyczną:

// charlesw/Tesseract: engine creation requires tessdata path at runtime
// The path must resolve correctly in every deployment target

private const string TessDataPath = @"./tessdata"; // Works on dev — breaks in Docker

public string ExtractText(string imagePath)
{
    // TesseractEngine P/Invokes into platform-specific native DLLs
    // Fails with DllNotFoundException if binaries are not in the right location
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    return page.GetText();
}
// charlesw/Tesseract: engine creation requires tessdata path at runtime
// The path must resolve correctly in every deployment target

private const string TessDataPath = @"./tessdata"; // Works on dev — breaks in Docker

public string ExtractText(string imagePath)
{
    // TesseractEngine P/Invokes into platform-specific native DLLs
    // Fails with DllNotFoundException if binaries are not in the right location
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    return page.GetText();
}
Imports Tesseract

Private Const TessDataPath As String = "./tessdata" ' Works on dev — breaks in Docker

Public Function ExtractText(imagePath As String) As String
    ' TesseractEngine P/Invokes into platform-specific native DLLs
    ' Fails with DllNotFoundException if binaries are not in the right location
    Using engine As New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
        Using img As Pix = Pix.LoadFromFile(imagePath)
            Using page As Page = engine.Process(img)
                Return page.GetText()
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Ciąg TessDataPath musi być rozwiązywany inaczej na każdym celu wdrożenia. Na komputerze programisty z systemem Windows wskazuje on folder lokalny. W kontenerze Linux Docker ten folder nie istnieje, chyba że budowa obrazu jawnie COPY tessdata do wewnątrz. W usłudze Azure App Service ścieżka katalogu głównego aplikacji różni się od ścieżki lokalnej. Każde środowisko wymaga logiki ścieżek warunkowych lub jawnych skryptów wdrożeniowych, a żadna z tych logik nie znajduje się w pakiecie — jest to w całości kod, który musi napisać i utrzymywać wywołujący.

Te same wymagania dotyczą również samych plików binarnych. W profilach publikacji przeznaczonych dla samodzielnych wdrożeń .NET 8 identyfikator środowiska uruchomieniowego musi odpowiadać wariantowi pliku binarnego dostarczanego w pakiecie. Publikacja win-x64 zawiera natywny plik DLL x64; Wdrożenie linux-arm64 wymaga weryfikacji, że pakiet dostarcza binarium ARM64 — a dla zarchiwizowanego pakietu zespoły nie mogą zgłosić problemu, aby go zażądać, jeśli binarium jest nieobecne.

Zrozumienie IronOCR

IronOCR to komercyjna biblioteka OCR .NET firmy Iron Software, która zawiera zoptymalizowany silnik Tesseract 5 z automatycznym przetwarzaniem wstępnym obrazów, natywną obsługą plików PDF oraz modelem wdrożeniowym, który redukuje infrastrukturę OCR do jednego odwołania do pakietu NuGet. Biblioteka jest przeznaczona dla platform .NET 6, .NET 7, .NET 8, .NET Standard 2.0 oraz .NET Framework 4.6.2+, przy czym prace nad nią są aktywnie kontynuowane i regularnie wydawane są nowe wersje.

Kluczowe cechy:

  • Pojedynczy pakiet NuGet: dotnet add package IronOcr instaluje bibliotekę ze wszystkimi natywnymi binariami, tessdata dla języka angielskiego i zintegrowanymi zależnościami uruchomieniowymi — bez osobnych kroków wdrażania
  • Aktywnie utrzymywany: regularne wydania śledzące aktualizacje modeli Tesseract 5, ulepszenia platformy .NET oraz poprawki błędów
  • Automatyczne przetwarzanie wstępne: automatyczne prostowanie, usuwanie szumów, wzmacnianie kontrastu, binaryzacja i normalizacja rozdzielczości bez konieczności pisania kodu przez użytkownika
  • Natywna obsługa plików PDF: pliki PDF odczytywane bezpośrednio bez dodatkowej biblioteki renderującej; Pliki PDF chronione hasłem obsługiwane za pomocą jednego parametru
  • Bezpieczny dla wielowątkowości przez projekt: Instancje IronTesseract są bezpieczne do użytku między wątkami; Parallel.ForEach działa bez tworzenia instancji na wątek
  • 125+ pakietów językowych: Dostępne jako osobne pakiety NuGet (IronOcr.Languages.French, itp.) — bez zarządzania folderem tessdata
  • Wyjście do przeszukiwalnego PDF: result.SaveAsSearchablePdf() tworzy dokument przeszukiwalny zgodny z PDF/A w jednym wywołaniu metody
  • Licencje wieczyste: $999 Lite / $1,499 Plus / $2,999 Professional — zakup jednorazowy, bez opłat transakcyjnych

Porównanie funkcji

Funkcja charlesw/tesseract IronOCR
Status konserwacji Archiwizowane (brak aktualizacji od 2021 r.) Aktywnie utrzymywane
Wersja Tesseract 4.1.1 5 (zoptymalizowane)
Licencja Apache 2.0 (bezpłatna) Komercyjny ($2,999 wieczysty)
Natywne zarządzanie plikami binarnymi Podręcznik (wdrażanie bibliotek DLL na poszczególnych platformach) W pakiecie (bez konfiguracji)
Zarządzanie danymi Tessdata Podręcznik (pobierz i wdróż osobno) W pakiecie (pakiety językowe NuGet)
Wstępne przetwarzanie obrazów Brak (wymagana ręczna implementacja) Automatyczne
Obsługa plików PDF Brak (wymagana biblioteka zewnętrzna) Język ojczysty
Bezpieczeństwo wątków Odpowiedzialność dzwoniącego Wbudowane

Szczegółowe porównanie funkcji

Funkcja charlesw/tesseract IronOCR
Konserwacja i wersjonowanie
Status projektu Archiwizowane — GitHub tylko do odczytu Aktywny rozwój
Wersja silnika Tesseract 4.1.1 5 (aktualnie)
Obsługa natywnych plików binarnych w .NET 8 Niepotwierdzone (brak nowych wydań) W pełni zweryfikowane
Częstotliwość wydawania poprawek bezpieczeństwa None Regularne wydania
Wdrażanie natywnych plików binarnych
Plik binarny Windows x64 Zawarte w NuGet W pakiecie, bez konfiguracji
Plik binarny dla systemu Windows x86 W zestawie (osobno) W pakiecie, bez konfiguracji
Plik binarny dla systemu Linux x64 W zestawie W pakiecie, bez konfiguracji
plik binarny dla systemu macOS W zestawie W pakiecie, bez konfiguracji
Plik binarny ARM64 Niepotwierdzone po archiwizacji W pakiecie, bez konfiguracji
Wdrożenie Tessdata Ręczne pobieranie i kopiowanie Pakiety językowe NuGet
Wdrożenie Docker Ręczna konfiguracja COPY + ścieżki Działa bez dodatkowych czynności
Funkcje OCR
Podstawowe OCR obrazów Tak Tak
Automatyczne prostowanie Nie Tak
Automatyczne usuwanie szumów Nie Tak
Automatyczny kontrast Nie Tak
Automatyczna binaryzacja Nie Tak
Normalizacja rozdzielczości Nie Tak (EnhanceResolution)
Natywne OCR plików PDF Nie (biblioteka zewnętrzna) Tak
Plik PDF chroniony hasłem Nie (biblioteka zewnętrzna) Tak
Wynik w formacie PDF z możliwością wyszukiwania Nie Tak
eksport hOCR Nie Tak
Wyniki uporządkowane
Pełny tekst dokumentu Tak (page.GetText()) Tak (result.Text)
Na poziomie WORD z koordynatami Tak (interfejs API iteratora) Tak (result.Words)
Dostęp na poziomie wiersza Tak (interfejs API iteratora) Tak (result.Lines)
Wskaźnik pewności Tak (page.GetMeanConfidence()) Tak (result.Confidence)
Wyniki na poziomie strony Nie Tak (result.Pages)
Odczytywanie BarCode podczas OCR Nie Tak
OCR oparte na regionie Nie Tak (CropRectangle)
Obsługa języków
Liczba języków Standard Tesseract (100+) Ponad 125 pakietów dostępnych za pośrednictwem NuGet
Metoda instalacji języka Ręczne pobieranie pliku tessdata dotnet add package
Wiele języków jednocześnie Tak Tak

Status konserwacji i cykl życia projektu

Najważniejszą różnicą między tymi dwiema bibliotekami jest to, że jedna z nich nie istnieje już jako projekt podlegający aktualizacji.

charlesw/tesseract: Co oznacza zarchiwizowanie w praktyce

Archiwizacja repozytorium GitHub oznacza, że opiekun podjął świadomą decyzję o zaprzestaniu wszelkich prac rozwojowych. Repozytoriumcharlesw/tesseractwyraźnie pokazuje ten status. Od 2021 r. nie wprowadzono żadnych zmian. Silnik Tesseract 5, który został wydany w grudniu 2021 r. z przeprogramowanym modelem LSTM zapewniającym wyższą dokładność w przypadku skanów o niskiej jakości, nie jest dostępny w tym pakiecie. Wszelkie błędy wykryte od czasu archiwizacji — w tym problemy z kompatybilnością z nowszymi środowiskami uruchomieniowymi .NET, zmienione zachowanie ładowania natywnych plików binarnych w systemie Linux lub kwestie związane z bezpieczeństwem w bibliotece C Tesseract — nie mają możliwości naprawy.

Nowe projekty, które dziś polegają na zależnościach NuGet od Tesseract, zaczynają się od pakietu, który otrzymał już swoją ostateczną aktualizację. Za dwanaście miesięcy ta zależność będzie o kolejny rok dalej od jakiejkolwiek konserwacji. Za trzy lata prawdopodobnie nie będzie działać na ówczesnych środowiskach uruchomieniowych .NET. Pakiet nadal będzie się instalował, a podstawowy interfejs API nadal będzie się kompilował, ale dług techniczny będzie się gromadził w sposób niewidoczny.

Praktyczna konsekwencja wykraczająca poza lukę w dokładności: jeśli zostanie opublikowany krytyczny CVE dla kodu C++ Tesseract 4.1.1, pakiet NuGet charlesw nie otrzyma poprawki. Jedynymi rozwiązaniami są rozgałęzienie i ponowne skompilowanie natywnych plików binarnych ze źródeł — co nie jest łatwym zadaniem — albo pogodzenie się z tym ryzykiem.

Podejście IronOCR

IronOCR zawiera Tesseract 5 z udoskonaleniami wprowadzonymi do procesu rozpoznawania, a biblioteka IronOCR jest regularnie aktualizowana. Ulepszenia dokładności wynikające z modelu Tesseract 5 są dostępne bez żadnych zmian w kodzie — zapewnia je aktualizacja pakietu. Podręcznik konfiguracji IronTesseract obejmuje aktualny interfejs API, który odzwierciedla aktywny rozwój, a nie zamrożoną wersję z 2021 roku.

W przypadku produkcyjnego OCR w aplikacji .NET poleganie na archiwalnej bibliotece stanowi ryzyko biznesowe, a nie tylko preferencję techniczną. Celem tego porównania jest rzetelna ocena tego ryzyka.

Wdrażanie natywnych plików binarnych

W tej sekcji status archiwizacjicharlesw/tesseractpowoduje największe bezpośrednie utrudnienia w rozwoju. Model wdrażania biblioteki wymaga zarządzania natywnymi plikami binarnymi i plikami tessdata jako wyraźnymi artefaktami w każdym potoku wdrożeniowym.

charlesw/tesseract podejście

Pakiet NuGet Tesseract zawiera natywne binaria dla najczęściej używanych platform wewnątrz swojego folderu runtimes/. Na stacji roboczej programisty korzystającej z domyślnego zachowania publikowania .NET SDK pliki binarne są automatycznie kopiowane do katalogu wyjściowego i wszystko działa. Problemy pojawiają się, gdy cele wdrożenia odbiegają od tego idealnego scenariusza:

// Production code must handle path differences across environments
// There is no standard solution — every team builds their own

public class TesseractEngineFactory
{
    private static string ResolveTessDataPath()
    {
        // Dev machine: ./tessdata relative to executable
        // Docker: /app/tessdata (must be COPY'd into image)
        // Azure App Service: D:\home\site\wwwroot\tessdata
        // All three paths are different; all three need correct traineddata files

        var candidates = new[]
        {
            Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"),
            Path.Combine(Directory.GetCurrentDirectory(), "tessdata"),
            "/app/tessdata",  // Docker-specific hard-code
        };

        foreach (var candidate in candidates)
        {
            if (Directory.Exists(candidate))
                return candidate;
        }

        throw new DirectoryNotFoundException("tessdata not found — deployment misconfigured");
    }

    public static TesseractEngine Create()
    {
        // TesseractEngine P/Invokes tesseract50.dll on Windows, libtesseract.so on Linux
        // If the native binary for the current runtime identifier is missing, throws DllNotFoundException
        return new TesseractEngine(ResolveTessDataPath(), "eng", EngineMode.Default);
    }
}
// Production code must handle path differences across environments
// There is no standard solution — every team builds their own

public class TesseractEngineFactory
{
    private static string ResolveTessDataPath()
    {
        // Dev machine: ./tessdata relative to executable
        // Docker: /app/tessdata (must be COPY'd into image)
        // Azure App Service: D:\home\site\wwwroot\tessdata
        // All three paths are different; all three need correct traineddata files

        var candidates = new[]
        {
            Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"),
            Path.Combine(Directory.GetCurrentDirectory(), "tessdata"),
            "/app/tessdata",  // Docker-specific hard-code
        };

        foreach (var candidate in candidates)
        {
            if (Directory.Exists(candidate))
                return candidate;
        }

        throw new DirectoryNotFoundException("tessdata not found — deployment misconfigured");
    }

    public static TesseractEngine Create()
    {
        // TesseractEngine P/Invokes tesseract50.dll on Windows, libtesseract.so on Linux
        // If the native binary for the current runtime identifier is missing, throws DllNotFoundException
        return new TesseractEngine(ResolveTessDataPath(), "eng", EngineMode.Default);
    }
}
Imports System
Imports System.IO

' Production code must handle path differences across environments
' There is no standard solution — every team builds their own

Public Class TesseractEngineFactory
    Private Shared Function ResolveTessDataPath() As String
        ' Dev machine: ./tessdata relative to executable
        ' Docker: /app/tessdata (must be COPY'd into image)
        ' Azure App Service: D:\home\site\wwwroot\tessdata
        ' All three paths are different; all three need correct traineddata files

        Dim candidates = New String() {
            Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"),
            Path.Combine(Directory.GetCurrentDirectory(), "tessdata"),
            "/app/tessdata"  ' Docker-specific hard-code
        }

        For Each candidate In candidates
            If Directory.Exists(candidate) Then
                Return candidate
            End If
        Next

        Throw New DirectoryNotFoundException("tessdata not found — deployment misconfigured")
    End Function

    Public Shared Function Create() As TesseractEngine
        ' TesseractEngine P/Invokes tesseract50.dll on Windows, libtesseract.so on Linux
        ' If the native binary for the current runtime identifier is missing, throws DllNotFoundException
        Return New TesseractEngine(ResolveTessDataPath(), "eng", EngineMode.Default)
    End Function
End Class
$vbLabelText   $csharpLabel

Same pliki tessdata dodają kolejny krok wdrażania. Dla języka angielskiego eng.traineddata ma około 15 MB. Dla każdego dodatkowego języka, kolejny plik o wielkości 15 MB musi być pobrany z repozytorium GitHub Tesseract, zapisany w kontroli źródeł lub sklepie artefaktów wdrożeniowych, skonfigurowany do kopiowania do katalogu wyjściowego w .csproj i zweryfikowany jako obecny w każdym środowisku. Wpis .csproj wygląda następująco:


<ItemGroup>
  <None Update="tessdata\**\*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

<ItemGroup>
  <None Update="tessdata\**\*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
XML

Zapomnij o tym wpisie w nowym projekcie, wdroż go do CI, a potok OCR zawiedzie w czasie wykonywania z błędem ścieżki — nie jest to błąd kompilacji. Błąd ujawnia się w środowisku produkcyjnym lub stagingowym, a nie w czasie kompilacji.

W systemie Linux na architekturze ARM64 — coraz bardziej istotnym w miarę jak agenci kompilacji AWS Graviton i Apple Silicon stają się standardem — archiwalny pakiet nie daje gwarancji zaktualizowanych plików binarnych. Ostatnia publikacja pakietu miała miejsce przed powszechnym wdrożeniem infrastruktury serwerowej ARM64.

Podejście IronOCR

IronOCR zawiera wszystkie natywne pliki binarne i angielskie dane tessdata w samym pakiecie NuGet. Nie ma plików tessdata do zarządzania, żadnych wpisów .csproj CopyToOutputDirectory i żadnej logiki ścieżki specyficznej dla platformy do napisania. Cała instalacja to:

// Install: dotnet add package IronOcr
// Nie tessdata download. Nie native binary configuration. Nie path management.

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var text = new IronTesseract().Read("document.jpg").Text;
// Install: dotnet add package IronOcr
// Nie tessdata download. Nie native binary configuration. Nie path management.

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var text = new IronTesseract().Read("document.jpg").Text;
' Install: dotnet add package IronOcr
' Nie tessdata download. Nie native binary configuration. Nie path management.

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

Kod ten działa bez zmian na systemach Windows x64, Linux x64, Linux ARM64, macOS x64 i macOS ARM64. Ten sam plik binarny można wdrożyć w Dockerze, Azure App Service i AWS Lambda bez żadnej logiki zależnej od platformy. Przewodnik wdrażania Docker oraz przewodnik wdrażania Linux dokumentują konkretne wymagania dla platform innych niż Windows, które są minimalne.

Dodatkowe języki instaluje się za pośrednictwem NuGet — bez pobierania plików i konfiguracji katalogów:

// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-document.jpg");
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-document.jpg");
Imports IronOcr

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)
Dim result = ocr.Read("multilingual-document.jpg")
$vbLabelText   $csharpLabel

Różnica w złożoności wdrożenia nie jest marginalna. Zespoły utrzymującecharlesw/tesseractw potokach CI/CD z wieloma celami wdrożeniowymi rutynowo spędzają 4–8 godzin na debugowaniu problemów związanych ze ścieżkami i plikami binarnymi, które IronOCR całkowicie eliminuje. Aby uzyskać pełny przewodnik po odczytywaniu tekstu z obrazów bez utrudnień związanych z wdrażaniem, samouczek IronOCR obejmuje cały proces.

Tesseract 4.x a Tesseract 5 – dokładność

Pakietcharlesw/tesseractzawiera Tesseract 4.1.1, ostatnią wersję 4.x przed przepisaniem Tesseract 5.IronOCR zawiera Tesseract 5 z dodatkowym przetwarzaniem wstępnym stosowanym przed przesłaniem obrazu do silnika. Różnica w dokładności w rzeczywistych dokumentach jest znaczna.

charlesw/tesseract podejście

W przypadku czystych skanów o wysokiej rozdzielczości Tesseract 4.1.1 daje wyniki porównywalne z Tesseract 5. Różnice pojawiają się w przypadku materiałów wejściowych o gorszej jakości: obrazów o niskiej rozdzielczości, lekko przekrzywionych dokumentów, faksów i zdjęć wydrukowanego tekstu. Model LSTM w Tesseract 4.1.1 nie korzystał z dodatkowych danych szkoleniowych i udoskonaleń architektury, które wprowadzono w Tesseract 5.

Co ważniejsze,charlesw/tesseractnie zapewnia żadnego przetwarzania wstępnego. Surowy obraz trafia bezpośrednio do silnika. W przypadku skanowania w rozdzielczości 150 DPI za pomocą konsumenckiego skanera płaskiego dokładność spada do 40–70%. W przypadku dokumentu z odchyleniem o 5 stopni dokładność może spaść poniżej 70%. W przypadku zdjęcia dokumentu wykonanego pod niewielkim kątem przy nierównomiernym oświetleniu dokładność może wynosić 10–40%:

// charlesw/Tesseract: what you get without preprocessing
public string ExtractText(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    // On a poor-quality scan: 40-70% accuracy
    // On a skewed document: 60-80% accuracy
    // On a photo of a document: 10-40% accuracy
    return page.GetText();
}
// charlesw/Tesseract: what you get without preprocessing
public string ExtractText(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    // On a poor-quality scan: 40-70% accuracy
    // On a skewed document: 60-80% accuracy
    // On a photo of a document: 10-40% accuracy
    return page.GetText();
}
Imports Tesseract

Public Function ExtractText(imagePath As String) As String
    Using engine As New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
        Using img As Pix = Pix.LoadFromFile(imagePath)
            Using page As Page = engine.Process(img)
                ' On a poor-quality scan: 40-70% accuracy
                ' On a skewed document: 60-80% accuracy
                ' On a photo of a document: 10-40% accuracy
                Return page.GetText()
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Odzyskanie użytecznej dokładności wymaga procesu przetwarzania wstępnego — konwersji do skali szarości, wzmocnienia kontrastu, binarizacji, prostowania za pomocą transformacji Hougha lub profili projekcji, usuwania szumów oraz normalizacji DPI. Ten pipeline to 100–300 linii dodatkowego kodu używającego System.Drawing, SixLabors.ImageSharp, lub podobnych — z których żaden nie jest częścią pakietu Tesseract. Każdy etap przetwarzania wstępnego wymaga oddzielnej implementacji, testowania i dostosowania. Sam etap prostowania, poprawnie zaimplementowany przy użyciu transformacji Hougha, zajmuje ponad 50 wierszy.

Podejście IronOCR

IronOCR stosuje automatyczne przetwarzanie wstępne przed przekazaniem obrazu do silnika Tesseract 5. Ten sam skan o niskiej jakości, który zapewnia 40–70% dokładności w przypadku surowego charlesw/tesseract, zapewnia ponad 95% dokładności w przypadku IronOCR, ponieważ biblioteka normalizuje obraz, zanim silnik go zobaczy. Gdy potrzebna jest wyraźna kontrola, API przetwarzania wstępnego odzwierciedla etapy potoku bez konieczności niestandardowej implementacji:

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Named preprocessing steps — no custom image processing code
input.Deskew();               // Corrects rotation up to ~10 degrees
input.DeNoise();              // Removes speckle and scanner noise
input.Contrast();             // Normalizes contrast
input.Binarize();             // Adaptive thresholding
input.EnhanceResolution(300); // Upsamples to 300 DPI if needed

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Named preprocessing steps — no custom image processing code
input.Deskew();               // Corrects rotation up to ~10 degrees
input.DeNoise();              // Removes speckle and scanner noise
input.Contrast();             // Normalizes contrast
input.Binarize();             // Adaptive thresholding
input.EnhanceResolution(300); // Upsamples to 300 DPI if needed

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

Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    ' Named preprocessing steps — no custom image processing code
    input.Deskew()               ' Corrects rotation up to ~10 degrees
    input.DeNoise()              ' Removes speckle and scanner noise
    input.Contrast()             ' Normalizes contrast
    input.Binarize()             ' Adaptive thresholding
    input.EnhanceResolution(300) ' Upsamples to 300 DPI if needed

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

Przewodnik po korekcji jakości obrazu dokumentuje pełen zestaw filtrów przetwarzania wstępnego oraz ich zastosowania. W przypadku dokumentów z kolorowym tłem lub nierównomiernym oświetleniem, przewodnik po korekcji kolorów obrazu zawiera informacje o dodatkowych filtrach. Oba przewodniki odzwierciedlają aktualny interfejs API — w przeciwieństwie do dokumentacji charlesw, która opisuje bibliotekę, która nie jest już aktualizowana.

W przypadku scenariuszy skanowania o niskiej jakości przykład OCR dla skanów o niskiej jakości pokazuje różnicę w dokładności przed i po przetworzeniu na konkretnych danych wejściowych.

Kod wdrożeniowy zależny od platformy

Interakcja między natywnym zarządzaniem plikami binarnymi a wdrażaniem międzyplatformowym tworzy kategorię kodu, która istnieje wyłącznie dzięki modelowi pakietowaniacharlesw/tesseract— a kod ten nie ma odpowiednika w projektach IronOCR.

charlesw/tesseract podejście

Zespoły wdrażającecharlesw/tesseractw wielu środowiskach gromadzą logikę warunkowego wdrażania, która nie ma nic wspólnego z OCR. Ścieżka do pliku tessdata różni się w zależności od środowiska. Zachowanie natywnego ładowania plików binarnych różni się w systemach Windows i Linux. Obrazy Docker wymagają jawnych instrukcji COPY i poleceń apt-get dla zależności Leptonica na niektórych podstawowych obrazach Linux:

// Platform-conditional code required to deploy charlesw/Tesseract
// This block exists in real production codebases

public static class TesseractFactory
{
    public static string GetTessDataPath()
    {
        // Runtime environment detection — purely deployment plumbing
        if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true")
        {
            // Docker: tessdata must be explicitly COPY'd into the image
            return "/app/tessdata";
        }

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            // Linux bare metal: path convention differs from Windows
            return Path.Combine(AppContext.BaseDirectory, "tessdata");
        }

        // Windows dev machine
        return @"./tessdata";
    }

    public static TesseractEngine CreateEngine()
    {
        // x86/x64 conditional logic may be needed for specific deployment targets
        // EngineMode.Default uses LSTM; EngineMode.TesseractOnly uses legacy engine
        return new TesseractEngine(GetTessDataPath(), "eng", EngineMode.Default);
    }
}
// Platform-conditional code required to deploy charlesw/Tesseract
// This block exists in real production codebases

public static class TesseractFactory
{
    public static string GetTessDataPath()
    {
        // Runtime environment detection — purely deployment plumbing
        if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true")
        {
            // Docker: tessdata must be explicitly COPY'd into the image
            return "/app/tessdata";
        }

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            // Linux bare metal: path convention differs from Windows
            return Path.Combine(AppContext.BaseDirectory, "tessdata");
        }

        // Windows dev machine
        return @"./tessdata";
    }

    public static TesseractEngine CreateEngine()
    {
        // x86/x64 conditional logic may be needed for specific deployment targets
        // EngineMode.Default uses LSTM; EngineMode.TesseractOnly uses legacy engine
        return new TesseractEngine(GetTessDataPath(), "eng", EngineMode.Default);
    }
}
Imports System
Imports System.IO
Imports System.Runtime.InteropServices

Public Module TesseractFactory
    Public Function GetTessDataPath() As String
        ' Runtime environment detection — purely deployment plumbing
        If Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") = "true" Then
            ' Docker: tessdata must be explicitly COPY'd into the image
            Return "/app/tessdata"
        End If

        If RuntimeInformation.IsOSPlatform(OSPlatform.Linux) Then
            ' Linux bare metal: path convention differs from Windows
            Return Path.Combine(AppContext.BaseDirectory, "tessdata")
        End If

        ' Windows dev machine
        Return "./tessdata"
    End Function

    Public Function CreateEngine() As TesseractEngine
        ' x86/x64 conditional logic may be needed for specific deployment targets
        ' EngineMode.Default uses LSTM; EngineMode.TesseractOnly uses legacy engine
        Return New TesseractEngine(GetTessDataPath(), "eng", EngineMode.Default)
    End Function
End Module
$vbLabelText   $csharpLabel

Plik Dockerfile dla projektu wykorzystującegocharlesw/tesseractwymaga jawnego kopiowania plików tessdata i może wymagać instalacji pakietu Leptonica na poziomie systemu, w zależności od obrazu bazowego:

# Dockerfile for charlesw/Tesseract deployment
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

# Leptonica may need system installation depending on base image
RUN apt-get update && apt-get install -y libleptonica-dev

COPY --from=build /app/publish /app

# tessdata must be explicitly staged — not bundled in the NuGet package
COPY tessdata/ /app/tessdata/

WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

Ten plik Dockerfile osadza wiedzę operacyjną na temat modelu wdrażaniacharlesw/tesseractbezpośrednio w kodzie infrastruktury. Gdy zmienia się obraz bazowy lub dystrybucja Linuksa aktualizuje Leptonica, kompilacja się nie udaje. W przypadku pakietu archiwalnego jedynym rozwiązaniem jest utrzymanie niestandardowego, natywnego potoku kompilacji plików binarnych.

Podejście IronOCR

IronOCR nie posiada etapu tessdata COPY, nie wymaga instalacji pakietu systemowego dla Leptonica i nie zawiera logiki ścieżek zależnych od platformy. Przewodnik wdrażania Docker dla IronOCR wymaga jedynie standardowej instalacji libgdiplus dla obsługi System.Drawing na Linux — infrastruktury, której każda aplikacja .NET na Linux już potrzebuje:

# Dockerfile for IronOCR deployment
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

# libgdiplus is standard for any .NET app using System.Drawing on Linux
RUN apt-get update && apt-get install -y libgdiplus

COPY --from=build /app/publish /app

# Nie tessdata COPY. Nie Leptonica apt-get. Nie native binary management.

WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

Przewodnik wdrożeniowy AWS i przewodnik wdrożeniowy Azure mają ten sam schemat: jeden standardowy pakiet systemowy, a następnie aplikacja. Nie jest wymagany kod infrastruktury specyficzny dla biblioteki.

Przewodnik po mapowaniu API

charlesw/tesseract Odpowiednik IronOCR
new TesseractEngine(tessDataPath, "eng", EngineMode.Default) new IronTesseract() (bez ścieżki, bez wyboru trybu)
Pix.LoadFromFile(imagePath) input.LoadImage(imagePath)
engine.Process(img) ocr.Read(input)
page.GetText() result.Text
page.GetMeanConfidence() result.Confidence
page.GetIterator() result.Words, result.Lines, result.Pages
iter.GetText(PageIteratorLevel.Word) word.Text (foreach over result.Words)
iter.GetConfidence(PageIteratorLevel.Word) word.Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds) word.X, word.Y, word.Width, word.Height
EngineMode.Default Automatyczne (domyślnie Tesseract 5 LSTM)
EngineMode.TesseractOnly ocr.Configuration.PageSegmentationMode
PageIteratorLevel.Word result.Words kolekcja
PageIteratorLevel.Line result.Lines kolekcja
TessDataPath (manual path) Nie dotyczy (w pakiecie)
Ręczne pobieranie pliku tessdata dotnet add package IronOcr.Languages.French
Ręczne prostowanie (transformacja Hougha) input.Deskew()
Ręczne wzmocnienie kontrastu input.Contrast()
Ręczna binaryzacja input.Binarize()
Ręczne skalowanie DPI input.EnhanceResolution(300)
Niedostępne (biblioteka zewnętrzna) input.LoadPdf(pdfPath)
Niedostępne result.SaveAsSearchablePdf(outputPath)

Kiedy zespoły rozważają przejście zcharlesw/tesseractdo IronOCR

Projekty typu greenfield, które znalazły stary samouczek

Najczęściej spotykanym scenariuszem jest deweloper, który rozpoczyna nowy projekt, znajdując odpowiedź na Stack Overflow z 2019 lub 2020 roku albo wpis blogowy odnoszący się do charlesw/tesseract, instalując pakiet i odkrywając w połowie projektu, że jest on zarchiwizowany. W tym momencie zespół staje przed decyzją: kontynuować z zamrożoną zależnością lub przeprowadzić migrację, zanim baza kodu się powiększy. Zespoły, które zauważają status archiwizacji przed wysyłką, zazwyczaj natychmiast migrują — powierzchnia API jest na tyle mała, że migracja zcharlesw/tesseractdo IronOCR zajmuje zazwyczaj kilka godzin, a ryzyko związane z bieżącą konserwacją znika. Centrum samouczków IronOCR zawiera aktualne przykłady, które zastępują przestarzałe treści społecznościowe, które doprowadziły do powstania zależności charlesw/tesseract.

Wymagania dotyczące wdrażania na wielu platformach

Zespoły, które początkowo wdrożyłycharlesw/tesseractw systemie Windows, a następnie dodały cele dla systemu Linux — co stało się powszechne wraz ze wzrostem popularności Kubernetes i Docker — w pełni odczuły złożoność wdrażania natywnych plików binarnych. Konfigurowanie ścieżek tessdata, sprawdzanie dostępności Leptonica, zarządzanie instrukcjami Docker zależnymi od platformy: to wszystko szybko się kumuluje. Gdy docelowe środowisko wdrożeniowe obejmuje ARM64 (AWS Graviton ze względu na koszty, Apple Silicon dla CI), obsługa plików binarnych w archiwizowanym pakiecie staje się niepewna. Zespoły w takiej sytuacji rozważają IronOCR, gdy obciążenie związane ze wsparciem wdrożeniowym przewyższa koszt licencji komercyjnej. Przewodnik wdrożeniowy dla systemu Linux pokazuje, jak wygląda wdrożenie IronOCR w porównaniu: jest znacznie prostsze. Zobacz stronę licencyjną dla aktualnych stawek.

Dokumenty, które nie spełniają wymagań dotyczących dokładności

Zespoły korzystające zcharlesw/tesseractna czystych, kontrolowanych danych wejściowych — skanach dokumentów pisanych na maszynie o wysokiej rozdzielczości — widzą zadowalające wyniki i nie mają bezpośredniego powodu, aby zmieniać oprogramowanie. Sygnałem do działania jest nadejście dokumentów z prawdziwego świata: zeskanowanych formularzy od podmiotów zewnętrznych, faksów, zdjęć z urządzeń mobilnych, starszych materiałów drukowanych o pogorszonej jakości kontrastu. Bez wstępnego przetwarzania dokładnośćcharlesw/tesseractw przypadku tych danych wejściowych spada poniżej progów użyteczności. Budowanie potoku przetwarzania wstępnego w oparciu o zarchiwizowany pakiet oznacza inwestowanie czasu programistów w infrastrukturę, która obsługuje zależność bez przyszłości. W tym punkcie zwrotnym argumenty przemawiające za automatycznym przetwarzaniem wstępnym IronOCR i dokładnością Tesseract 5 stają się oczywiste.

Przeglądy bezpieczeństwa i zgodności

Audyty zależności w środowiskach podlegających regulacjom — opieka zdrowotna, finanse, administracja publiczna — oznaczają zarchiwizowane pakiety jako nieprawidłowości. Zależność, która nie może otrzymać poprawek bezpieczeństwa, stanowi ryzyko dla zgodności z przepisami, niezależnie od jej aktualnego statusu podatności. Pakietcharlesw/tesseractstanowi nakładkę na bibliotekę C++; żadne przyszłe luki CVE w kodzie C Tesseract 4.1.1 nie mają ścieżki naprawy poprzez pakiet NuGet. Zespoły ds. zgodności sprawdzające system zbudowany na archiwalnej zależności będą wymagały albo jej zastąpienia, albo udokumentowanego wyjątku. Zespoły, które napotykają ten problem podczas audytu bezpieczeństwa, wybierają IronOCR, aby usunąć to zgłoszenie, zamiast dokumentówać wyjątek w każdym cyklu audytowym.

Wymagania dotyczące dokładności Tesseract 5

Zespoły, które porównałycharlesw/tesseractpod kątem wymagań dotyczących dokładności i uznały Tesseract 4.1.1 za niewystarczający — szczególnie w przypadku tekstu odręcznego, skanów o niskiej jakości lub dokumentów z nietypowymi czcionkami — nie mogą zaktualizować silnika za pomocą zarchiwizowanego pakietu. Tesseract 5 nie jest dostępny bez zmiany bibliotek.IronOCR zapewnia dokładność na poziomie Tesseract 5, a dodatkowo oferuje automatyczne przetwarzanie wstępne, co jeszcze bardziej zwiększa dokładność. Różnica w jakości dokumentów o obniżonej rozdzielczości jest na tyle duża (40–70% w porównaniu z ponad 95% w przypadku skanów o niskiej rozdzielczości), że decyduje o migracji niezależnie od kwestii związanych z utrzymaniem.

Typowe kwestie związane z migracją

Zastąpienie TesseractEngine przez IronTesseract

APIcharlesw/tesseractopiera się na konstruowaniu TesseractEngine z jawną ścieżką tessdata i łańcuchem kodu językowego.IronOCR zastępuje cały ten wzorzec konstrukcji konstruktorem bez argumentów. Konfiguracja silnika, która była domyślnie ustawiona w stałej TessDataPath i enumie EngineMode, staje się nieistotna —IronOCR zarządza inicjalizacją własnego silnika wewnętrznie:

// Before: charlesw/Tesseract
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
var text = page.GetText();

// After: IronOCR
var text = new IronTesseract().Read(imagePath).Text;
// Before: charlesw/Tesseract
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
var text = page.GetText();

// After: IronOCR
var text = new IronTesseract().Read(imagePath).Text;
Imports Tesseract

Dim text As String

Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
    Using img As Pix = Pix.LoadFromFile(imagePath)
        Using page As Page = engine.Process(img)
            text = page.GetText()
        End Using
    End Using
End Using

' After: IronOCR
text = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

Stała TessDataPath, folder tessdata oraz wpis .csproj CopyToOutputDirectory wszystkie zostają usunięte. Należy również usunąć wszelki kod rozpoznawania ścieżek zależny od platformy. Dokumentacja API IronTesseract obejmuje pełen zakres konfiguracji, jeśli konieczne jest dostosowanie na poziomie silnika wykraczające poza ustawienia domyślne.

Zastąpienie iteratora stron wynikami ustrukturyzowanymi

charlesw/tesseract udostępnia dane na poziomie słów za pomocą wzorca iteratora — page.GetIterator(), iter.Begin(), iter.Next() z wartościami enum PageIteratorLevel.IronOCR zastępuje to bezpośrednim dostępem do kolekcji w obiekcie wynikowym. Szablon iteratora usuwa; dane są bezpośrednio dostępne:

// Before: charlesw/Tesseract iterator pattern
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        var word = iter.GetText(PageIteratorLevel.Word);
        var confidence = iter.GetConfidence(PageIteratorLevel.Word);
        Console.WriteLine($"'{word?.Trim()}' at ({bounds.X1},{bounds.Y1}) - {confidence:P1}");
    }
} while (iter.Next(PageIteratorLevel.Word));

// After:IronOCR direct collection access
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) - {word.Confidence}%");
}
// Before: charlesw/Tesseract iterator pattern
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        var word = iter.GetText(PageIteratorLevel.Word);
        var confidence = iter.GetConfidence(PageIteratorLevel.Word);
        Console.WriteLine($"'{word?.Trim()}' at ({bounds.X1},{bounds.Y1}) - {confidence:P1}");
    }
} while (iter.Next(PageIteratorLevel.Word));

// After:IronOCR direct collection access
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) - {word.Confidence}%");
}
Imports System

' Before: charlesw/Tesseract iterator pattern
Using iter = page.GetIterator()
    iter.Begin()
    Do
        Dim bounds As Object
        If iter.TryGetBoundingBox(PageIteratorLevel.Word, bounds) Then
            Dim word = iter.GetText(PageIteratorLevel.Word)
            Dim confidence = iter.GetConfidence(PageIteratorLevel.Word)
            Console.WriteLine($"'{word?.Trim()}' at ({bounds.X1},{bounds.Y1}) - {confidence:P1}")
        End If
    Loop While iter.Next(PageIteratorLevel.Word)
End Using

' After: IronOCR direct collection access
Dim result = New IronTesseract().Read(imagePath)
For Each word In result.Words
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) - {word.Confidence}%")
Next
$vbLabelText   $csharpLabel

Przewodnik po wynikach odczytu obejmuje pełny model wyników strukturalnych — strony, akapity, wiersze, słowa i znaki — wszystkie dostępne bez zarządzania iteratorami.

Dodanie obsługi plików PDF

charlesw/tesseract nie obsługuje plików PDF. Projekty, które przetwarzają dokumenty PDF wraz z obrazami, zazwyczaj mają drugą zależność — PdfiumViewer, PDFtoImage lub podobną — która renderuje strony PDF do obiektów Bitmap przed przekazaniem ich do Tesseract. Tę bibliotekę pomocniczą i jej natywną zależność binarną można całkowicie usunąć podczas migracji do IronOCR:

// Before: charlesw/Tesseract + PdfiumViewer (two libraries, two native dependencies)
using (var document = PdfDocument.Load(pdfPath))
using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
{
    for (int i = 0; i < document.PageCount; i++)
    {
        using var pageImage = document.Render(i, 300, 300, PdfRenderFlags.CorrectFromDpi);
        // Save temp file, load into Pix, process, delete temp file...
    }
}

// After:IronOCR(one library, native PDF support)
var text = new IronTesseract().Read(pdfPath).Text;
// Before: charlesw/Tesseract + PdfiumViewer (two libraries, two native dependencies)
using (var document = PdfDocument.Load(pdfPath))
using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
{
    for (int i = 0; i < document.PageCount; i++)
    {
        using var pageImage = document.Render(i, 300, 300, PdfRenderFlags.CorrectFromDpi);
        // Save temp file, load into Pix, process, delete temp file...
    }
}

// After:IronOCR(one library, native PDF support)
var text = new IronTesseract().Read(pdfPath).Text;
Imports PdfiumViewer
Imports Tesseract

Using document As PdfDocument = PdfDocument.Load(pdfPath)
    Using engine As New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
        For i As Integer = 0 To document.PageCount - 1
            Using pageImage = document.Render(i, 300, 300, PdfRenderFlags.CorrectFromDpi)
                ' Save temp file, load into Pix, process, delete temp file...
            End Using
        Next
    End Using
End Using

' After:IronOCR(one library, native PDF support)
Dim text As String = New IronTesseract().Read(pdfPath).Text
$vbLabelText   $csharpLabel

Podręcznik dotyczący plików wejściowych w formacie PDF obejmuje wybór zakresu stron, pliki PDF chronione hasłem oraz pliki wyjściowe w formacie PDF z możliwością wyszukiwania — funkcje, które wymagały oddzielnych bibliotek i znacznej ilości kodu w ramach charlesw/tesseract.

Migracja pakietu językowego

Każdy język wcharlesw/tesseractwymagał osobnego pobrania pliku .traineddata, ręcznego przechowywania i jawnej konfiguracji wdrożenia. Migracja do pakietów językowych IronOCR polega na dodaniu pakietu NuGet dla każdego języka, bez żadnych innych zmian:

# Remove manual tessdata files and .csproj CopyToOutputDirectory entries
# Add Pakiety językowe NuGet instead:
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
# Remove manual tessdata files and .csproj CopyToOutputDirectory entries
# Add Pakiety językowe NuGet instead:
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
SHELL

Przewodnik dotyczący wielu języków obejmuje rozpoznawanie wielu języków jednocześnie. Indeks języków zawiera listę wszystkich ponad 125 dostępnych pakietów językowych.

Dodatkowe możliwości IronOCR

Oprócz funkcji, które odpowiadają bezpośrednio odpowiednikom w charlesw/tesseract,IronOCR oferuje możliwości, które nie mają odpowiednika w archiwalnym pakiecie:

  • Wyjście do przeszukiwalnego PDF: result.SaveAsSearchablePdf() generuje plik PDF z niewidoczną warstwą tekstową nałożoną na oryginalny obraz — jedno wywołanie metody dla funkcji, która wymaga osobnej biblioteki PDF w systemie charlesw/tesseract
  • OCR na podstawie regionu: CropRectangle ogranicza rozpoznawanie do konkretnych obszarów obrazu, zwiększając szybkość i dokładność dla dokumentów strukturalnych jak faktury i formularze
  • Odczyt kodów kreskowych podczas OCR: ocr.Configuration.ReadBarCodes = true wyodrębnia zarówno tekst, jak i kody kreskowe z dokumentu podczas jednego przejścia
  • Wyniki pewności na wszystkich poziomach: pewność na poziomie WORD, wiersza i strony dostępna bezpośrednio z obiektu wyników bez powtarzalnego kodu iteratora
  • Przetwarzanie zeskanowanych dokumentów: specjalne optymalizacje potoku dla wielostronicowych dokumentów zeskanowanych, w tym automatyczne wykrywanie obrotu strony
  • Async OCR: Natywna obsługa operacji OCR w trybie asynchronicznym — istotna dla aplikacji ASP.NET, w których blokowanie na OCR jest niedopuszczalne
  • Ekstrakcja tabel: ustrukturyzowane wyodrębnianie danych tabelarycznych ze skanowanych dokumentów z zachowaniem relacji między wierszami i kolumnami
  • Eksport hOCR: result.SaveAsHocrFile() przekazuje wynik OCR w postaci HTML hOCR z koordynatami słów do dalszego przetwarzania

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

IronOCR jest przeznaczony dla platform .NET 6, .NET 7, .NET 8 i .NET Standard 2.0, a każda wersja jest aktywnie testowana. Wraz z wprowadzeniem .NET 9 do powszechnej sprzedaży i rozpoczęciem wersji zapoznawczej .NET 10 w 2026 r.IronOCR otrzyma aktualizacje w celu zachowania kompatybilności. Pakiet charlesw/tesseract, zarchiwizowany w 2021 r., jest przeznaczony dla .NET Standard 2.0 — działa na aktualnych środowiskach uruchomieniowych .NET dzięki kompatybilności wstecznej, ale nigdy nie zostanie zweryfikowany pod kątem zgodności z .NET 9 lub nowszym, a wszelkie pojawiające się niezgodności na poziomie środowiska uruchomieniowego nie mają rozwiązania w ramach tego pakietu. Dla zespołów, których cykl życia aplikacji trwa wiele lat, ta trajektoria ma znaczenie:IronOCR podąża za rytmem wydawania aktualizacji .NET;charlesw/tesseractprzestał to śledzić cztery lata temu.

Wnioski

Pakietcharlesw/tesseractprzez dekadę definiował integrację .NET z Tesseractem i zasłużył na swoją liczbę pobrań. Działa w projektach wykorzystujących czyste obrazy o wysokiej rozdzielczości w stabilnych środowiskach wdrożeniowych. Jest to węższy zakres zastosowań niż ten, który większość zespołów dostrzega przy pierwszej instalacji.

Status archiwizacji nie jest drobną uwagą na marginesie. Oznacza to, że dokładność Tesseract 5 nie jest dostępna, nie pojawią się poprawki bezpieczeństwa, a złożoność wdrażania na nowoczesnej infrastrukturze wielopłatformowej nie ma rozwiązania ze strony opiekuna. Zespoły, które mają do czynienia z agentami kompilacji ARM64, wymaganiami wdrożeniowymi Docker lub progami obniżonej dokładności skanowania, osiągną limity archiwizowanego pakietu dokładnie w momencie, gdy te wymagania będą miały największe znaczenie.

IronOCR rozwiązuje konkretne problemy, które stworzył charlesw/tesseract: znika ceremonia wdrażania tessdata, znika natywna logika warunkowa platformy binarnej, a dokładność Tesseract 5 pojawia się wraz z automatycznym przetwarzaniem wstępnym. Koszt licencji — zaczynający się od $999 wieczysty — mierzone jest w kontekście oszczędzonych godzin wdrożeniowych, kodu wstępnego przetwarzania, który nie musi być napisany, oraz wyeliminowanego ryzyka utrzymania w sieci zależności.

W przypadku nowych projektów w 2026 r. rozpoczęcie pracy od archiwalnej biblioteki jest świadomym wyborem, mającym na celu zaakceptowanie znanych kosztów przyszłych. Dla zespołów, które już używającharlesw/tesseractw środowisku produkcyjnym, ścieżka migracji jest krótka — powierzchnia API jest niewielka, usunięć kodu jest więcej niż dodanych fragmentów, a dokumentacja IronOCR zawiera aktualne zamienniki dla każdego wzorca wymaganego przez archiwalny pakiet.

Zwróć uwagęPDFium i Tesseract są zarejestrowanymi znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez Chromium Project ani Google. 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 charlesw/tesseract (opakowanie Tesseract dla .NET)?

charlesw/tesseract (opakowanie Tesseract dla .NET) to rozwiązanie OCR używane 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 charlesw/tesseract (opakowanie Tesseract dla .NET) dla programistów .NET?

IronOCR to natywna biblioteka OCR .NET dla NuGet, wykorzystująca IronTesseract jako główny silnik. W porównaniu z charlesw/tesseract (opakowanie Tesseract dla .NET) oferuje prostsze wdrożenie (bez instalatorów SDK), stałą cenę oraz przejrzysty interfejs API w języku C# bez współdziałania COM lub zależności od chmury.

Czy IronOCR jest łatwiejszy w konfiguracji niż charlesw/tesseract (opakowanie Tesseract dla .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 charlesw/tesseract (opakowanie Tesseract dla .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 charlesw/tesseract (opakowanie Tesseract dla .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 charlesw/tesseract?

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 charlesw/tesseract?

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 charlesw/tesseract (opakowanie Tesseract dla .NET) na IronOCR?

Migracja z charlesw/tesseract (opakowanie Tesseract dla .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