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;
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
                }
            }
        }