Gestion des fichiers PDF volumineux dans IronOCR
Exécuter l'OCR sur des PDFs multi-pages volumineux peut provoquer un pic de mémoire et faire planter le processus. Le coupable habituel est le chargement de chaque page en mémoire en même temps.
System.OutOfMemoryException
OcrInput.LoadPdf("large.pdf") lit toutes les pages en une seule fois. Le système d'imagerie d'IronOCR rend ensuite chaque page simultanément, et comme le DPI est par défaut à 200, l'empreinte mémoire augmente rapidement. Sur un gros document, cela signifie un OutOfMemoryException ou un blocage de ressources.
Solution
La solution est de traiter le PDF une page à la fois et de maintenir le DPI de rendu aussi bas que la qualité du texte le permet.
1. Obtenez le nombre de pages
Ouvrez le document avec IronPdf.PdfDocument (ou toute bibliothèque PDF) pour lire combien de pages il contient.
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. Chargez une page à la fois
Parcourez les pages et chargez chaque page individuellement avec OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi). Lorsque la qualité visuelle se maintient, baissez le DPI aussi bas que 80 pour économiser la mémoire.
3. Lisez et concaténez
Passez chaque entrée de page unique à IronTesseract.Read() et ajoutez le résultat à un 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
Le using sur chaque OcrInput libère les données d'image de la page avant l'itération suivante, de sorte que la mémoire reste constante à travers la boucle au lieu de croître avec le nombre de pages.
Option : Compressez d'abord le PDF
Pour les fichiers très complexes ou riches en images, la boucle page par page peut encore avoir des difficultés. Compressez le PDF avec l'API de compression d'IronPDF avant l'OCR pour réduire les données d'image qu'IronOCR doit gérer. Cela est particulièrement efficace sur les documents numérisés ou riches en images.
Compressez directement vers un flux, puis chargez ce flux dans 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
Lorsqu'un PDF contient des images intégrées, réduisez JpegQuality pendant la compression pour réduire encore les données :
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)
Conseils de débogage
- Réduisez le DPI : des valeurs dans la plage de
80à100réduisent fortement l'utilisation de la mémoire lorsque le texte reste lisible. - Évitez
LoadPdf()sur des fichiers volumineux : lisez tout le document en une seule fois uniquement lorsqu'il est vraiment petit. - Débarrassez-vous tôt : enveloppez
OcrInputdans des déclarationsusingafin que la mémoire soit libérée entre les pages. - Parallélisez avec précaution : exécutez les pages en parallèle uniquement lorsque la machine dispose de mémoire et de CPU supplémentaires ; cela se retourne contre vous sur les PDFs volumineux.

