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();
}
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
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)
Pour les PDF avec des lignes visuellement très proches, l'approche TextChunks gère mieux les tolérances serrées.

