# 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.
```txt
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.
```csharp
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
```
### 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`.
```csharp
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());
```
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`:
```csharp
var pdf = PdfDocument.FromFile(pdfPath);
var stream = pdf.CompressPdfToStream(CompressStructTree: true);
var ocrTesseract = new IronTesseract();
using var ocrInput = new OcrInput();
ocrInput.LoadPdfPage(stream, 1);
```
Cuando un PDF lleva imágenes incrustadas, reduce `JpegQuality` durante la compresión para reducir aún más los datos:
```csharp
var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
```
[[w:(¿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.
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
System.OutOfMemoryException
Text
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;
C#
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());
C#
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);
C#
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);
C#
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 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 estructurados y visualmente atractivos.