namespace UglyToad.PdfPig.DocumentLayoutAnalysis.ReadingOrderDetector { using System.Collections.Generic; using System.Linq; /// /// Algorithm that retrieve the blocks' reading order using rendering order (TextSequence). /// public class RenderingReadingOrderDetector : IReadingOrderDetector { /// /// Create an instance of rendering reading order detector, . /// This detector uses the rendering order (TextSequence). /// public static RenderingReadingOrderDetector Instance { get; } = new RenderingReadingOrderDetector(); /// /// Gets the blocks in reading order and sets the . /// /// The s to order. public IEnumerable Get(IReadOnlyList textBlocks) { int readingOrder = 0; foreach (var block in textBlocks.OrderBy(b => AvgTextSequence(b))) { block.SetReadingOrder(readingOrder++); yield return block; } } private double AvgTextSequence(TextBlock textBlock) { return textBlock.TextLines.SelectMany(tl => tl.Words).SelectMany(w => w.Letters).Select(l => l.TextSequence).Average(); } } }