Migracja z Syncfusion OCR do IronOCR
Ten przewodnik przeprowadza przez proces pełnej migracji z OCR Syncfusion Processor do IronOCR for .NET dla programistów .NET, którzy muszą wyodrębniać tekst ze skanowanych dokumentów i plików PDF. Omówiono specyficzne zmiany konfiguracji, przepisanie kodu i czyszczenie wdrożenia wymagane do zastąpienia Syncfusion.PDF.OCR.Net.Core pakietem NuGet IronOcr, z szczególnym naciskiem na wyeliminowanie zarządzania plikami tessdata oraz konfigurację ścieżki binarnej Tesseract, którą każdy deployment OCR Syncfusion wymaga.
Dlaczego warto przejść z Syncfusion OCR
Syncfusion OCR to nakładka na Tesseract wbudowana w Suite zawierającą 1600 komponentów. Dla zespołów, których jedynym wymaganiem jest wyodrębnianie tekstu, taka architektura powoduje utrudnienia na każdym poziomie: konfiguracji, wdrażania, utrzymania i licencjonowania.
Folder tessdata towarzyszy każdemu środowisku. Każde stanowisko deweloperskie, runner CI, serwer stagingowy i kontener produkcyjny potrzebują katalogu tessdata zawierającego pliki .traineddata dla każdego języka używanego przez aplikację. Sam język angielski zajmuje 23 MB dla modelu standardowego lub 94 MB dla najlepszego modelu LSTM. Aplikacja obsługująca pięć języków zwiększa rozmiar każdego artefaktu wdrożeniowego o 100–500 MB. Ten folder musi znajdować się dokładnie na ścieżce, którą oczekuje konstruktor OCRProcessor, w przeciwnym razie aplikacja zgłosi wyjątek natychmiast przy uruchomieniu. To nie jest jednorazowy koszt konfiguracji — to jest stały koszt operacyjny, który pojawia się za każdym razem, gdy nowe środowisko jest przygotowywane.
Konfiguracja ścieżki binarnej Tesseract nie działa w różnych środowiskach. Konstruktor OCRProcessor wymaga ścieżki do katalogu tessdata, która musi być poprawnie przypisana na każdej docelowej platformie. Ścieżka, która działa na komputerze deweloperskim z systemem Windows (@"tessdata/"), nie działa na kontenerze Linux, chyba że proces wdrożeniowy jawnie skopiuje folder. Budowanie obrazu Docker musi zawierać warstwę COPY tessdata/ /app/tessdata/. Pipeline'y CI muszą skryptować pobieranie plików tessdata. Środowiska odizolowane muszą zarządzać dystrybucją plików binarnych oddzielnie od przywracania pakietów NuGet. Każde środowisko stwarza nową możliwość wystąpienia niezgodności ścieżek, co powoduje cichą awarię OCR lub wyjątek w czasie wykonywania.
Architektura ukierunkowana na PDF narzuca narzut konwersji dla wejścia obrazu. OCRProcessor Syncfusion akceptuje obiekty PdfLoadedDocument, a nie pliki obrazów. Wyodrębnienie tekstu z pliku JPG wymaga utworzenia PdfDocument, dodania strony, narysowania obrazu na niej, zapisania do MemoryStream, ponownego załadowania jako PdfLoadedDocument, a następnie uruchomienia OCR — dziewięć operacji przed krokiem rozpoznawania tekstu. Ta podróż w obie strony dodaje nadmiar wykonania i złożoność kodu dla każdego toku pracy OCR skupionego na obrazie.
Licencjonowanie Suite powoduje zdarzenia związane z zgodnością, wywołane wzrostem. Licencja społecznościowa Syncfusion wymaga, aby liczba programistów była mniejsza niż pięciu, liczba pracowników mniejsza niż dziesięciu, roczne przychody mniejsze niż 1 mln USD, a łączna kwota zewnętrznego finansowania mniejsza niż 3 mln USD — wszystkie te warunki muszą być spełnione jednocześnie. Przekroczenie dowolnego limitu powoduje natychmiastowe unieważnienie licencji i wymaga komercyjnej aktualizacji w cenie od 995 do 1595 USD rocznie na programistę. Pięcioosobowy zespół programistów, który od trzech lat korzysta z komercyjnej wersji Syncfusion OCR, płaci 14 925–23 925 USD za te same możliwości ekstrakcji tekstu, które oferuje IronOCR Professional za jednorazową opłatą w wysokości 2999 USD.
Brak wbudowanego przetwarzania wstępnego oznacza zależności zewnętrzne w przypadku skanów o niskiej jakości. Bez przetwarzania wstępnego Tesseract daje słabe wyniki w przypadku obrazów obróconych, zaszumionych lub o niskim kontraście. Syncfusion nie udostępnia API do przetwarzania wstępnego. Programiści, którzy potrzebują funkcji prostowania, usuwania szumów lub korekcji kontrastu, muszą dodać oddzielną bibliotekę obrazówania (System.Drawing, SkiaSharp, ImageSharp), zaimplementować filtry i podłączyć wynik do obiegu PDF, zanim będzie można rozpocząć OCR. Jest to zależność od oprogramowania zewnętrznego i wymaga 20–40 dodatkowych linii kodu dla funkcji, którąIronOCR dostarcza jako wbudowane metody.
Potrzebne jest tylko OCR, ale licencjonowany jest cały pakiet. Syncfusion przyciąga Syncfusion.Pdf.Net.Core, Syncfusion.Compression.Net.Core i inne zależności przejściowe, niezależnie od tego, które funkcje są faktycznie używane. Dla zespołów tworzących wyspecjalizowaną usługę przetwarzania dokumentów ten wykres zależności ma duże znaczenie — pod względem czasu kompilacji, rozmiaru obrazu kontenera i kosztów licencji — w przypadku komponentów, które nie mają związku z ekstrakcją tekstu.
Podstawowy problem
Syncfusion OCR wymaga skonfigurowania ścieżki systemu plików tessdata, zanim będzie możliwe jakiekolwiek wywołanie OCR:
// Syncfusion: tessdata path required — fails in any environment where this path is wrong
private const string TessDataPath = @"tessdata/";
using var document = new PdfLoadedDocument("scanned-invoice.pdf");
using var processor = new OCRProcessor(TessDataPath); // throws if path does not resolve
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
var text = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
text.AppendLine(page.ExtractText());
IronOCR nie wymaga konfiguracji ścieżki. Dane językowe są dołączone do pakietu:
// IronOCR: no tessdata path, no path configuration, no folder to deploy
var text = new IronTesseract().Read("scanned-invoice.pdf").Text;
##IronOCR a Syncfusion OCR: porównanie funkcji
Poniższa tabela przedstawia funkcje, które mają największe znaczenie dla zespołów migrujących z Syncfusion OCR.
| Funkcja | OCR Syncfusion | IronOCR |
|---|---|---|
| Pakiet NuGet | Syncfusion.PDF.OCR.Net.Core (pakiet) | IronOcr (samodzielny) |
| tessdata Wymagane | Tak — ręczne pobieranie i konfiguracja ścieżki | Nie — dołączone wewnętrznie |
| Bezpośrednie OCR obrazów | Nie — wymaga dwukrotnej konwersji do formatu PDF | Tak — LoadImage() lub ścieżka bezpośrednia |
| Bezpośrednie OCR plików PDF | Tak — główny model wejściowy | Tak — wsparcie na najwyższym poziomie |
| Automatyczne przetwarzanie wstępne | Nie — wymagana biblioteka zewnętrzna | Tak — prostowanie, usuwanie szumów, kontrast, binarizacja |
| Wyjście w formacie PDF z możliwością wyszukiwania | Tak — zapisz po PerformOCR() | Tak — result.SaveAsSearchablePdf() |
| Obsługiwane języki | Ponad 60 poprzez ręczne pobranie pliku tessdata | Ponad 125 pakietów językowych dostępnych za pośrednictwem NuGet |
| Wielojęzyczne tłumaczenie symultaniczne | Tak — flagi bitowe na enumie Languages | Tak — AddSecondaryLanguage() |
| OCR oparte na regionie | Nie | Tak — CropRectangle |
| Odczytywanie BarCode | Nie | Tak — ocr.Configuration.ReadBarCodes = true |
| Strukturalny wynik | Tylko strony poprzez page.ExtractText() | Strony, akapity, wiersze, słowa, znaki z współrzędnymi |
| Ocena pewności | Nie | Tak — result.Confidence i oceny na słowo |
| Eksport hOCR | Nie | Tak |
| Wejście strumieniowe | Wyłącznie w formacie PDF | Bezpośrednie wprowadzanie strumieniowe obrazów i plików PDF |
| Bezpieczeństwo wątków | Nieudokumentowane jako bezpieczne dla wątków | Pełny — jedna instancja IronTesseract na wątek |
| Wielopłatformowe | Tak — ale tessdata musi działać na każdej platformie | Tak — pojedynczy NuGet, bez konfiguracji ścieżki |
| Wdrażanie Docker | Wymagana warstwa tessdata w obrazie | Pojedynczy pakiet, bez dodatkowych warstw |
| Model licencyjny | Roczna subskrypcja Suite (995–1595 USD/programista/rok) | Perpetual (Lite $999, Pro $1,499, Enterprise $2,999) |
| Ograniczenia licencji społecznościowej | Limity przychodów, liczby pracowników i finansowania z prawem do audytu | Brak ograniczeń dotyczących bezpłatnej wersji próbnej |
| Silnik OCR | Tesseract 5 (standardowa nakładka) | Zoptymalizowany Tesseract 5 z ulepszeniami dokładności |
Szybki start: Migracja z OCR Syncfusion do IronOCR
Krok 1: Zastąp pakiet NuGet
Usuń OCR Syncfusion oraz wszelkie inne pakiety Syncfusion, które zostały dodane wyłącznie ze względu na funkcję OCR:
dotnet remove package Syncfusion.PDF.OCR.Net.Core
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.Compression.Net.Core
Zainstaluj IronOCR z NuGet:
Krok 2: Aktualizacja przestrzeni nazw
Zastąp importy przestrzeni nazw Syncfusion pojedynczą przestrzenią nazw IronOCR:
// Before (Syncfusion)
using Syncfusion.OCRProcessor;
using Syncfusion.PDF;
using Syncfusion.Pdf.Parsing;
// After (IronOCR)
using IronOcr;
Krok 3: Inicjalizacja licencji
Dodaj inicjalizację licencji raz podczas uruchamiania aplikacji, przed jakimkolwiek wywołaniem OCR:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Nie jest wymagana rejestracja Suite. Nie jest wymagana weryfikacja zgodności z licencją społecznościową. Kluczem jest zwykły ciąg znaków przypisany do statycznej właściwości.
Przykłady migracji kodu
Eliminacja ścieżek Tessdata i inicjalizacja OCR
Bazy kodu Syncfusion często zawierają logikę walidacji tessdata — sprawdzanie, czy katalog istnieje oraz czy wymagane pliki .traineddata są obecne przed próbą użycia OCR. Ten kod zabezpieczający istnieje, ponieważ brak pliku tessdata powoduje wyjątek w czasie wykonywania, a incydenty produkcyjne spowodowane brakiem plików językowych są na tyle powszechne, że zespoły piszą kontrole zabezpieczające.
Podejście Syncfusion do OCR:
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;
public class DocumentOcrService
{
// Path hardcoded — different on every deployment target
private const string TessDataPath = @"tessdata/";
private bool ValidateTessdataBeforeUse(string languageCode)
{
// Guard required because missing files cause runtime exceptions
if (!Directory.Exists(TessDataPath))
throw new InvalidOperationException(
"tessdata directory not found. Download from github.com/tesseract-ocr/tessdata_best");
string filePath = Path.Combine(TessDataPath, $"{languageCode}.traineddata");
if (!File.Exists(filePath))
throw new InvalidOperationException(
$"{languageCode}.traineddata not found — file must be downloaded manually");
return true;
}
public string ExtractText(string pdfPath, string languageCode = "eng")
{
ValidateTessdataBeforeUse(languageCode); // defensive check before every call
using var document = new PdfLoadedDocument(pdfPath);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
var sb = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
sb.AppendLine(page.ExtractText());
return sb.ToString();
}
}
Podejście IronOCR:
using IronOcr;
public class DocumentOcrService
{
// Nie tessdata path — no validation logic — no defensive checks
public string ExtractText(string pdfPath)
{
return new IronTesseract().Read(pdfPath).Text;
}
}
Cała metoda ValidateTessdataBeforeUse i stała TessDataPath są usunięte. Kroki procesu wdrażania, które kopiują folder tessdata, zostały usunięte. Skrypt CI, który pobiera pliki .traineddata, jest usunięty. Warstwa Dockerfile, która kopiuje tessdata do obrazu kontenera, została usunięta. Żaden z tych kodów nie musi być zastępowany — po prostu nie jest już potrzebny. Podręcznik konfiguracji IronTesseract obejmuje wszystkie dostępne opcje inicjalizacji, jeśli potrzebna jest konfiguracja wykraczająca poza ustawienia domyślne.
Proces generowania plików PDF z możliwością wyszukiwania
Wynik PDF z możliwością przeszukiwania Syncfusion działa poprzez wywołanie PerformOCR() na załadowanym dokumencie, który dodaje niewidzialną warstwę tekstową na miejscu, a następnie zapisanie zmodyfikowanego dokumentu do strumienia. Wzorzec wymaga zarządzania dwoma strumieniami — wejściowym i wyjściowym — a etapy OCR i zapisywania są oddzielnymi operacjami na tym samym zmiennym obiekcie dokumentu.
Podejście Syncfusion do OCR:
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;
public class SearchablePdfService
{
private const string TessDataPath = @"tessdata/";
public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
{
// Load document — mutable: PerformOCR modifies it in place
using var document = new PdfLoadedDocument(inputPdfPath);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
// Step 1: OCR modifies the document object
processor.PerformOCR(document);
// Step 2: Save the modified document to a separate output file
using var outputStream = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write);
document.Save(outputStream);
}
public byte[] ConvertToSearchableBytes(string inputPdfPath)
{
using var document = new PdfLoadedDocument(inputPdfPath);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
using var outputStream = new MemoryStream();
document.Save(outputStream);
return outputStream.ToArray();
}
}
Podejście IronOCR:
using IronOcr;
public class SearchablePdfService
{
public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
{
var result = new IronTesseract().Read(inputPdfPath);
result.SaveAsSearchablePdf(outputPdfPath);
}
public byte[] ConvertToSearchableBytes(string inputPdfPath)
{
using var input = new OcrInput();
input.LoadPdf(inputPdfPath);
var result = new IronTesseract().Read(input);
// SaveAsSearchablePdf also accepts a MemoryStream
using var ms = new MemoryStream();
result.SaveAsSearchablePdf(ms);
return ms.ToArray();
}
}
Model dokumentu możliwego do edycji używany przez Syncfusion — gdzie PerformOCR() modyfikuje załadowany dokument na miejscu przed zapisaniem — jest zastąpiony przez niezmienny wzorzec czytania-then-wydruku IronOCR. Obiekt OcrResult przechowuje rozpoznany tekst i może być zapisany jako PDF z możliwością przeszukiwania, eksportowany jako zwykły tekst lub przeszukiwany jako złożone dane, i wszystko to z tego samego wyniku. Przewodnik w formacie PDF z funkcją wyszukiwania oraz przykładowy plik PDF z funkcją wyszukiwania obejmują dodatkowe opcje wyjściowe, w tym ustawienia zgodności z formatem PDF/A.
Potok OCR plików PDF oparty na strumieniach
Usługi produkcyjne, które odbierają dokumenty PDF poprzez przesyłanie HTTP, kolejkę komunikatów lub magazyn obiektów blob, zazwyczaj pracują ze strumieniami, a nie ze ścieżkami do plików. Syncfusion akceptuje strumienie przez PdfLoadedDocument, ale ograniczenie ścieżki tessdata nadal obowiązuje — folder tessdata musi istnieć na serwerze, gdzie strumień jest przetwarzany.
Podejście Syncfusion do OCR:
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;
public class StreamOcrService
{
private const string TessDataPath = @"tessdata/";
public string ExtractFromStream(Stream pdfStream)
{
// Stream input works, but tessdata path constraint remains
using var document = new PdfLoadedDocument(pdfStream);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
var sb = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
sb.AppendLine(page.ExtractText());
return sb.ToString();
}
public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
{
// Nie native async — must wrap in Task.Run
return await Task.Run(() => ExtractFromStream(pdfStream));
}
}
Podejście IronOCR:
using IronOcr;
public class StreamOcrService
{
public string ExtractFromStream(Stream pdfStream)
{
using var input = new OcrInput();
input.LoadPdf(pdfStream); // accepts Stream directly
return new IronTesseract().Read(input).Text;
}
public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
{
using var input = new OcrInput();
input.LoadPdf(pdfStream);
var ocr = new IronTesseract();
var result = await ocr.ReadAsync(input); // native async support
return result.Text;
}
}
Metoda LoadPdf() w OcrInput akceptuje bezpośrednio Stream, nie wymagając zapisu do pliku pośredniego.IronOCR również dostarcza metodę ReadAsync() do natywnej integracji asynchronicznej — nie ma potrzeby stosowania opakowania Task.Run(). W przypadku kontrolerów API sieci Web, Azure Functions Functions i innych wzorców usług asynchronicznych jest to bezpośrednie dopasowanie API. Przewodnik po danych wejściowych strumieniowych dokumentuje wszystkie opcje ładowania strumieni, w tym strumienie obrazów i wielostronicowe strumienie TIFF. Przewodnik po asynchronicznym OCR obejmuje obsługę tokenów anulowania oraz wywołania zwrotne postępu dla długotrwałych partii dokumentów.
Strukturalne wyodrębnianie akapitów i słów WORD
Model ekstrakcji tekstu Syncfusion oferuje dwa poziomy: tekst złączony dla całego dokumentu przez result.Text oraz tekst per strony poprzez iterację page.ExtractText(). Nie ma struktury podstron — brak współrzędnych słów, brak granic akapitów, brak wyników pewności dla poszczególnych tokenów. Aplikacje, które muszą lokalizować określone pola według pozycji lub filtrować tokeny o niskim poziomie pewności, muszą zaimplementować własną logikę parsowania na bazie połączonego ciągu znaków.
Podejście Syncfusion do OCR:
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;
public class StructuredExtractionService
{
private const string TessDataPath = @"tessdata/";
public Dictionary<int, string> ExtractPerPage(string pdfPath)
{
var pageTexts = new Dictionary<int, string>();
using var document = new PdfLoadedDocument(pdfPath);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
// Page-level is the finest granularity available
int pageNum = 1;
foreach (PdfLoadedPage page in document.Pages)
{
pageTexts[pageNum] = page.ExtractText();
pageNum++;
}
return pageTexts;
// Nie word coordinates, no paragraph boundaries, no per-token confidence
}
}
Podejście IronOCR:
using IronOcr;
public class StructuredExtractionService
{
public void ExtractWithStructure(string pdfPath)
{
var result = new IronTesseract().Read(pdfPath);
Console.WriteLine($"Overall confidence: {result.Confidence}%");
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y}):");
Console.WriteLine($" {paragraph.Text}");
}
}
}
public IEnumerable<string> ExtractHighConfidenceWords(string pdfPath, int minConfidence = 80)
{
var result = new IronTesseract().Read(pdfPath);
// Per-word confidence filtering — not possible with Syncfusion's page-level model
return result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence >= minConfidence)
.Select(w => w.Text);
}
}
Strukturalny model wyjściowy przedstawia akapity, wiersze, słowa i znaki wraz ze współrzędnymi ramki ograniczającej oraz indywidualnymi wynikami pewności. Jest to szczególnie przydatne przy wyodrębnianiu pól z faktur, analizowaniu formularzy i klasyfikacji dokumentów — czyli w procesach, w których wiedza o tym, gdzie tekst pojawia się na stronie, jest równie ważna jak to, co ten tekst mówi. Przewodnik po wynikach odczytu oraz dokumentacja API OcrResult dokumentują pełny graf obiektów.
Przetwarzanie dokumentów w partiach z równoległym wykonywaniem
Usługi OCR o dużej wydajności przetwarzają jednocześnie dziesiątki lub setki dokumentów. Syncfusion nie dokumentuje OCRProcessor jako bezpiecznego w wątku, co zmusza do przetwarzania sekwencyjnego lub wymaga od deweloperów wdrożenia własnej puli instancji. Instancje IronOCRsą bezpieczne do tworzenia per wątek, umożliwiając bezpośrednie użycie z Parallel.ForEach lub PLINQ bez dodatkowej synchronizacji.
Podejście Syncfusion do OCR:
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;
public class BatchOcrService
{
private const string TessDataPath = @"tessdata/";
public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
{
var results = new Dictionary<string, string>();
// Sequential processing — OCRProcessor thread safety not guaranteed
foreach (var path in pdfPaths)
{
using var document = new PdfLoadedDocument(path);
using var processor = new OCRProcessor(TessDataPath);
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);
var sb = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
sb.AppendLine(page.ExtractText());
results[path] = sb.ToString();
}
return results;
}
}
Podejście IronOCR:
using IronOcr;
public class BatchOcrService
{
public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
{
var results = new ConcurrentDictionary<string, string>();
// Parallel processing — IronTesseract is safe per-thread
Parallel.ForEach(pdfPaths, pdfPath =>
{
var ocr = new IronTesseract(); // one instance per thread
var text = ocr.Read(pdfPath).Text;
results[pdfPath] = text;
});
return new Dictionary<string, string>(results);
}
}
Tworzenie jednej instancji IronTesseract na wątek to udokumentowany wzorzec dla przetwarzania równoległego. Nie wymaga wspólnego stanu, nie ma konfliktów blokad ani infrastruktury puli instancji. Przykład wielowątkowości przedstawia wyniki testów przepustowości dla typowych rozmiarów partii dokumentów, a przewodnik po optymalizacji prędkości obejmuje opcje konfiguracji silnika dla obciążeń wrażliwych na opóźnienia.
OCR Syncfusion API do IronOCR– dokumentacja API
| OCR Syncfusion | Odpowiednik IronOCR | Uwagi |
|---|---|---|
Syncfusion.PDF.OCR.Net.Core | IronOcr | Zastąp pakiet NuGet |
Syncfusion.OCRProcessor | IronOcr | Pojedyncza przestrzeń nazw |
Syncfusion.Pdf | Usuń | Nie jest już potrzebne |
Syncfusion.Pdf.Parsing | Usuń | Nie jest już potrzebne |
SyncfusionLicenseProvider.RegisterLicense() | IronOcr.License.LicenseKey = | Przypisanie ciągu znaków, brak rejestracji Suite |
new OCRProcessor(tessdataPath) | new IronTesseract() | Brak argumentu ścieżki |
PdfLoadedDocument(filePath) | Przekaż ścieżkę bezpośrednio do ocr.Read(path) | Lub użyj OcrInput z LoadPdf() |
PdfLoadedDocument(stream) | input.LoadPdf(stream) | Obsługa strumieni jest bezpośrednia |
processor.Settings.Language = Languages.English | ocr.Language = OcrLanguage.English | OcrLanguage enum |
Języki.Angielski | Języki.Francuski | ocr.Language = OcrLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French) | Wzorzec addytywny zastępuje flagi bitowe |
processor.PerformOCR(document) | ocr.Read(input) | Zwraca bezpośrednio OcrResult |
page.ExtractText() | result.Text lub result.Pages[i].Text | Nie jest wymagana pętla dla pełnego tekstu |
iteracja document.Pages | tablica result.Pages[] | Zawiera akapity, słowa, znaki |
document.Save(outputStream) po OCR | result.SaveAsSearchablePdf(path) | Dedykowana metoda |
| Logika walidacji Tessdata | Usuń całkowicie | Brak danych do weryfikacji |
| Ręczna stała ścieżki tessdata | Usuń całkowicie | Nie jest wymagane przez IronOCR |
konwersja obraz-do-PDF PdfBitmap | input.LoadImage(imagePath) | Brak konwersji plików PDF w celu OCR obrazów |
| Brak API do przetwarzania wstępnego | input.Deskew(), input.DeNoise(), input.Contrast() | Wbudowany w OcrInput |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Nie znaleziono katalogu Tessdata po zmianie pakietów
Syncfusion OCR: Sprawdzanie poprawności katalogu tessdata zostało napisane jako zabezpieczenie uruchamiane przy starcie lub przy każdym wywołaniu. Po usunięciu Syncfusion i zainstalowaniu IronOCR, ten kod walidacji nadal się kompiluje (używa System.IO, a nie przestrzeni nazw Syncfusion), ale teraz zabezpiecza operację, której już nie ma. Pozostawienie tego w kodzie jest martwym kodem, który może dezorientować przyszłych programistów.
Rozwiązanie: Całkowicie usunąć całą logikę walidacji danych tessdata. Usuń stałą TessDataPath, wszystkie sprawdzenia Directory.Exists(TessDataPath), wszystkie sprawdzenia File.Exists(Path.Combine(TessDataPath, ...)) i wszelkie metody walidacji podczas uruchamiania.IronOCR nie generuje wyjątków związanych z tessdata, ponieważ nie ma żadnych brakujących danych tessdata:
// Delete these entirely — they have no equivalent in IronOCR
// private const string TessDataPath = @"tessdata/";
// private bool ValidateTessdata() { ... }
// The only error handling needed after migration:
try
{
return new IronTesseract().Read(pdfPath).Text;
}
catch (FileNotFoundException)
{
throw new ArgumentException($"PDF file not found: {pdfPath}");
}
Problem 2: Pliki językowe niedostępne w czasie wykonywania
Syncfusion OCR: Pliki językowe .traineddata zostały wdrożone jako artefakty systemu plików, oznaczone jako CopyToOutputDirectory w .csproj, i kopiowane przez system build. Po usunięciu folderu tessdata z projektu, kroki CI związane z językiem oraz wpisy .csproj mogą nadal odnosić się do usuniętych plików, powodując ostrzeżenia build lub awarie pipeline.
Rozwiązanie: Usuń wszystkie wpisy związane z tessdata z plików .csproj i definicji pipeline CI. Zamiast tego zainstaluj pakiety językowe jako pakiety NuGet:
# Languages install as NuGet packages — no manual file management
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
// Language configuration after migration
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-report.pdf");
Przewodnik po wielu językach obejmuje instalację pakietu językowego i wartości enum OcrLanguage dla wszystkich ponad 125 wspieranych języków.
Problem 3: Różnica w kolejności bajtów w plikach PDF z możliwością wyszukiwania
Syncfusion OCR: PDF z możliwością przeszukiwania został wyprodukowany przez wywołanie document.Save(stream) po tym, jak PerformOCR() zmodyfikował dokument. Niektórzy odbiorcy tablicy bajtów mogli zostać zaprogramowani tak, aby oczekiwali konkretnej struktury plików PDF, pól metadanych lub ciągu znaków producenta firmy Syncfusion.
Rozwiązanie: SaveAsSearchablePdf()IronOCR produkuje standardowy PDF z warstwą tekstową. Przetestuj wynik z wykorzystaniem urządzeń końcowych (przeglądarek PDF, indeksów wyszukiwania, systemów archiwizacji), aby sprawdzić kompatybilność. Jeśli wymagany jest wynik identyczny bajt po bajcie, odpowiednim kryterium akceptacji jest test przejściowy porównujący możliwość wyodrębnienia tekstu (a nie surowych bajtów):
// Verify the searchable PDF contains the expected text
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("output-searchable.pdf");
// Validation: confirm text layer is present and readable
var verificationText = new IronTesseract().Read("output-searchable.pdf").Text;
Assert.True(verificationText.Contains("expected content"));
Problem 4: Wzrost rozmiaru obrazu Docker po próbie migracji
Syncfusion OCR: Niektóre zespoły podejmują próbę migracji, pozostawiając pliki tessdata w obrazie Docker jako środek ostrożności podczas testowania. W rezultacie zarówno warstwa tessdata, jak i pakiet IronOCRsą obecne na obrazie, co niepotrzebnie zwiększa jego rozmiar.
Rozwiązanie: Usuń warstwę tessdata COPY z pliku Dockerfile przed budowaniem zmigrowanego obrazu. Pakiet IronOCR jest samowystarczalny. Przewodnik wdrażania Docker zawiera sprawdzone obrazy bazowe i konfiguracje dla systemów Alpine, Debian i Ubuntu:
# Usuń this layer entirely after migration
# COPY tessdata/ /app/tessdata/
#IronOCR requires only the standard .NET runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourService.dll"]
Problem 5: Dwuetapowy wzorzec PerformOCR / ExtractText nie ma bezpośredniego odpowiednika
Syncfusion OCR: Pewien kod wywołujący przekazuje referencję PdfLoadedDocument między metodami — jedna metoda wywołuje PerformOCR(), a inna ExtractText() — polegając na stanowej modyfikacji obiektu dokumentu. Ten wzorzec nie istnieje w IronOCR, ponieważ Read() zwraca niezależny od siebie obiekt wyniku.
Rozwiązanie: Przepisz wszelkie wzorce podzielone na OCR/ekstrakcję na jedną metodę, która akceptuje ścieżkę pliku lub strumień i zwraca OcrResult. Obiekt wynikowy zawiera wszystko — tekst, strony, akapity, poziom pewności oraz możliwość zapisania jako plik PDF z funkcją wyszukiwania:
// Replace split PerformOCR / ExtractText pattern
public OcrResult ProcessDocument(string pdfPath)
{
// One call, immutable result, all data available
return new IronTesseract().Read(pdfPath);
}
// Callers decide what they need from the result
var result = service.ProcessDocument("contract.pdf");
var fullText = result.Text;
var confidence = result.Confidence;
result.SaveAsSearchablePdf("contract-searchable.pdf");
Problem 6: Kod rejestracyjny licencji społecznościowej pozostaje po migracji
Syncfusion OCR: Wywołanie Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense() podczas uruchamiania aplikacji rejestruje licencję pakietu. To wywołanie jest często w Program.cs, Startup.cs lub statycznym inicjalizatorze. Po usunięciu pakietów Syncfusion ta linia powoduje błąd kompilacji.
Rozwiązanie: Usuń wywołanie SyncfusionLicenseProvider.RegisterLicense() i zastąp je inicjalizacją licencji IronOCR. Należy również usunąć wszelkie odniesienia do logiki kwalifikowalności licencji społecznościowych, dokumentacji zgodności lub komentarzy dotyczących progów przychodów i liczby pracowników — żadna z tych koncepcji nie ma zastosowania w przypadku IronOCR:
// Usuń (causes compile error after package removal)
// Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("SYNCFUSION-KEY");
// Add at application startup
IronOcr.License.LicenseKey = "YOUR-IRONOCR-KEY";
Lista kontrolna migracji Syncfusion OCR
Przed migracją
Przed wprowadzeniem zmian należy przeprowadzić audyt kodu źródłowego w celu zidentyfikowania wszystkich miejsc, w których wykorzystywane jest oprogramowanie Syncfusion OCR:
# Find all Syncfusion namespace imports
grep -r "using Syncfusion" --include="*.cs" .
# Find OCRProcessor usage
grep -r "OCRProcessor\|PerformOCR\|PdfLoadedDocument\|ExtractText" --include="*.cs" .
# Find tessdata path references
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
# Find Syncfusion license registration
grep -r "SyncfusionLicenseProvider\|RegisterLicense" --include="*.cs" .
# Find csproj tessdata copy rules
grep -r "tessdata\|traineddata" --include="*.csproj" .
# Find Dockerfile tessdata layers
grep -r "tessdata" Dockerfile* docker-compose*.yml .
Przed napisaniem jakiegokolwiek kodu należy sporządzić spis wyników. Zwróć uwagę, które pliki zawierają wywołania OCR, które zawierają walidację tessdata, a które definicje potoku odwołują się do folderu tessdata.
Migracja kodu
- Usuń
Syncfusion.PDF.OCR.Net.Core,Syncfusion.Pdf.Net.Corei powiązane pakiety z wszystkich plików.csproj. - Uruchom
dotnet add package IronOcrw każdym projekcie, który wykonuje OCR. - Zainstaluj pakiety językowe przez NuGet dla wszystkich używanych języków nieangielskich:
dotnet add package IronOcr.Languages.[Language]. - Usuń stałą
private const string TessDataPathze wszystkich klas usług. - Usuń wszystkie metody walidacji tessdata (
ValidateTessdata()i podobne zabezpieczenia). - Zamień
SyncfusionLicenseProvider.RegisterLicense()naIronOcr.License.LicenseKey = "YOUR-KEY"podczas uruchamiania aplikacji. - Zastąp
using Syncfusion.OCRProcessor; using Syncfusion.PDF; using Syncfusion.Pdf.Parsing;withusing IronOcr;. - Zamień każdą inicjalizację
new OCRProcessor(TessDataPath)nanew IronTesseract(). - Zamień łańcuchy
PdfLoadedDocument + processor.PerformOCR() + page.ExtractText()naocr.Read(path).Text. - Zastąp bitowe flagi językowe Syncfusion (
Languages.English | Języki.Francuskiplusocr.AddSecondaryLanguage()wywołania. - Zamień
document.Save(stream)poPerformOCR()zresult.SaveAsSearchablePdf(path)dla PDF z możliwością przeszukiwania. - Zamień konwersję o-runda tripu image-to-PDF na bezpośrednie
input.LoadImage(imagePath)lubocr.Read(imagePath). - Usuń wpisy tessdata
CopyToOutputDirectoryze wszystkich plików.csproj. - Usuń kroki pobierania tessdata ze wszystkich definicji potoku CI/CD.
- Usuń warstwy tessdata
COPYze wszystkich plików Dockerfile.
Po migracji
- Sprawdź, czy funkcja OCR plików PDF generuje oczekiwaną treść tekstową na tych samych przykładowych dokumentach, które były używane przed migracją.
- Sprawdź, czy OCR obrazów (JPG, PNG, BMP) działa bez konieczności konwersji do formatu PDF.
- Sprawdź, czy dokumenty wielojęzyczne są poprawnie rozpoznawane przy użyciu zainstalowanych pakietów językowych NuGet.
- Sprawdź, czy plik PDF z możliwością wyszukiwania działa, otwierając wygenerowany plik w przeglądarce PDF i upewniając się, że zaznaczanie tekstu i wyszukiwanie działają.
- Uruchom aplikację w nowym kontenerze Docker zbudowanym na podstawie zaktualizowanego pliku Dockerfile, aby upewnić się, że nie występują żadne błędy uruchomieniowe związane z tessdata.
- Potwierdź, że aplikacja uruchamia się bez wywołania
Syncfusion.Licensingani odniesienia do przestrzeni nazw Syncfusion. - Zweryfikuj, że
result.Confidencezwraca wiarygodną wartość (zwykle 80–99% dla czystych dokumentów), aby potwierdzić, że silnik OCR jest aktywny. - Przetestuj równoległe przetwarzanie wsadowe, uruchamiając równoczesne wywołania OCR i sprawdzając, czy nie występują wyjątki związane z wątkami ani uszkodzone wyniki.
- Porównaj dokładność wyodrębniania tekstu na skanach o niskiej jakości lub obróconych przed i po migracji, zwracając uwagę na poprawę wynikającą z automatycznego procesu wstępnego przetwarzania.
Kluczowe korzyści z migracji do IronOCR
Złożoność wdrożenia spada do pojedynczego pakietu NuGet. Po migracji każde środowisko — stanowisko deweloperskie, runner CI, kontener stagingowy, serwer produkcyjny — wymaga dokładnie jednej rzeczy: pakietu NuGet IronOcr przywróconego przez system build. Brak folderu tessdata. Nie ma ścieżki systemu plików do skonfigurowania. Żadnych skryptów pobierających pliki językowe. Żadnych warstw Dockerfile zawierających 100–500 MB danych binarnych. Obrazy kontenerów są mniejsze, potoki CI są prostsze, a nowe środowiska są prawidłowo wdrażane już przy pierwszej kompilacji bez ręcznej interwencji.
Koszty licencji stają się przewidywalne i jednorazowe. Jednorazowy zakup licencji wieczystej zastępuje coroczny cykl odnowienia licencji dla każdego programisty. Pięcioosobowy zespół programistów, który zakupi IronOCR Professional (2999 USD), staje się właścicielem biblioteki IronOCR na czas nieokreślony, z roczną subskrypcją aktualizacji w cenie. Nie ma żadnych progów przychodów do monitorowania, żadnych limitów liczby pracowników do śledzenia, żadnych przepisów dotyczących audytu ani dokumentacji zgodności do prowadzenia. Wydarzenia związane z rozwojem — nowi kontrahenci, duże kontrakty, rundy finansowania — nie powodują przeglądu licencji.
Pipeline OCR obsługuje zdegradowane dokumenty bez zewnętrznych zależności. Deskew, denoise, wzmocnienie kontrastu, binaryzacja i skalowanie rozdzielczości są dostępne jako metody na OcrInput. Nie jest potrzebna oddzielna biblioteka obrazów. Dokumenty z niewielkim obrotem, szumami skanera lub niskim kontrastem, które wcześniej wymagały etapu przetwarzania wstępnego przy użyciu System.Drawing lub SkiaSharp, mogą być teraz obsługiwane w ramach tego samego wywołania IronOCR. Przewodnik po korekcji jakości obrazu oraz strona poświęcona funkcjom przetwarzania wstępnego dokumentują wszystkie dostępne filtry i ich wpływ na dokładność rozpoznawania.
Strukturalne wyjście umożliwia inteligencję dokumentu na poziomie pola. Obiekt OcrResult udostępnia pełną strukturę dokumentu — strony, akapity, linie, słowa i znaki — z współrzędnymi pole box oraz ocenami na token. Aplikacje, które wcześniej analizowały połączone ciągi tekstowe w celu znalezienia granic pól, mogą zamiast tego bezpośrednio wykorzystywać dane dotyczące współrzędnych akapitów i słów. Procesy przetwarzania faktur, wyodrębniania formularzy i klasyfikacji dokumentów zyskują dostęp do informacji przestrzennych, których model na poziomie strony firmy Syncfusion nie jest w stanie zapewnić. Strona poświęcona zastosowaniom OCR w plikach PDF omawia typowe wzorce analizy dokumentów.
Równoległe przetwarzanie wsadowe skaluje się bez infrastruktury. Tworzenie jednej instancji IronTesseract na wątek to kompletna strategia wątkowania — bez puli instancji, bez zarządzania semaforami, bez ograniczeń przetwarzania sekwencyjnego. Usługa wsadowa przetwarzająca 500 dokumentów na godzinę może nasycić dostępne rdzenie CPU przy użyciu Parallel.ForEach i jednej linii synchronizacji. Samodzielna architektura silnika oznacza, że każdy wątek działa niezależnie, bez współdzielonego stanu zmiennego.
Dostępnych jest ponad 125 języków bez konieczności zarządzania plikami binarnymi. Każdy pakiet językowy instaluje się jako pakiet NuGet za pośrednictwem standardowego menedżera pakietów. Zarządzanie wersjami, pobieranie aktualizacji i rozwiązywanie zależności są obsługiwane przez te same narzędzia, które zarządzają wszystkimi innymi zależnościami projektu. Dodanie japońskiego lub arabskiego OCR do usługi wymaga jednego polecenia dotnet add package, a nie ręcznego pobierania z repozytorium GitHub, a następnie aktualizacji procesów wdrażania. Indeks języków zawiera listę wszystkich obsługiwanych skryptów wraz z poleceniami instalacyjnymi.
