Sıkışık Tablolardan Sıradışı Metin Çıkartma
Sıkışık tablo veya form düzenlerinden çıkarılan metin karışık olarak görünür. Yan yana sıralardan karakterler iç içe geçer, örneğin, "Benzersiz Numara 123456789" "U123456789nique Number" olarak çıkarılır.
Bu, yoğun yerleştirilmiş düzenler için page.Lines çıkarımının bilinen bir sınırlamasıdır. page.Lines, yerleşik ve yapılandırılamayan dikey tolerans kullanarak karakterleri gruplar. Bir tablo hücresindeki iki görünür satır arasında sadece bir veya iki nokta mesafe olduğunda, gruplandırıcı her iki satırı bir mantıksal satıra çökertir ve karakterleri soldan sağa sıralayarak iç içe geçirir. ExtractTextFromPage(i) yöntemi varsayılan olarak içerik akış sırasına göredir, bu da form PDF'lerinde görsel okuma sırasıyla eşleşmeyebilir.
Çözüm
Tavsiye Edilen: Ayarlanabilir tolerans ile TextChunks kullanarak çıkarma
Her TextChunk, dikey pozisyona göre gruplamaya ve her satırda yatay pozisyona göre sıralamaya izin veren BoundingBox açığa çıkarır:
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
rowTolerance = 2.0 ile başlayın. Satırlar hala birleşiyorsa, onu 1.0 veya 0.5 olarak düşürün. Daha hassas kontrol için, page.TextChunks yerine page.Characters ikame edin.
Alternatif: Görsel sıra ile çıkarma
Sadece içerik akışı sırası yanlış olan PDF'ler için:
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder);
pdf.ExtractTextFromPage(i, TextExtractionOrder.VisualOrder)
Satırların görsel olarak birbirine çok yakın olduğu PDF'ler için, TextChunks yaklaşımı dar toleransları daha iyi yönetir.

