Obsluga duzych plikow PDF w IronOCR

This article was translated from English: Does it need improvement?
Translated
View the article in English

Uruchamianie OCR na duzych, wielostronicowych plikach PDF moze powodowac skoki pamieci i zatrzymanie procesu. Zwykle sprawca jest ladowanie kazdej strony do pamieci naraz.

System.OutOfMemoryException

OcrInput.LoadPdf("large.pdf") czyta wszystkie strony za jednym razem. System obrazowania IronOCR nastepnie jednoczesnie renderuje kazda strone, a poniewaz DPI domyslnie ustawia sie na 200, uzycie pamieci rosnie szybko. W duzym dokumencie oznacza to OutOfMemoryException lub zablokowanie zasobow.

Rozwiązanie

Rozwiazanie to przetwarzanie pliku PDF strona po stronie i utrzymywanie DPI na renderowaniu na poziomie jak najnizszym z zachowaniem jakosci tekstu.

1. Uzyskaj liczbe stron

Otworz dokument z IronPdf.PdfDocument (lub inna biblioteka PDF), aby sprawdzic, ile ma stron.

using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
Imports IronPdf

Using pdf = IronPdf.PdfDocument.FromFile(pdfPath)
    Dim pageCount = pdf.PageCount
End Using
$vbLabelText   $csharpLabel

2. Zaladuj jedna strone na raz

Petla przez strony i laduj kazda oddzielnie z OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi). Gdzie jakosc wizualna utrzymuje sie, obnizaj DPI do 80, aby zachowac pamiec.

3. Czytaj i łacz

Przekaż każdą stronę wejściową do IronTesseract.Read() i dołącz wynik do StringBuilder.

var ocr = new IronTesseract();
var pdfPath = "large.pdf";
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
var textBuilder = new StringBuilder();
for (int i = 0; i < pageCount; i++)
{
    using var input = new OcrInput();
    input.LoadPdfPage(pdfPath, i, 80);
    var result = ocr.Read(input);
    textBuilder.Append(result.Text);
    textBuilder.Append(' '); // Add space between pages
}
Console.WriteLine(textBuilder.ToString().Trim());
var ocr = new IronTesseract();
var pdfPath = "large.pdf";
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
var textBuilder = new StringBuilder();
for (int i = 0; i < pageCount; i++)
{
    using var input = new OcrInput();
    input.LoadPdfPage(pdfPath, i, 80);
    var result = ocr.Read(input);
    textBuilder.Append(result.Text);
    textBuilder.Append(' '); // Add space between pages
}
Console.WriteLine(textBuilder.ToString().Trim());
Imports IronOcr
Imports IronPdf
Imports System.Text

Dim ocr As New IronTesseract()
Dim pdfPath As String = "large.pdf"
Using pdf = PdfDocument.FromFile(pdfPath)
    Dim pageCount As Integer = pdf.PageCount
    Dim textBuilder As New StringBuilder()
    For i As Integer = 0 To pageCount - 1
        Using input As New OcrInput()
            input.LoadPdfPage(pdfPath, i, 80)
            Dim result = ocr.Read(input)
            textBuilder.Append(result.Text)
            textBuilder.Append(" ") ' Add space between pages
        End Using
    Next
    Console.WriteLine(textBuilder.ToString().Trim())
End Using
$vbLabelText   $csharpLabel

using na każdym OcrInput zwalnia dane obrazu strony przed następną iteracją, dzięki czemu pamięć pozostaje płaska w całej pętli zamiast rosnąć wraz z liczbą stron.

Opcja: Najpierw skompresuj PDF

Dla bardzo złożonych lub ciężkich plików przetwarzanie stron może wciąż sprawiać trudności. Skompresuj PDF za pomocą API Kompresji w IronPDF przed OCR, aby zmniejszyć ilość danych obrazu, które IronOCR musi obsłużyć. Najwięcej korzyści przynosi to w przypadku zeskanowanych lub ciężkich dokumentów.

Kompresuj bezpośrednio do strumienia, a następnie załaduj ten strumień do OcrInput:

var pdf = PdfDocument.FromFile(pdfPath);
var stream = pdf.CompressPdfToStream(CompressStructTree: true);
var ocrTesseract = new IronTesseract();
using var ocrInput = new OcrInput();
ocrInput.LoadPdfPage(stream, 1);
var pdf = PdfDocument.FromFile(pdfPath);
var stream = pdf.CompressPdfToStream(CompressStructTree: true);
var ocrTesseract = new IronTesseract();
using var ocrInput = new OcrInput();
ocrInput.LoadPdfPage(stream, 1);
Imports IronTesseract

Dim pdf = PdfDocument.FromFile(pdfPath)
Dim stream = pdf.CompressPdfToStream(CompressStructTree:=True)
Dim ocrTesseract = New IronTesseract()
Using ocrInput As New OcrInput()
    ocrInput.LoadPdfPage(stream, 1)
End Using
$vbLabelText   $csharpLabel

Gdy PDF zawiera osadzone obrazy, obniż JpegQuality podczas kompresji, aby jeszcze bardziej zmniejszyć dane:

var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
Imports System

Dim pdf = PdfDocument.FromFile("D:\hugePdf.pdf")
Dim stream = pdf.CompressPdfToStream(JpegQuality:=75, CompressStructTree:=True)
$vbLabelText   $csharpLabel

OstrzeżenieCzy można ponownie używać tego samego MemoryStream w obrębie iteracji pętli? Zresetuj jego pozycję do 0 przed każdym odczytem. Strumień zostaje skonsumowany po odczycie, więc kolejny odczyt nie powiedzie się, jeśli pozycja nie zostanie zresetowana.

Wskazówki dotyczące debugowania

  • Obniź DPI: wartości w 80 do 100 znacznie obniżają zużycie pamięci, gdy tekst jest nadal czytelny.
  • Unikaj LoadPdf() w dużych plikach: czytaj cały dokument na raz tylko wtedy, gdy naprawdę jest mały.
  • Zwolnienie wczesne: owiń OcrInput w instrukcje using, aby pamięć była zwalniana między stronami.
  • Równoleglizuj ostrożnie: uruchamiaj strony jednocześnie tylko wtedy, gdy maszyna ma wolną pamięć i CPU; może się nie udać dla dużych PDF.
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 6,136,090 | Wersja: 2026.7 właśnie wydany
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronOcr
uruchom próbkę obserwuj, jak twój obraz staje się tekstem z możliwością wyszukiwania.