Example #1
0
        public void TestMergeOverlappingRectangles()
        {
            TableRectangle one = new TableRectangle(new PdfRectangle(0, 0, 10, 10));            //0f, 0f, 10f, 10f);
            TableRectangle two = new TableRectangle(new PdfRectangle(5, 5, 15, 15));            //5f, 5f, 10f, 10f);

            one.Merge(two);

            Assert.Equal(15f, one.Width, 0);
            Assert.Equal(15f, one.Height, 0);
            Assert.Equal(0f, one.Left, 0);
            Assert.Equal(0f, one.Bottom, 0);             // one.getTop()
            Assert.Equal(15, one.Top, 0);
        }
Example #2
0
        public void TestMergeNoOverlappingRectangles()
        {
            TableRectangle one = new TableRectangle(new PdfRectangle(0, 0, 10, 10));             //0f, 0f, 10f, 10f);
            TableRectangle two = new TableRectangle(new PdfRectangle(10, 0, 20, 10));            //0f, 10f, 10f, 10f);

            one.Merge(two);

            Assert.Equal(20f, one.Width, 0);
            Assert.Equal(10f, one.Height, 0);
            Assert.Equal(0f, one.Left, 0);
            Assert.Equal(10, one.Top, 0);                  //0f, one.getTop(), 0);
            Assert.Equal(0, one.Bottom, 0);                //10f, one.getBottom(), 0);
            Assert.Equal(20f * 10f, one.Area, 0);
        }
Example #3
0
        /// <summary>
        /// Gets columns positions.
        /// </summary>
        /// <param name="lines">Must be an array of lines sorted by their +top+ attribute.</param>
        /// <returns>a list of column boundaries (x axis).</returns>
        public static List <double> ColumnPositions(IReadOnlyList <TableLine> lines)
        {
            List <TableRectangle> regions = new List <TableRectangle>();

            foreach (TextChunk tc in lines[0].TextElements)
            {
                if (tc.IsSameChar(TableLine.WHITE_SPACE_CHARS))
                {
                    continue;
                }
                TableRectangle r = new TableRectangle();
                r.SetRect(tc);
                regions.Add(r);
            }

            foreach (TableLine l in lines.SubList(1, lines.Count))
            {
                List <TextChunk> lineTextElements = new List <TextChunk>();
                foreach (TextChunk tc in l.TextElements)
                {
                    if (!tc.IsSameChar(TableLine.WHITE_SPACE_CHARS))
                    {
                        lineTextElements.Add(tc);
                    }
                }

                foreach (TableRectangle cr in regions)
                {
                    List <TextChunk> overlaps = new List <TextChunk>();
                    foreach (TextChunk te in lineTextElements)
                    {
                        if (cr.HorizontallyOverlaps(te))
                        {
                            overlaps.Add(te);
                        }
                    }

                    foreach (TextChunk te in overlaps)
                    {
                        cr.Merge(te);
                    }

                    foreach (var rem in overlaps)
                    {
                        lineTextElements.Remove(rem);
                    }
                }

                // added by bobld
                // We need more checks here

                /*
                 * foreach (TextChunk te in lineTextElements)
                 * {
                 *  TableRectangle r = new TableRectangle();
                 *  r.setRect(te);
                 *  regions.Add(r);
                 * }
                 */

                if (lineTextElements.Count > 0)
                {
                    // because testExtractColumnsCorrectly3() fails
                    // need to check here if the remaining te in lineTextElements do overlap among themselves
                    // might happen with multiline cell
                    TableRectangle r = new TableRectangle();
                    r.SetRect(lineTextElements[0]);
                    foreach (var rem in lineTextElements.SubList(1, lineTextElements.Count))
                    {
                        if (r.HorizontallyOverlaps(rem))
                        {
                            // they overlap!
                            // so this is multiline cell
                            r.Merge(rem);
                        }
                        else
                        {
                            regions.Add(r); // do not overlap (anymore), so add it
                            r = new TableRectangle();
                            r.SetRect(rem);
                            //regions.Add(r);
                        }
                    }
                    regions.Add(r);
                }
                // end added
            }

            List <double> rv = new List <double>();

            foreach (TableRectangle r in regions)
            {
                rv.Add(r.Right);
            }

            rv.Sort(); //Collections.sort(rv);

            return(rv);
        }