Jak OCR-ować PDF w C#: Wyodrębnij tekst ze zeskanowanych dokumentów za pomocą .NET
Zeskanowane dokumenty PDF stanowią stałe wyzwanie dla programistów .NET: tekst występuje wyłącznie w postaci obrazów, co uniemożliwia wyszukiwanie, kopiowanie lub przetwarzanie programowe. Optyczne rozpoznawanie znaków (OCR) rozwiązuje ten problem, przekształcając zeskanowane obrazy w dane, które można edytować i przeszukiwać — zamieniając dokumenty papierowe, zdjęcia zrobione aparatem lub dowolne pliki PDF oparte na obrazach w tekst, który można odczytać maszynowo. Niezależnie od tego, czy celem jest digitalizacja archiwów papierowych, automatyzacja pozyskiwania danych, czy tworzenie procesów przetwarzania dokumentów, możliwość wykonywania OCR na plikach PDF w języku C# jest kluczową funkcją.
IronOCR to biblioteka OCR dla platformy .NET oparta na silniku Tesseract 5 z dodatkowymi ulepszeniami zwiększającymi dokładność. Pozwala programistom na wyodrębnianie tekstu z dowolnego dokumentu PDF — zeskanowanego lub innego — za pomocą zaledwie kilku wierszy kodu. W tym artykułe omówiono podstawowe procesy: podstawowe OCR plików PDF, przetwarzanie wybranych stron, wyodrębnianie danych z określonych obszarów oraz wstępne przetwarzanie obrazów w przypadku trudnych skanów.
Jak przeprowadzić OCR na pliku PDF w języku C#?
Najszybsza droga do wyodrębniania tekstu z plików PDF w środowisku .NET zaczyna się od zainstalowania IronOCR za pośrednictwem NuGet. Otwórz terminal w katalogu projektu i uruchom:
dotnet add package IronOcr
dotnet add package IronOcr
Po zainstalowaniu pakietu poniższy program z instrukcją najwyższego poziomu odczytuje zeskanowany plik PDF i drukuje wyodrębniony tekst:
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr
' Initialize the OCR engine
Dim ocr As New IronTesseract()
' Load the PDF and perform OCR
Using input As New OcrInput()
input.LoadPdf("scanned-report.pdf")
' Run recognition
Dim result As OcrResult = ocr.Read(input)
' Access the extracted text
Dim text As String = result.Text
Console.WriteLine(text)
End Using
Klasa IronTesseract wykorzystuje Tesseract 5 z optymalizacjami natywnymi dla platformy .NET, zarówno dla środowisk .NET Core, jak i .NET Framework. Obiekt OcrInput zarządza ładowaniem plików PDF i wewnętrznym renderowaniem stron. Po wywołaniu Read proces OCR analizuje każdą stronę i zwraca OcrResult zawierający pełny wyodrębniony tekst oraz ustrukturyzowane dane dotyczące akapitów, wierszy, słów i ich współrzędnych pikselowych.
Wynik może zostać zapisany w pliku tekstowym, przekazany do dalszego przetwarzania, zapisany w bazie danych lub wprowadzony do procesu indeksowania dokumentów. Więcej informacji na temat silnika można znaleźć w dokumentacji Tesseract OCR oraz w Dokumentacji API IronOCR.
Dane wejściowe

Wynik

