casting.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import itertools
  2. from typing import Any, Optional, Tuple
  3. from pdfminer.utils import Matrix, Rect
  4. _FloatTriple = Tuple[float, float, float]
  5. _FloatQuadruple = Tuple[float, float, float, float]
  6. def safe_int(o: Any) -> Optional[int]:
  7. try:
  8. return int(o)
  9. except (TypeError, ValueError):
  10. return None
  11. def safe_float(o: Any) -> Optional[float]:
  12. try:
  13. return float(o)
  14. except (TypeError, ValueError, OverflowError):
  15. return None
  16. def safe_matrix(a: Any, b: Any, c: Any, d: Any, e: Any, f: Any) -> Optional[Matrix]:
  17. a_f = safe_float(a)
  18. b_f = safe_float(b)
  19. c_f = safe_float(c)
  20. d_f = safe_float(d)
  21. e_f = safe_float(e)
  22. f_f = safe_float(f)
  23. if (
  24. a_f is None
  25. or b_f is None
  26. or c_f is None
  27. or d_f is None
  28. or e_f is None
  29. or f_f is None
  30. ):
  31. return None
  32. return a_f, b_f, c_f, d_f, e_f, f_f
  33. def safe_rgb(r: Any, g: Any, b: Any) -> Optional[Tuple[float, float, float]]:
  34. return _safe_float_triple(r, g, b)
  35. def safe_cmyk(
  36. c: Any, m: Any, y: Any, k: Any
  37. ) -> Optional[Tuple[float, float, float, float]]:
  38. return _safe_float_quadruple(c, m, y, k)
  39. def safe_rect_list(value: Any) -> Optional[Rect]:
  40. try:
  41. values = list(itertools.islice(value, 4))
  42. except TypeError:
  43. return None
  44. if len(values) != 4:
  45. return None
  46. return safe_rect(*values)
  47. def safe_rect(a: Any, b: Any, c: Any, d: Any) -> Optional[Rect]:
  48. return _safe_float_quadruple(a, b, c, d)
  49. def _safe_float_triple(a: Any, b: Any, c: Any) -> Optional[_FloatTriple]:
  50. a_f = safe_float(a)
  51. b_f = safe_float(b)
  52. c_f = safe_float(c)
  53. if a_f is None or b_f is None or c_f is None:
  54. return None
  55. return a_f, b_f, c_f
  56. def _safe_float_quadruple(a: Any, b: Any, c: Any, d: Any) -> Optional[_FloatQuadruple]:
  57. a_f = safe_float(a)
  58. b_f = safe_float(b)
  59. c_f = safe_float(c)
  60. d_f = safe_float(d)
  61. if a_f is None or b_f is None or c_f is None or d_f is None:
  62. return None
  63. return a_f, b_f, c_f, d_f