Extraction de texte dans le désordre à partir de tableaux compacts

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

Le texte extrait de mises en page de tableaux ou de formulaires compactes apparaît mêlé. Les caractères des lignes adjacentes sont intercalés, par exemple, "Numéro unique 123456789" est extrait comme "U123456789nique Number".

Il s'agit d'une limitation connue de l'extraction page.Lines pour les mises en page densément remplies. page.Lines regroupe les caractères en utilisant une tolérance verticale intégrée qui n'est pas configurable. Quand deux lignes visibles dans une cellule de tableau sont seulement un ou deux points l'une de l'autre, le regroupeur fusionne les deux lignes en une seule ligne logique et trie les caractères de gauche à droite, les entrelaçant. La méthode ExtractTextFromPage(i) utilise par défaut l'ordre des flux de contenu, ce qui peut ne pas correspondre à l'ordre visuel de lecture dans les PDF de formulaire.

Solution

Recommandé : Extraire en utilisant des TextChunks avec une tolérance réglable

Chaque TextChunk expose son BoundingBox, ce qui permet de regrouper par position verticale et de trier au sein de chaque ligne par position horizontale :

using IronPdf.Pages;
using System.Text;

static string ExtractTextUsingTextChunks(IPdfPage page, double rowTolerance = 2.0)
{
    var rows = page.TextChunks
        .Where(c => !string.IsNullOrWhiteSpace(c.Contents))
        .GroupBy(c => Math.Round(c.BoundingBox.Top / rowTolerance) * rowTolerance)
        .OrderByDescending(g => g.Key);

    var extractedText = new StringBuilder();
    foreach (var row in rows)
    {
        var line = string.Join(" ",
            row.OrderBy(c => c.BoundingBox.Left)
               .Select(c => c.Contents.Trim())
               .Where(text => !string.IsNullOrWhiteSpace(text)));
        extractedText.AppendLine(line);
    }
    return extractedText.ToString();
}
using IronPdf.Pages;
using System.Text;

static string ExtractTextUsingTextChunks(IPdfPage page, double rowTolerance = 2.0)
{
    var rows = page.TextChunks
        .Where(c => !string.IsNullOrWhiteSpace(c.Contents))
        .GroupBy(c => Math.Round(c.BoundingBox.Top / rowTolerance) * rowTolerance)
        .OrderByDescending(g => g.Key);

    var extractedText = new StringBuilder();
    foreach (var row in rows)
    {
        var line = string.Join(" ",
            row.OrderBy(c => c.BoundingBox.Left)
               .Select(c => c.Contents.Trim())
               .Where(text => !string.IsNullOrWhiteSpace(text)));
        extractedText.AppendLine(line);
    }
    return extractedText.ToString();
}
Imports IronPdf.Pages
Imports System.Text

Private Shared Function ExtractTextUsingTextChunks(page As IPdfPage, Optional rowTolerance As Double = 2.0) As String
    Dim rows = page.TextChunks _
        .Where(Function(c) Not String.IsNullOrWhiteSpace(c.Contents)) _
        .GroupBy(Function(c) Math.Round(c.BoundingBox.Top / rowTolerance) * rowTolerance) _
        .OrderByDescending(Function(g) g.Key)

    Dim extractedText As New StringBuilder()
    For Each row In rows
        Dim line = String.Join(" ", row.OrderBy(Function(c) c.BoundingBox.Left) _
                                   .Select(Function(c) c.Contents.Trim()) _
                                   .Where(Function(text) Not String.IsNullOrWhiteSpace(text)))
        extractedText.AppendLine(line)
    Next
    Return extractedText.ToString()
End Function
$vbLabelText   $csharpLabel

Commencez avec rowTolerance = 2.0. Si les lignes se fusionnent encore, réduisez-le à 1.0 ou 0.5. Pour un contrôle plus précis, remplacez page.Characters par page.TextChunks.

Alternative : extraction selon l'ordre visuel

Pour les PDF où seul l'ordre du flux de contenu est erroné :

pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder)
$vbLabelText   $csharpLabel

Pour les PDF avec des lignes visuellement très proches, l'approche TextChunks gère mieux les tolérances serrées.

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 20,088,359 | Version : 2026.7 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronPdf
exécuter un échantillon Regardez votre code HTML se transformer en PDF.