Missordnung bei der Textextraktion aus dicht gedrängten Tabellen
Aus eng gedrängten Tabellen- oder Formularlayouts extrahierter Text erscheint durcheinander. Zeichen aus benachbarten Zeilen sind vermischt, zum Beispiel wird "Unique Number 123456789" als "U123456789nique Number" extrahiert.
Dies ist eine bekannte Einschränkung der page.Lines-Extraktion für dicht gepackte Layouts. page.Lines gruppiert Zeichen mit einer eingebauten vertikalen Toleranz, die nicht konfigurierbar ist. Wenn zwei sichtbare Zeilen in einer Tabellenzelle nur wenige Punkte voneinander entfernt sind, fasst der Gruppierer beide Zeilen zu einer logischen Linie zusammen und sortiert die Zeichen von links nach rechts, wobei sie vermischt werden. Die ExtractTextFromPage(i)-Methode standardmäßig in Inhaltsstrom-Reihenfolge, die möglicherweise nicht der visuellen Lesereihenfolge in Formular-PDFs entspricht.
Lösung
Empfohlen: Verwenden Sie TextChunks mit einer einstellbaren Toleranz zur Extraktion
Jede TextChunk gibt seine BoundingBox preis, was eine Gruppierung nach vertikaler Position und eine Sortierung innerhalb jeder Zeile nach horizontaler Position ermöglicht:
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
Beginnen Sie mit rowTolerance = 2.0. Wenn sich Zeilen weiterhin verbinden, reduzieren Sie es auf 1.0 oder 0.5. Für feinere Kontrolle ersetzen Sie page.Characters durch page.TextChunks.
Alternative: Extraktion in visueller Reihenfolge
Für PDFs, bei denen nur die Reihenfolge des Content-Streams falsch ist:
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder)
Für PDFs mit Zeilen, die visuell sehr nah beieinanderliegen, bewältigt der TextChunks-Ansatz enge Toleranzen besser.

