Extraire le texte PDF

Le format de fichier PDF est populaire car le contenu du fichier ne peut pas être modifié facilement, par rapport aux autres formats de fichier de traitement de texte. Cependant, vous pouvez extraire du texte de documents PDF avec l’API Aspose.PDF for .NET. Dans cet article, explorons quelques-unes des nombreuses possibilités de recherche et d’extraction de texte à partir de fichiers PDF à l’aide de C#. Voici une liste des fonctionnalités dont nous parlerons dans ce blog :

Extraire le texte d’un document PDF entier à l’aide de C#

La lecture du contenu textuel d’un document PDF est une fonctionnalité fréquemment utilisée. Vous pouvez extraire tout le texte de toutes les pages du document en suivant les étapes ci-dessous :

  1. Charger le document PDF
  2. Créer un objet TextAbsorber
  3. Accepter l’absorbeur pour toutes les pages
  4. Écrire le texte extrait dans un fichier et l’enregistrer

L’extrait de code ci-dessous suit ces étapes et montre comment extraire du texte d’un document PDF entier à l’aide de C# :

// Ouvrir le document PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Créer un objet TextAbsorber pour extraire du texte
TextAbsorber textAbsorber = new TextAbsorber();
// Accepter l'absorbeur pour toutes les pages
pdfDocument.Pages.Accept(textAbsorber);
// Obtenir le texte extrait
string extractedText = textAbsorber.Text;
// Créer un écrivain et ouvrir le fichier
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Ecrire une ligne de texte dans le fichier
tw.WriteLine(extractedText);
// Fermer le flux
tw.Close();

Rechercher et extraire du texte d’une page spécifique au format PDF en C#

Après avoir exploré l’extraction de texte au niveau du document, extrayons le texte d’une page spécifique d’un document PDF. Suivez simplement les étapes ci-dessous pour répondre à vos besoins :

  1. Charger le document PDF
  2. Créer un objet TextAbsorber
  3. Accepter l’absorbeur pour une page spécifique
  4. Écrire le texte extrait dans un fichier et l’enregistrer

L’extrait de code suivant suit ces étapes pour lire le texte de n’importe quelle page d’un fichier PDF à l’aide de C# :

// Ouvrir le document PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Accéder à la page requise dans le document PDF
Page page = pdfDocument.Pages[1];
// Créer un objet TextAbsorber pour extraire du texte
TextAbsorber textAbsorber = new TextAbsorber();
// Accepter l'absorbeur pour la page spécifiée
page.Accept(textAbsorber);
// Obtenir le texte extrait
string extractedText = textAbsorber.Text;
// Créer un écrivain et ouvrir le fichier
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Ecrire une ligne de texte dans le fichier
tw.WriteLine(extractedText);
// Fermer le flux
tw.Close();

Rechercher et extraire du texte d’une région spécifique de la page PDF en C#

Poussons cette extraction de texte un peu plus loin. Envisagez de rechercher du texte dans une zone spécifique de la page. Il est important de comprendre ici que l’unité de mesure de base dans Aspose.PDF for .NET est le point, où 72 points équivalent à 1 pouce. De plus, le coin inférieur gauche est considéré comme l’origine (0,0) de la page. Voici les étapes pour lire le texte d’une zone ou d’une section spécifique de la page dans un document PDF :

  1. Charger le document PDF source
  2. Créer un objet TextAbsorber
  3. Définissez TextSearchOptions et spécifiez les coordonnées rectangulaires
  4. Accepter l’absorbeur pour une page spécifique
  5. Écrire le texte extrait dans un fichier

L’extrait de code ci-dessous illustre ces étapes pour extraire du texte d’une région spécifique à l’aide de C# :

// Ouvrir le document
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Créer un objet TextAbsorber pour extraire du texte
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Accepter l'absorbeur pour la première page
pdfDocument.Pages[1].Accept(absorber);
// Obtenir le texte extrait
string extractedText = absorber.Text;
// Créer un écrivain et ouvrir le fichier
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Ecrire une ligne de texte dans le fichier
tw.WriteLine(extractedText);
// Fermer le flux
tw.Close();

Rechercher ou extraire du texte spécifique d’un fichier PDF avec des expressions régulières à l’aide de C#

Vous pouvez extraire un texte spécifique d’un document PDF qui correspond à un modèle. Par exemple, vous voudrez peut-être extraire des mots ou des chiffres spécifiques. Pour cela, vous devez concevoir une expression régulière. L’API utilisera cette expression régulière pour trouver le texte correspondant dans le document PDF. Les étapes ci-dessous sont les directives pour rechercher et extraire du texte spécifique à partir de fichiers PDF :

  • Charger le document PDF d’entrée
  • Créer un objet TextAbsorber
  • Concevoir et définir une expression régulière pour correspondre à du texte
  • Boucle sur chaque fragment de texte extrait

L’extrait de code C# suivant utilise une expression régulière qui recherche le texte contenant 4 chiffres, par exemple, 1999,2000, etc. sur toutes les pages du document.

