Umgang mit großen PDF-Dateien in IronOCR

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

Das Ausführen von OCR auf großen mehrseitigen PDFs kann den Speicherbedarf erhöhen und den Prozess abstürzen lassen. Der übliche Übeltäter ist, alle Seiten gleichzeitig in den Speicher zu laden.

System.OutOfMemoryException

OcrInput.LoadPdf("large.pdf") liest alle Seiten auf einmal ein. Das Bildsystem von IronOCR rendert dann jede Seite gleichzeitig, und da der DPI-Standardwert 200 beträgt, steigt der Speicherbedarf schnell. Bei einem großen Dokument bedeutet das eine OutOfMemoryException oder eine Ressourcen-Blockierung.

Lösung

Die Lösung besteht darin, das PDF Seite für Seite zu verarbeiten und den Rendervorgang auf die niedrigste zu halten, die die Textqualität zulässt.

1. Holen Sie sich die Seitenanzahl

Öffnen Sie das Dokument mit IronPdf.PdfDocument (oder einer beliebigen PDF-Bibliothek), um zu erfahren, wie viele Seiten es hat.

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. Laden Sie eine Seite auf einmal

Schleifen Sie durch die Seiten und laden Sie jede einzeln mit OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi). Wo die visuelle Qualität besteht, senken Sie den DPI-Wert auf so niedrig wie 80, um Speicher zu sparen.

3. Lesen und anhängen

Übergeben Sie jede Eingabe einer Einzelseite an IronTesseract.Read() und fügen Sie das Ergebnis einem StringBuilder hinzu.

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

Das using bei jedem OcrInput gibt die Bilddaten der Seite vor der nächsten Iteration frei, so dass der Speicher im Loop konstant bleibt, anstatt mit der Seitenanzahl zu wachsen.

Option: Komprimieren Sie das PDF zuerst

Bei sehr komplexen oder bildlastigen Dateien kann die Schleife Seite für Seite dennoch Probleme haben. Komprimieren Sie das PDF mit der Komprimierungs-API von IronPDF, bevor Sie OCR durchführen, um die Bilddaten zu reduzieren, die IronOCR verarbeiten muss. Dies zahlt sich vor allem bei gescannten oder bildlastigen Dokumenten aus.

Komprimieren Sie direkt in einen Stream und laden Sie diesen Stream dann in 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

Wenn ein PDF eingebettete Bilder enthält, verringern Sie JpegQuality während der Komprimierung, um die Daten weiter zu verkleinern:

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

WarnungDen gleichen MemoryStream über Schleifeniterationen wiederverwenden? Setzen Sie seine Position vor jedem Lesen auf 0 zurück. Ein Stream wird einmal gelesen, sodass der nächste Lesevorgang fehlschlägt, wenn die Position nicht zurückgesetzt wird.

Debug-Tipps

  • Senken Sie den DPI-Wert: Werte im Bereich von 80 bis 100 reduzieren den Speicherverbrauch erheblich, wenn der Text noch lesbar ist.
  • Vermeiden Sie LoadPdf() bei großen Dateien: Lesen Sie das gesamte Dokument auf einmal nur dann ein, wenn es wirklich klein ist.
  • Entsorgen Sie frühzeitig: Umschließen Sie OcrInput in using Aussagen, damit der Speicher zwischen den Seiten freigegeben wird.
  • Parallelisieren mit Vorsicht: führen Sie Seiten nur parallel aus, wenn der Rechner über ausreichenden Speicher und CPU verfügt; bei großen PDFs schlägt dies fehl.
Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 6,136,090 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronOcr
Führen Sie ein Beispiel aus und beobachten Sie, wie Ihr Bild zu durchsuchbarem Text wird.