public TextBlockSet(int index, TextBlockCollection textBlocks) { this.Index = index; this.TextBlocks = textBlocks; if (this.TextBlocks.Count > 0) { this.FirstText = this.TextBlocks[0]; this.LastText = this.TextBlocks[this.TextBlocks.Count - 1]; this.Text = string.Join(" ", this.TextBlocks.Select(text => text.Text)); } else { this.FirstText = new TextBlock(); this.LastText = new TextBlock(); this.Text = string.Empty; } this.LeftX = this.FirstText.LeftX; this.RightX = this.LastText.RightX; this.TopY = this.FirstText.TopY; this.BottomY = this.LastText.BottomY; this.CenterX = (int)Math.Round((this.LeftX + this.RightX) * 0.5d, MidpointRounding.AwayFromZero); this.CenterY = (int)Math.Round((this.TopY + this.BottomY) * 0.5d, MidpointRounding.AwayFromZero); this.Width = this.RightX - this.LeftX; this.Height = this.BottomY - this.TopY; this.Rotate = this.FirstText.Rotate; }
public static TextBlockSetCollection MergeTextGroupByVertical(TextBlockCollection sources, bool isBottomFirst = true, double sizeRatio = SIZE_RATIO, double alignRatio = ALIGN_RATIO, double spacingRatio = SPACING_RATIO) { if (sources == null) { throw new NullReferenceException(); } TextBlockSetCollection groupTexts = new TextBlockSetCollection(); TextBlockCollection texts, textsOrder; Dictionary <int, int> duplicateDic = new Dictionary <int, int>(); foreach (TextBlock source in sources) { if (!duplicateDic.ContainsKey(source.Index)) { texts = new TextBlockCollection(); texts.Add(source); duplicateDic.Add(source.Index, source.Index); FindVerticalTextsRecursive(current: source, sizeRatio: sizeRatio, alignRatio: alignRatio, spacingRatio: spacingRatio, texts: ref texts, sources: ref sources, duplicateDic: ref duplicateDic); textsOrder = isBottomFirst ? new TextBlockCollection(texts.OrderBy(text => text.BottomY)) : new TextBlockCollection(texts.OrderBy(text => text.TopY)); groupTexts.Add(new TextBlockSet(index: groupTexts.Count, textBlocks: textsOrder)); } } return(groupTexts); }
public static TextBlockSetCollection MergeTextLineByVertical(TextBlockCollection sources, bool isBottomFirst = true, double sizeRatio = SIZE_RATIO, double alignRatio = ALIGN_RATIO) { if (sources == null) { throw new NullReferenceException(); } TextBlockSetCollection lineTexts = new TextBlockSetCollection(); TextBlockCollection textsLine, textsLineOrder; TextBlock main, sub; Dictionary <int, int> duplicateDic = new Dictionary <int, int>(); int size, align, index = 0; for (int i = 0; i < sources.Count; i++) { if (!duplicateDic.ContainsKey(i)) { main = sources[i]; size = (int)Math.Round(main.Width * sizeRatio, MidpointRounding.AwayFromZero); align = (int)Math.Round(main.Width * alignRatio, MidpointRounding.AwayFromZero); textsLine = new TextBlockCollection(); textsLine.Add(main); duplicateDic.Add(i, i); for (int j = i + 1; j < sources.Count; j++) { sub = sources[j]; if (!duplicateDic.ContainsKey(j)) { if (IsSameFontSizeByVertical(blockA: main, blockB: sub, size: size) && IsAlignByVertical(blockA: main, blockB: sub, align: align)) { textsLine.Add(sub); duplicateDic.Add(j, j); } } } textsLineOrder = isBottomFirst ? new TextBlockCollection(textsLine.OrderBy(text => text.BottomY)) : new TextBlockCollection(textsLine.OrderBy(text => text.TopY)); lineTexts.Add(new TextBlockSet(index: index++, textBlocks: textsLineOrder)); } } return(lineTexts); }
static void FindVerticalTextsRecursive(TextBlock current, double sizeRatio, double alignRatio, double spacingRatio, ref TextBlockCollection texts, ref TextBlockCollection sources, ref Dictionary <int, int> duplicateDic) { int size = (int)Math.Round(current.Width * sizeRatio, MidpointRounding.AwayFromZero); int align = (int)Math.Round(current.Width * alignRatio, MidpointRounding.AwayFromZero); int spacing = (int)Math.Round(current.Width * spacingRatio, MidpointRounding.AwayFromZero); foreach (TextBlock source in sources) { if (!duplicateDic.ContainsKey(source.Index) && IsSameFontSizeByVertical(blockA: current, blockB: source, size: size) && IsAlignByVertical(blockA: current, blockB: source, align: align) && IsCloseTextByVertical(blockA: current, blockB: source, spacing: spacing)) { texts.Add(source); duplicateDic.Add(source.Index, source.Index); FindVerticalTextsRecursive(current: source, sizeRatio: sizeRatio, alignRatio: alignRatio, spacingRatio: spacingRatio, texts: ref texts, sources: ref sources, duplicateDic: ref duplicateDic); } } }