Manejo de Archivos PDF Grandes en IronOCR
Ejecutar OCR en PDFs grandes de varias páginas puede disparar la memoria y bloquear el proceso. El culpable habitual es cargar todas las páginas en memoria a la vez.
System.OutOfMemoryException
OcrInput.LoadPdf("large.pdf") lee todas las páginas de una sola vez. El sistema de imágenes de IronOCR luego renderiza todas las páginas simultáneamente, y debido a que el DPI por defecto es 200, el uso de memoria aumenta rápidamente. En un documento grande eso significa un OutOfMemoryException o un bloqueo de recursos.
Solución
La solución es procesar el PDF una página a la vez y mantener el DPI de renderizado tan bajo como la calidad del texto lo permita.
1. Obtener el Recuento de Páginas
Abre el documento con IronPdf.PdfDocument (o cualquier biblioteca PDF) para leer cuántas páginas tiene.
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. Cargar Una Página a la Vez
Recorre las páginas y carga cada una individualmente con OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi). Donde la calidad visual se mantiene, baja el DPI hasta 80 para conservar memoria.
3. Leer y Concatenar
Pasa cada entrada de una sola página a IronTesseract.Read() y añade el resultado a un 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
El using en cada OcrInput libera los datos de la imagen de la página antes de la siguiente iteración, así que la memoria se mantiene constante a lo largo del bucle en lugar de crecer con el número de páginas.
Opción: Comprimir el PDF Primero
Para archivos muy complejos o cargados de imágenes, el bucle de página por página aún puede tener problemas. Comprimir el PDF con la API Compress de IronPDF antes de OCR para reducir los datos de imagen que IronOCR tiene que manejar. Esto vale la pena especialmente en documentos escaneados o cargados de imágenes.
Comprime directamente a un flujo, luego carga ese flujo en 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
Cuando un PDF lleva imágenes incrustadas, reduce JpegQuality durante la compresión para reducir aún más los datos:
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)
Consejos para depuración
- Reduce el DPI: valores en el rango de
80a100reducen drásticamente el uso de memoria cuando el texto sigue siendo legible. - Evita
LoadPdf()en archivos grandes: lee todo el documento de una vez solo cuando sea realmente pequeño. - Libera pronto: envuelve
OcrInputen declaracionesusingpara que la memoria se libere entre las páginas. - Paralelizar con cuidado: ejecute páginas de forma concurrente solo cuando la máquina tenga memoria y CPU de sobra; se vuelve en contra en PDFs grandes.

