Gestion des fichiers PDF volumineux dans IronOCR

This article was translated from English: Does it need improvement?
Translated
View the article in English

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

AvertissementRéutilisez le même MemoryStream à travers les itérations de boucle ? Réinitialisez sa position à 0 avant chaque lecture. Un flux est consommé une fois lu, donc la lecture suivante échoue si la position n'est pas réinitialisée.

Conseils de débogage

  • Réduisez le DPI : des valeurs dans la plage de 80 à 100 ré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 OcrInput dans des déclarations using afin 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.
Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 6,136,090 | Version : 2026.7 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronOcr
lancez un échantillon regardez votre image se transformer en texte consultable.