# Manipulando Grandes Arquivos PDF no IronOCR
Executar OCR em PDFs grandes de várias páginas pode aumentar a memória e travar o processo. O culpado habitual é carregar todas as páginas na memória de uma só vez.
```txt
System.OutOfMemoryException
```
`OcrInput.LoadPdf("large.pdf")` lê todas as páginas de uma só vez. O sistema de imagens do IronOCR então renderiza todas as páginas simultaneamente, e como o DPI padrão é `200`, o uso de memória aumenta rapidamente. Em um documento grande, isso significa um `OutOfMemoryException` ou um deadlock de recursos.
## Solução
A solução é processar o PDF uma página por vez e manter o DPI de renderização o mais baixo possível enquanto a qualidade do texto permitir.
### 1. Obter a Contagem de Páginas
Abra o documento com `IronPdf.PdfDocument` (ou qualquer biblioteca PDF) para ler quantas páginas ele tem.
```csharp
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
```
### 2. Carregar Uma Página de Cada Vez
Percorra as páginas e carregue cada uma individualmente com `OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi)`. Onde a qualidade visual se mantém, reduza o DPI para o mínimo de `80` para economizar memória.
### 3. Ler e Concatenar
Passe cada entrada de página única para `IronTesseract.Read()` e anexe o resultado a um `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());
```
O `using` em cada `OcrInput` libera os dados de imagem da página antes da próxima iteração, então a memória permanece constante no loop, em vez de crescer com a contagem de páginas.
### Opção: Comprimir o PDF Primeiro
Para arquivos muito complexos ou com muitas imagens, o loop de página por página ainda pode ter dificuldades. Comprimir o PDF com a API de Compressão do IronPDF antes do OCR para reduzir os dados de imagem que o IronOCR precisa manipular. Isso vale principalmente para documentos digitalizados ou com muitas imagens.
Comprimir diretamente para um fluxo e, em seguida, carregar esse fluxo em `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);
```
Quando um PDF contém imagens incorporadas, abaixe `JpegQuality` durante a compressão para reduzir ainda mais os dados:
```csharp
var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
```
[[w:(Reutilizando o mesmo MemoryStream nas iterações do loop? Redefina sua posição para 0 antes de cada leitura. Um fluxo é consumido uma vez lido, então a próxima leitura falha se a posição não for redefinida.)]]
## Dicas de Depuração
- **Reduza o DPI:** valores na faixa de `80` a `100` reduzem o uso de memória drasticamente quando o texto ainda é legível.
- **Evite `LoadPdf()` em arquivos grandes:** leia o documento inteiro de uma vez somente quando ele for realmente pequeno.
- **Descarte cedo:** envolva `OcrInput` em declarações `using` para que a memória seja liberada entre as páginas.
- **Paralelize com cuidado:** execute páginas simultaneamente apenas quando o computador tiver memória e CPU de sobra; volta atrás em PDFs grandes.
Executar OCR em PDFs grandes de várias páginas pode aumentar a memória e travar o processo. O culpado habitual é carregar todas as páginas na memória de uma só vez.
System.OutOfMemoryException
System.OutOfMemoryException
Text
OcrInput.LoadPdf("large.pdf") lê todas as páginas de uma só vez. O sistema de imagens do IronOCR então renderiza todas as páginas simultaneamente, e como o DPI padrão é 200, o uso de memória aumenta rapidamente. Em um documento grande, isso significa um OutOfMemoryException ou um deadlock de recursos.
Solução
A solução é processar o PDF uma página por vez e manter o DPI de renderização o mais baixo possível enquanto a qualidade do texto permitir.
1. Obter a Contagem de Páginas
Abra o documento com IronPdf.PdfDocument (ou qualquer biblioteca PDF) para ler quantas páginas ele tem.
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);var pageCount = pdf.PageCount;
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
C#
2. Carregar Uma Página de Cada Vez
Percorra as páginas e carregue cada uma individualmente com OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi). Onde a qualidade visual se mantém, reduza o DPI para o mínimo de 80 para economizar memória.
3. Ler e Concatenar
Passe cada entrada de página única para IronTesseract.Read() e anexe o resultado a um 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#
O using em cada OcrInput libera os dados de imagem da página antes da próxima iteração, então a memória permanece constante no loop, em vez de crescer com a contagem de páginas.
Opção: Comprimir o PDF Primeiro
Para arquivos muito complexos ou com muitas imagens, o loop de página por página ainda pode ter dificuldades. Comprimir o PDF com a API de Compressão do IronPDF antes do OCR para reduzir os dados de imagem que o IronOCR precisa manipular. Isso vale principalmente para documentos digitalizados ou com muitas imagens.
Comprimir diretamente para um fluxo e, em seguida, carregar esse fluxo em 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#
Quando um PDF contém imagens incorporadas, abaixe JpegQuality durante a compressão para reduzir ainda mais os dados:
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#
Aviso: Reutilizando o mesmo MemoryStream nas iterações do loop? Redefina sua posição para 0 antes de cada leitura. Um fluxo é consumido uma vez lido, então a próxima leitura falha se a posição não for redefinida.
Dicas de Depuração
Reduza o DPI: valores na faixa de 80 a 100 reduzem o uso de memória drasticamente quando o texto ainda é legível.
Evite LoadPdf() em arquivos grandes: leia o documento inteiro de uma vez somente quando ele for realmente pequeno.
Descarte cedo: envolva OcrInput em declarações using para que a memória seja liberada entre as páginas.
Paralelize com cuidado: execute páginas simultaneamente apenas quando o computador tiver memória e CPU de sobra; volta atrás em PDFs grandes.
Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.