IronOCR ile Büyük PDF Dosyalarını İşleme
Büyük çok sayfalı PDF'lerde OCR çalıştırmak, bellek kullanımını artırabilir ve süreci çökertebilir. Genellikle suçlu olan, her sayfayı aynı anda belleğe yüklemektir.
System.OutOfMemoryException
OcrInput.LoadPdf("large.pdf") tüm sayfaları tek seferde okur. IronOCR'un görüntüleme sistemi daha sonra her sayfayı aynı anda işler ve DPI varsayılan olarak 200 olduğundan, bellek kullanımı hızla artar. Büyük bir belgede bu, OutOfMemoryException veya kaynak tıkanması anlamına gelir.
Çözüm
Çözüm, PDF'yi bir sayfa bir sayfa işleyip, render DPI'sini metin kalitesinin izin verdiği kadar düşük tutmaktır.
1. Sayfa Sayısını Alın
Kaç sayfa olduğunu öğrenmek için belgeyi IronPdf.PdfDocument (veya herhangi bir PDF kütüphanesi) ile açın.
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. Her seferinde bir sayfa yükleyin
Sayfalar boyunca döngü yapın ve her birini ayrı ayrı OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi) ile yükleyin. Görsel kalite korunuyorsa, belleği korumak için DPI'yı 80 kadar düşürün.
3. Oku ve Birleştir
Her tek sayfalık girdiyi IronTesseract.Read()'a iletin ve sonucu StringBuilder'a ekleyin.
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
Her OcrInput üzerindeki using, bir sonraki yinelemeden önce sayfanın görüntü verilerini serbest bırakır, bu yüzden bellek sayfa sayısıyla büyümek yerine döngü boyunca sabit kalır.
Seçenek: Önce PDF'yi Sıkıştırın
Çok karmaşık veya görüntü ağırlıklı dosyalar için, sayfa bazlı döngü hala zorlanabilir. IronPDF'nin Sıkıştırma API'sini kullanarak PDF'yi OCR'dan önce sıkıştırın, böylece IronOCR'nin işlemesi gereken görüntü verisi azalır. Bu, taranmış veya görüntü ağırlıklı belgelerde en çok fayda sağlar.
Doğrudan bir akışa sıkıştırın, ardından o akışı OcrInput'a yükleyin:
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
Bir PDF gömülü görüntüler içerdiğinde, veriyi daha fazla küçültmek için sıkıştırma sırasında JpegQuality'ı düşürün:
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)
Hata Ayıklama İpuçları
- DPI'yı düşürün: metin hala okunabilir olduğunda, bellek kullanımını keskin bir şekilde azaltan
80ile100aralığındaki değerler. - Büyük dosyalarda
LoadPdf()'dan kaçının: belge küçük olduğunda tamamını tek seferde okuyun. - Erken İmha Edin: bellek sayfalar arasında serbest bırakılsın diye
OcrInput'ıusingifadeleri içine sarın. - Dikkatli paralelleştirin: makinada yedek bellek ve CPU olduğunda sayfaları eşzamanlı çalıştırın; bu, büyük PDF'lerde geri teper.

