Extraction de texte dans le désordre à partir de tableaux compacts
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();
}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 FunctionCommencez 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)Pour les PDF avec des lignes visuellement très proches, l'approche TextChunks gère mieux les tolérances serrées.

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 et créer des manuels bien structurés et visuellement attrayants.