// document ouvert
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// créer un objet TextAbsorber pour trouver toutes les instances de la phrase de recherche d'entrée
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// accepter l'absorbeur pour toutes les pages
pdfDocument.Pages.Accept(textFragmentAbsorber);
// obtenir les fragments de texte extraits
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// boucle à travers les fragments
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Extraire le texte des cellules du tableau dans un document PDF à l’aide de C#

L’extraction de texte à partir de tableaux sur une page PDF est un peu différente. Nous avons travaillé avec la classe TextAbsorber dans les exemples précédents, mais extraire du texte d’un tableau est un peu différent. Par conséquent, vous devez suivre les étapes ci-dessous pour extraire le texte des objets Table :

  1. Charger le fichier PDF source
  2. Créer un objet de la classe TableAbsorber
  3. Itérer à travers AbsorbedTable
  4. Boucle dans chaque cellule de chaque ligne du tableau

L’extrait de code ci-dessous suit ces étapes et extrait efficacement le texte des cellules du tableau dans le document PDF à l’aide de C# :

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Rechercher et extraire le texte en surbrillance d’un document PDF à l’aide de C#

Le texte en surbrillance est présent en tant qu’annotation dans les fichiers PDF. Ils contiennent du texte marqué qui les différencie du texte conventionnel d’un document. Les étapes ci-dessous décrivent comment lire le texte en surbrillance à l’aide de C# :

  1. Charger le document source
  2. Parcourez toutes les annotations
  3. Filtrer TextMarkupAnnotation
  4. Récupérer des fragments de texte en surbrillance

Ce qui suit est un extrait de code basé sur les étapes ci-dessus, il peut être utilisé pour obtenir du texte en surbrillance à partir de fichiers PDF :

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Parcourez toutes les annotations
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Filter TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Récupérer des fragments de texte en surbrillance
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Afficher le texte en surbrillance
            Console.WriteLine(tf.Text);
        }
    }
}

Extraire du texte PDF avec une faible consommation de mémoire à l’aide de C#

Voici deux approches différentes pour optimiser la consommation de mémoire lors de l’extraction de texte à partir de documents PDF à l’aide du langage C#.

i) Utilisation de la méthode Reset() et FreeMemory()

Parfois, l’extraction de texte peut consommer énormément de mémoire et de processeur. Peut-être lorsque le fichier d’entrée est volumineux et contient beaucoup de texte. Parce que l’objet TextFragmentAbsorber stocke tous les fragments de texte trouvés dans la mémoire.

Par conséquent, la solution que nous recommandons ici est d’appeler la méthode absorbeur.Reset() après avoir traité chaque page. De plus, si vous effectuez uniquement des opérations de lecture, vous pouvez également libérer la mémoire détenue par les objets de page, avec la méthode page.FreeMemory(). Vous devez donc suivre les étapes ci-dessous pour utiliser un minimum de ressources :

  1. Charger le document PDF source
  2. Spécifiez TextEditOptions
  3. Lire TextFragment
  4. Appelez la méthode Reset()
  5. Appelez la méthode FreeMemory()

L’extrait de code suivant illustre l’extraction de texte à partir de documents PDF à l’aide de C# :

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Lire quelque chose à partir de fragments
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Nous avons testé cet extrait de code avec un énorme fichier d’exemple contenant 450 pages, 24 500 fragments de texte et de nombreuses images raster et vectorielles. Le processus a consommé à peine 500 Mo de mémoire. Une autre astuce ici est que vous pouvez facturer le ramasse-miettes .NET pour réduire la consommation de mémoire maximale à environ 250 Mo avec un coût supplémentaire de 10 secondes de temps de traitement.

ii) Utilisation de l’énumération MemorySaving

L’API Aspose.PDF for .NET prend en charge la configuration du mode d’économie de mémoire lors de la lecture de texte à partir d’un fichier PDF. L’énumération TextExtractionOptions.TextFormattingMode sert à optimiser la consommation des ressources. Les étapes suivantes résument les étapes que vous devez suivre pour cette approche :

  1. Charger le fichier PDF source
  2. Créer un objet TextDevice
  3. Définir TextExtractionOptions
  4. Extraire du texte et écrire du texte dans un fichier

L’extrait de code ci-dessous illustre l’approche d’économie de mémoire à l’aide de C# :

// Ouvrir le document
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Chaîne pour contenir le texte extrait
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Créer un périphérique de texte
        TextDevice textDevice = new TextDevice();

        // Définir les options d'extraction de texte - définir le mode d'extraction de texte (Raw ou Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Convertir une page particulière et enregistrer du texte dans le flux
        textDevice.Process(pdfPage, textStream);
        // Convertir une page particulière et enregistrer du texte dans le flux
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Fermer le flux de mémoire
        textStream.Close();
        // Obtenir du texte à partir du flux de mémoire
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Enregistrez le texte extrait dans un fichier texte
File.WriteAllText(dataDir, builder.ToString());

Conclusion

Nous avons exploré quelques-uns des nombreux cas d’utilisation utiles dans cet article, il existe des possibilités infinies d’extraction de texte à partir de documents PDF à l’aide de C# avec Aspose.PDF for .NET. Vous pouvez en savoir plus via documentation API. Pour toute question, veuillez nous contacter sur Forums d’assistance gratuits.

Voir également