Umgang mit großen PDF-Dateien in IronOCR
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
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
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
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)
Debug-Tipps
- Senken Sie den DPI-Wert: Werte im Bereich von
80bis100reduzieren 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
OcrInputinusingAussagen, 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.

