codekingpro/portable-devtools
114k
1from typing import Any, Union2 3from ._base import FloatObject, NumberObject4from ._data_structures import ArrayObject5 6 7class RectangleObject(ArrayObject):8 """9 This class is used to represent *page boxes* in pypdf.10 11 These boxes include:12 13 * :attr:`artbox <pypdf._page.PageObject.artbox>`14 * :attr:`bleedbox <pypdf._page.PageObject.bleedbox>`15 * :attr:`cropbox <pypdf._page.PageObject.cropbox>`16 * :attr:`mediabox <pypdf._page.PageObject.mediabox>`17 * :attr:`trimbox <pypdf._page.PageObject.trimbox>`18 """19 20 def __init__(21 self, arr: Union["RectangleObject", tuple[float, float, float, float]]22 ) -> None:23 # must have four points24 assert len(arr) == 425 # automatically convert arr[x] into NumberObject(arr[x]) if necessary26 ArrayObject.__init__(self, [self._ensure_is_number(x) for x in arr])27 28 def _ensure_is_number(self, value: Any) -> Union[FloatObject, NumberObject]:29 if not isinstance(value, (FloatObject, NumberObject)):30 return FloatObject(value)31 return value32 33 def scale(self, sx: float, sy: float) -> "RectangleObject":34 return RectangleObject(35 (36 float(self.left) * sx,37 float(self.bottom) * sy,38 float(self.right) * sx,39 float(self.top) * sy,40 )41 )42 43 def __repr__(self) -> str:44 return f"RectangleObject({list(self)!r})"45 46 @property47 def left(self) -> FloatObject:48 value: FloatObject = self[0]49 return value50 51 @left.setter52 def left(self, f: float) -> None:53 self[0] = FloatObject(f)54 55 @property56 def bottom(self) -> FloatObject:57 value: FloatObject = self[1]58 return value59 60 @bottom.setter61 def bottom(self, f: float) -> None:62 self[1] = FloatObject(f)63 64 @property65 def right(self) -> FloatObject:66 value: FloatObject = self[2]67 return value68 69 @right.setter70 def right(self, f: float) -> None:71 self[2] = FloatObject(f)72 73 @property74 def top(self) -> FloatObject:75 value: FloatObject = self[3]76 return value77 78 @top.setter79 def top(self, f: float) -> None:80 self[3] = FloatObject(f)81 82 @property83 def lower_left(self) -> tuple[float, float]:84 """85 Property to read and modify the lower left coordinate of this box86 in (x,y) form.87 """88 return self.left, self.bottom89 90 @lower_left.setter91 def lower_left(self, value: tuple[float, float]) -> None:92 self[0], self[1] = (self._ensure_is_number(x) for x in value)93 94 @property95 def lower_right(self) -> tuple[float, float]:96 """97 Property to read and modify the lower right coordinate of this box98 in (x,y) form.99 """100 return self.right, self.bottom101 102 @lower_right.setter103 def lower_right(self, value: tuple[float, float]) -> None:104 self[2], self[1] = (self._ensure_is_number(x) for x in value)105 106 @property107 def upper_left(self) -> tuple[float, float]:108 """109 Property to read and modify the upper left coordinate of this box110 in (x,y) form.111 """112 return self.left, self.top113 114 @upper_left.setter115 def upper_left(self, value: tuple[float, float]) -> None:116 self[0], self[3] = (self._ensure_is_number(x) for x in value)117 118 @property119 def upper_right(self) -> tuple[float, float]:120 """121 Property to read and modify the upper right coordinate of this box122 in (x,y) form.123 """124 return self.right, self.top125 126 @upper_right.setter127 def upper_right(self, value: tuple[float, float]) -> None:128 self[2], self[3] = (self._ensure_is_number(x) for x in value)129 130 @property131 def width(self) -> float:132 return self.right - self.left133 134 @property135 def height(self) -> float:136 return self.top - self.bottom137 