在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 pdf As IronPdf.PdfDocument = IronPdf.PdfDocument.FromFile(pdfPath)
Dim pageCount = pdf.PageCount
End Using2. 一次載入一頁
迴圈遍歷頁面,並使用 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());Dim ocr = New IronTesseract()
Dim pdfPath = "large.pdf"
Using pdf = IronPdf.PdfDocument.FromFile(pdfPath)
Dim pageCount = pdf.PageCount
Dim textBuilder = New StringBuilder()
For i As Integer = 0 To pageCount - 1
Using input = 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的壓縮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);Dim pdf = PdfDocument.FromFile(pdfPath)
Dim stream = pdf.CompressPdfToStream(CompressStructTree:=True)
Dim ocrTesseract = New IronTesseract()
Using ocrInput = 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);Dim pdf = PdfDocument.FromFile("D:\hugePdf.pdf")
Dim stream = pdf.CompressPdfToStream(JpegQuality:=75, CompressStructTree:=True)除錯提示
- 降低 DPI:
80到100範圍內的值大幅降低記憶體使用率,同時文字仍然清晰可讀。 - 避免在大文件上使用
LoadPdf(): 僅在文件確實很小時才一次性讀取整個文件。 - 提前處理: 將
OcrInput包裹在using語句中,這樣在頁面之間記憶體會被釋放。 - 謹慎併行化處理:只有在機器有多餘記憶體和CPU時並行運行頁面; 在大型PDF上會事與願違。

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