在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;
2. 一次載入一頁
迴圈遍歷頁面,並使用 OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi) 單獨載入每一個。 在視覺質量可接受的情況下,將 DPI 降到 80 以節省記憶體。
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());
每個 OcrInput 上的 using 釋放頁面的影像資料,以便在下一次迭代之前,記憶體維持平穩,而不是隨著頁數增長。
選項:先壓縮PDF
對於非常復雜或圖像密集的文件,逐頁迴圈仍可能掙扎。 在OCR之前使用IronPDF的壓縮API壓縮PDF,以減少IronOCR需要處理的影像資料。 這在掃描或圖像密集型文件上最有效。
直接壓縮到流中,然後將該流載入到 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);
當 PDF 包含嵌入的圖像時,在壓縮期間降低 JpegQuality 以進一步縮小資料:
var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
除錯提示
- 降低 DPI:
80到100範圍內的值大幅降低記憶體使用率,同時文字仍然清晰可讀。 - 避免在大文件上使用
LoadPdf(): 僅在文件確實很小時才一次性讀取整個文件。 - 提前處理: 將
OcrInput包裹在using語句中,這樣在頁面之間記憶體會被釋放。 - **謹慎併行化處理:**只有在機器有多餘記憶體和CPU時並行運行頁面; 在大型PDF上會事與願違。

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。