Jak odczytać konkretne strony z pliku PDF?
Przetwarzanie każdej strony długiego dokumentu powoduje stratę czasu i pamięci, gdy tylko niektóre strony zawierają istotne treści. IronOCR pozwala kierować działania na konkretne strony poprzez przekazanie indeksów stron zaczynających się od zera do LoadPdf:
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System.Collections.Generic
Dim ocr As New IronTesseract()
' Specify pages to process (zero-based: 0 = first page)
Dim targetPages As New List(Of Integer) From {0, 2, 4}
Using input As New OcrInput()
input.LoadPdf("lengthy-document.pdf", pageIndices:=targetPages)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Selektywne ładowanie stron skraca czas przetwarzania i zmniejsza zużycie pamięci, co ma znaczenie podczas pracy z archiwami liczącymi setki stron, w których tylko kilka zawiera potrzebne dane. Konwencja indeksowania od zera odpowiada standardowym kolekcjom .NET Standard: indeks strony 0 to pierwsza strona dokumentu.
W przypadku dokumentów, w których odpowiednie strony nie są znane z góry, warto najpierw przeprowadzić szybki skan całego dokumentu przy zmniejszonej rozdzielczości (DPI), aby zidentyfikować numery stron, a następnie ponownie uruchomić skanowanie z pełnymi ustawieniami tylko na tych stronach.
Dowiedz się więcej o kontroli na poziomie strony w dokumentacji dotyczącej wyboru stron w IronOCR.
Jak wyodrębnić dane z określonego obszaru strony?
Przetwarzanie faktur, digitalizacja formularzy i analizowanie dokumentów strukturalnych często wymagają wyodrębnienia tekstu z określonego obszaru, a nie skanowania całej strony. IronOCR obsługuje OCR ukierunkowane na regiony za pomocą parametru ContentAreas, który akceptuje tablicę obiektów Rectangle określających, które części każdej strony mają być analizowane:
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing
Dim ocr As New IronTesseract()
' Define the scan region: X, Y, Width, Height (all in pixels from top-left)
Dim invoiceFields As Rectangle() = {
New Rectangle(130, 290, 250, 50) ' Invoice number field
}
Using input As New OcrInput()
input.LoadPdf("invoice.pdf", contentAreas:=invoiceFields)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Konstruktor Rectangle przyjmuje cztery parametry całkowitoliczbowe: współrzędną X, współrzędną Y, szerokość i wysokość — wszystkie mierzone w pikselach od lewego górnego rogu renderowanej strony. Skupienie się na niewielkim obszarze zamiast na całej stronie skraca czas OCR i zmniejsza ryzyko, że silnik wychwyci zakłócenia z otoczenia lub niepowiązane pola tekstowe.
W przypadku procesów przetwarzania faktur w partiach należy połączyć wyodrębnianie regionów z iteracją nad result.Pages, aby pobrać dane strukturalne z tej samej pozycji pola w setkach dokumentów. Każdy wynik strony wyświetla rozpoznany tekst dla swojego obszaru treści niezależnie.
Przykład obszarów treści IronOCR zawiera dodatkowe opcje konfiguracyjne dla scenariuszy wieloregionalnych.
Dane wejściowe

Wynik

