IronOCR에서 대형 PDF 파일 처리하기
크고 여러 페이지로 구성된 PDF에서 OCR을 실행하면 메모리가 급증하고 과정이 중단될 수 있습니다. 보통 원인은 모든 페이지를 한 번에 메모리에 로드하는 것입니다.
System.OutOfMemoryException
OcrInput.LoadPdf("large.pdf")은 모든 페이지를 한 번에 읽습니다. IronOCR의 이미징 시스템은 모든 페이지를 동시에 렌더링하며, DPI 기본값이 200이어서 메모리 크기가 빠르게 증가합니다. 큰 문서에서는 OutOfMemoryException이나 리소스 데드락을 의미합니다.
해결책
수정 방법은 PDF를 한 페이지씩 처리하고 텍스트 품질이 허락하는 한 렌더링 DPI를 낮게 유지하는 것입니다.
1. 페이지 수 얻기
페이지 수를 읽기 위해 IronPdf.PdfDocument (또는 모든 PDF 라이브러리)로 문서를 엽니다.
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. 한 번에 한 페이지 로드하기
페이지를 루프 통과하고 각 페이지를 개별적으로 OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi)로 로드합니다. 시각적 품질이 유지되는 곳에서 메모리를 절약하기 위해 필요한 만큼 DPI를 낮추십시오.
3. 읽고 연결하기
각 단일 페이지 입력을 IronTesseract.Read()에 전달하고 그 결과를 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
각 OcrInput에서 using은 다음 반복 전에 페이지의 이미지 데이터를 해제하므로, 메모리는 페이지 수와 함께 증가하지 않고 루프 전반에 걸쳐 평평하게 유지됩니다.
옵션: PDF를 먼저 압축하기
매우 복잡하거나 이미지가 많은 파일의 경우 페이지별 루프가 여전히 어려울 수 있습니다. OCR 전 IronPDF의 Compress API로 PDF를 압축하여 처리해야 하는 이미지 데이터를 줄이십시오. 이는 스캔되거나 이미지가 많은 문서에서 특히 유용합니다.
스트림으로 직접 압축한 후, 그 스트림을 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
PDF에 포함된 이미지가 있을 때 압축 중에 JpegQuality을 낮춰 데이터를 더 줄이십시오:
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)
디버그 팁
- DPI 낮추기: 텍스트가 여전히 읽을 수 있을 때 메모리 사용량을 예리하게 줄입니다.
- 대형 파일에서
LoadPdf()피하기: 진정으로 작을 때만 문서를 한 번에 읽으십시오. - 조기 제거: 메모리를 페이지 간에 해제하도록
OcrInput을using문의에 감싸세요. - 신중한 병렬화: 여유 메모리와 CPU가 있을 때만 페이지를 동시에 실행하십시오; 대형 PDF에서 역효과를 일으킬 수 있습니다.

