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); }
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); }
/// <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); }