Missordnung bei der Textextraktion aus dicht gedrängten Tabellen

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

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

Für PDFs mit Zeilen, die visuell sehr nah beieinanderliegen, bewältigt der TextChunks-Ansatz enge Toleranzen besser.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 20,088,359 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronPdf
Führen Sie eine Probe aus Sehen Sie zu, wie Ihr HTML-Code in eine PDF-Datei umgewandelt wird.