import math from typing import NamedTuple # For more details, see the PDF Reference, 6th Ed., Section 4.2.2 ("Common # Transformations") class CTM(NamedTuple): a: float b: float c: float d: float e: float f: float @property def scale_x(self) -> float: return math.sqrt(pow(self.a, 2) + pow(self.b, 2)) @property def scale_y(self) -> float: return math.sqrt(pow(self.c, 2) + pow(self.d, 2)) @property def skew_x(self) -> float: return (math.atan2(self.d, self.c) * 180 / math.pi) - 90 @property def skew_y(self) -> float: return math.atan2(self.b, self.a) * 180 / math.pi @property def translation_x(self) -> float: return self.e @property def translation_y(self) -> float: return self.f