Manejo de Archivos PDF Grandes en IronOCR

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

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

Advertencia¿Reutilizando el mismo MemoryStream en iteraciones de bucle? Restablezca su posición a 0 antes de cada lectura. Un flujo se consume una vez leído, así que la próxima lectura fallará si la posición no se restablece.

Consejos para depuración

  • Reduce el DPI: valores en el rango de 80 a 100 reducen 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 OcrInput en declaraciones using para 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.
Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 6,136,090 | Versión: 2026.7 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.