Rectangle implements Cloneable, Serializable { public static Rectangle calculateBBox(List<Point> points) { List<Double> xs = new ArrayList<>(); List<Double> ys = new ArrayList<>(); for (Point point : points) { xs.add(point.getX()); ys.add(point.getY()); } double left = Collections.min(xs); double bottom = Collections.min(ys); double right = Collections.max(xs); double top = Collections.max(ys); return new Rectangle((float) left, (float) bottom, (float) (right - left), (float) (top - bottom)); } Rectangle(float x, float y, float width, float height);  Rectangle(float width, float height);  Rectangle(Rectangle rect); static Rectangle getCommonRectangle(Rectangle... rectangles); static Rectangle getRectangleOnRotatedPage(Rectangle rect, PdfPage page); static Rectangle calculateBBox(List<Point> points); Point[] toPointsArray(); Rectangle getIntersection(Rectangle rect); boolean contains(Rectangle rect); boolean overlaps(final Rectangle rect); boolean overlaps(final Rectangle rect, final float epsilon); Rectangle setBbox(float llx, float lly, float urx, float ury); float getX(); Rectangle setX(float x); float getY(); Rectangle setY(float y); float getWidth(); Rectangle setWidth(float width); float getHeight(); Rectangle setHeight(float height); Rectangle increaseHeight(float extra); Rectangle decreaseHeight(float extra); Rectangle increaseWidth(float extra); Rectangle decreaseWidth(float extra); float getLeft(); float getRight(); float getTop(); float getBottom(); Rectangle moveDown(float move); Rectangle moveUp(float move); Rectangle moveRight(float move); Rectangle moveLeft(float move); Rectangle applyMargins(float topIndent, float rightIndent, float bottomIndent, float leftIndent, boolean reverse); boolean intersectsLine(float x1, float y1, float x2, float y2); @Override String toString(); @Override Rectangle clone(); boolean equalsWithEpsilon(Rectangle that); boolean equalsWithEpsilon(Rectangle that, float eps); static List<Rectangle> createBoundingRectanglesFromQuadPoint(PdfArray quadPoints); static Rectangle createBoundingRectangleFromQuadPoint(PdfArray quadPoints);  }
@Test public void calculateBBoxTest() { Point a = new Point(100, 100); Point b = new Point(200, 100); Point c = new Point(200, 200); Point d = new Point(100, 200); Rectangle.calculateBBox(Arrays.asList(a, b, c, d)); Assert.assertTrue(new Rectangle(100, 100, 100, 100).equalsWithEpsilon(Rectangle.calculateBBox(Arrays.asList(a, b, c, d)))); a = new Point(200, 100); b = new Point(200, 200); c = new Point(100, 200); d = new Point(100, 100); Assert.assertTrue(new Rectangle(100, 100, 100, 100).equalsWithEpsilon(Rectangle.calculateBBox(Arrays.asList(a, b, c, d)))); a = new Point(200, 100); b = new Point(200, 0); c = new Point(0, 100); d = new Point(0, 200); Assert.assertTrue(new Rectangle(0, 0, 200, 200).equalsWithEpsilon(Rectangle.calculateBBox(Arrays.asList(a, b, c, d)))); }