Jak poprawić dokładność OCR w przypadku zeskanowanych dokumentów?
W rzeczywistości zeskanowane dokumenty często mają problemy z jakością: przekrzywione strony, niską rozdzielczość lub szumy cyfrowe spowodowane przez sprzęt lub oprogramowanie skanujące. IronOCR zawiera zestaw filtrów przetwarzania wstępnego obrazów, które korygują te problemy przed uruchomieniem silnika rozpoznawania:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr = New IronTesseract()
Using input = New OcrInput()
' Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi:=300)
' Apply image correction filters
input.Deskew() ' Automatically straighten rotated pages
input.DeNoise() ' Remove scanning artifacts and speckles
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Parametr dpi kontroluje rozdzielczość, w jakiej strony PDF są renderowane przed uruchomieniem rozpoznawania. Wyższe wartości — od 200 do 300 DPI — poprawiają dokładność w przypadku dokumentów zawierających mały lub gęsty tekst, kosztem nieco większego zużycia pamięci podczas przetwarzania. Metoda Deskew automatycznie wykrywa i koryguje obrót strony. DeNoise usuwa plamki i artefakty, które mogą utrudniać rozpoznawanie znaków.
W przypadku dokumentów wymagających bardziej agresywnej korekcji obrazu, IronOCR zapewnia również poprawę kontrastu, binarizację (konwersję stron na czarno-białe) oraz regulację skali. Połączenie wielu filtrów w sekwencji pozwala odzyskać użyteczny tekst ze skanów, które w przeciwnym razie dałyby zniekształcony wynik. Zapoznaj się z dokumentacją filtrów obrazu IronOCR, aby uzyskać pełną listę dostępnych operacji przetwarzania wstępnego.
Jak radzicie sobie z dokumentami chronionymi hasłem i dokumentami w wielu formatach?
IronOCR nie ogranicza się do standardowych plików PDF. Biblioteka obsługuje szereg scenariuszy wejściowych, które często pojawiają się w procesach przetwarzania dokumentów.
Pliki PDF chronione hasłem są obsługiwane poprzez przekazanie danych uwierzytelniających podczas tworzenia danych wejściowych:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("protected.pdf", password:="secret123")
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Formaty obrazów — PNG, JPEG, TIFF, BMP, GIF i wielostronicowy TIFF — są ładowane za pomocą odpowiednich metod LoadImage lub LoadImageFrames. Niezależnie od formatu danych wejściowych obowiązują te same filtry przetwarzania wstępnego i opcje kierowania regionalnego.
Dokumenty wielojęzyczne są obsługiwane przez system pakietów językowych IronOCR. Biblioteka jest domyślnie dostarczana w języku angielskim i obsługuje ponad 125 dodatkowych pakietów językowych obejmujących alfabet łaciński, cyrylicę, CJK, arabski i inne skrypty. Załaduj dodatkowe języki przed wywołaniem Read:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.German
W przypadku dokumentów zawierających wiele języków na tej samej stronie dostępny jest tryb MultiLanguage. Jest to szczególnie cenne w przypadku przetwarzania faktur w środowiskach międzynarodowych, gdzie nagłówki, pozycje i adresy mogą występować w różnych językach.
Wdrożenie działa w systemach Windows, Linux, macOS oraz w środowiskach chmurowych, w tym w kontenerach Azure i Docker.
Jak tworzyć pliki PDF z możliwością wyszukiwania na podstawie zeskanowanych dokumentów?
Oprócz wyodrębniania tekstu do ciągów znaków, IronOCR może generować pliki PDF z możliwością wyszukiwania — pliki PDF, w których oryginalny zeskanowany obraz jest zachowany jako warstwa wizualna, a niewidoczna warstwa tekstowa jest osadzona w celu umożliwienia operacji wyszukiwania i kopiowania. Jest to standardowy format generowany przez profesjonalne skanery dokumentów.
Funkcja IronOCR umożliwiająca przeszukiwanie plików PDF akceptuje OcrResult i zapisuje nowy plik PDF:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("scanned-archive.pdf")
Dim result As OcrResult = ocr.Read(input)
' Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
Plik wyjściowy można otworzyć w dowolnym programie do przeglądania plików PDF. Operacje zaznaczania, wyszukiwania i kopiowania tekstu działają na osadzonej warstwie tekstowej, przy czym zachowany jest oryginalny wygląd skanu. Ten format jest powszechnie wymagańy w archiwach zgodności, repozytoriach dokumentów prawnych oraz systemach zarządzania treścią w Enterprise.
W przypadku dodatkowych formatów wyjściowych obiekt OcrResult udostępnia również wyniki pewności dla poszczególnych stron, ramki ograniczające na poziomie słów oraz ustrukturyzowane dane akapitów — wszystko to przydatne w dalszych zadaniach klasyfikacji lub indeksowania.
Jak odczytywać kody BarCode i kody QR obok tekstu?
Procesy przetwarzania dokumentów często wymagają wyodrębnienia zarówno tekstu czytelnego dla człowieka, jak i kodów czytelnych dla maszyn z tego samego dokumentu. IronOCR może wykrywać i dekodować kody kreskowe oraz kody QR podczas tego samego przebiegu OCR, bez konieczności korzystania z oddzielnej biblioteki.
Włącz odczyt BARCODE na instancji IronTesseract przed przetwarzaniem:
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True
Using input As New OcrInput()
input.LoadPdf("shipment-labels.pdf")
Dim result As OcrResult = ocr.Read(input)
' Access recognized text
Console.WriteLine(result.Text)
' Access barcode data
For Each barcode In result.Barcodes
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}")
Next
End Using
Jest to szczególnie przydatne w przypadku przetwarzania etykiet wysyłkowych, zarządzania zapasami oraz wszelkich procesów, w których BARCODES i drukowany tekst pojawiają się razem na skanowanych dokumentach. Przewodnik po odczytywaniu kodów kreskowych IronOCR obejmuje obsługiwane formaty, w tym Code 128, kody QR, Data Matrix i PDF417.
Jaka jest różnica między typami danych wejściowych IronOCR?
IronOCR oferuje dwa główne sposoby ładowania plików PDF, z których każdy jest dostosowany do różnych scenariuszy:
| Podejście | Klasa | Najlepsze dla | Uwagi |
|---|---|---|---|
| Ogólne uwagi | OcrInput.LoadPdf() |
Najczęstsze zastosowania | Obsługuje wszystkie filtry przetwarzania wstępnego, wybór stron, obszary treści |
| Specyficzne dla plików PDF | OcrPdfInput |
Proste scenariusze | Wygodna nakładka; mniej opcji konfiguracyjnych |
| Pliki graficzne | OcrInput.LoadImage() |
PNG, JPEG, TIFF, BMP | Takie samo przetwarzanie wstępne i kierowanie do regionów jak w przypadku plików PDF |
| Wielostronicowy plik TIFF | OcrInput.LoadImageFrames() |
Archiwa faksów, dane ze skanera | Przetwarza każdą klatkę jako oddzielną stronę |
W większości scenariuszy produkcyjnych zalecanym podejściem jest OcrInput.LoadPdf(), ponieważ udostępnia ono pełny interfejs API przetwarzania wstępnego i konfiguracji. OcrPdfInput sprawdza się dobrze w przypadku szybkiego prototypowania lub sytuacji, w których wystarczają ustawienia domyślne.
Jakie są Twoje kolejne kroki?
Powyższe przykłady kodu obejmują podstawowe procesy IronOCR dotyczące OCR plików PDF w języku C#. Oto krótka lista kontrolna, która pomoże Ci przejść do kolejnego etapu:
- Zainstaluj pakiet:
dotnet add package IronOcrlub wyszukaj IronOcr w NuGet - Uruchom podstawowy przykład: Sprawdź, czy udało się wyodrębnić tekst z przykładowego pliku PDF, zanim zbudujesz pełną logikę potoku
- Zastosuj przetwarzanie wstępne: w przypadku pracy ze skanowanymi dokumentami dodaj wywołania
DeskewiDeNoiseoraz przetestuj je na reprezentatywnych próbkach - Poznaj dodatkowe funkcje: pliki PDF z możliwością wyszukiwania, odczyt BarCode, obsługa wielu języków oraz eksport danych strukturalnych
- Zapoznaj się z wytycznymi dotyczącymi wdrażania: artykuły dotyczące wdrażania w środowiskach Azure, Docker i Linux obejmują konfigurację specyficzną dla danego środowiska
- Wypróbuj bezpłatną wersję próbną: Rozpocznij bezpłatny okres próbny, aby przetestować pełny zestaw funkcji przed zakupem licencji
- Uzyskaj licencję: opcje licencyjne IronOCR obejmują zarówno indywidualnych programistów, jak i wdrożenia korporacyjne, z możliwością redystrybucji bez opłat licencyjnych
W przypadku pytań dotyczących konkretnych przypadków użycia biblioteka IronOCR zawiera artykuły opisujące krok po kroku dziesiątki scenariuszy. Pełna dokumentacja interfejsu API znajduje się w dokumentacji API IronOCR.
Często Zadawane Pytania
Jaki jest minimalny kod potrzebny do rozpoznania optycznego (OCR) pliku PDF w języku C#?
Uzywajac IronOCR, minimalny kod to: utworzyc instancje IronTesseract, utworzyc OcrInput, wywolac input.LoadPdf z sciezka do pliku, a nastepnie wywolac ocr.Read(input). Wlasciwosc result.Text zwraca wyodrebniony tekst.
Jak zainstalowac IronOCR w projekcie .NET?
Uruchom 'dotnet add package IronOcr' w terminalu lub wyszukaj IronOcr w Menedzerze Pakietow NuGet w Visual Studio.
Czy IronOCR moze przetwarzac tylko okreslone strony PDF?
Tak. Przekaz List
Jak wyodrebnic tekst z okrelonego obszaru zeskanowanego PDF?
Przekaz tablice obiektow Rectangle do parametru contentAreas LoadPdf. Kazdy prostokat okresla pozycje X, pozycje Y, szerokosc i wysokosc w pikselach od lewego gornego rogu strony.
Jakie filtry wstepnego przetwarzania zapewnia IronOCR dla zeskanowanych dokumentow?
IronOCR zapewnia Deskew (koryguje obrot strony), DeNoise (usuwa artefakty skanowania), wzmocnienie kontrastu, binaryzacje i dostosowanie skali. Moga byc one lancuchowane w celu poprawy dokladnosci na kiepskiej jakosci skanach.
Czy IronOCR obsluguje pliki PDF chronione haslem?
Tak. Przekaz ciag hasla do parametru password LoadPdf. Biblioteka odszyfrowuje dokument przed renderowaniem stron do OCR.
Czy IronOCR moze tworzyc wyszukiwalne wyjscie PDF?
Tak. Po wywolaniu ocr.Read(input), wywolaj result.SaveAsSearchablePdf z sciezka do pliku wyjsciowego. Powstal PDF zachowuje oryginalny skan jako warstwe wizualna z osadzona niewidoczna warstwa tekstowa do operacji wyszukiwania i kopiowania.
Jakie języki obsługuje IronOCR?
IronOCR obsluguje ponad 125 pakietow jezykowych obejmujacych lacinki, cyrylice, CJK, arabski i inne alfabety. Ustaw wlasciwosc Language na instancji IronTesseract przed wywolaniem Read.
Czy IronOCR potrafi odczytywac kody kreskowe i kody QR z dokumentow PDF?
Tak. Ustaw ocr.Configuration.ReadBarCodes na true przed wywolaniem Read. Kolekcja OcrResult.Barcodes zawiera zdekodowane wartosci i typy formatow dla wszystkich wykrytych kodow.
Czy IronOCR dziala na Linux i w kontenerach Docker?
Tak. IronOCR obsluguje wdrozenia na Windows, Linux, macOS i w srodowiskach chmurowych, w tym Azure i kontenerach Docker. Dokumentacja IronSoftware zawiera przewodniki dotyczace konfiguracji specyficznych dla srodowiska.



