Coverage for /pythoncovmergedfiles/medio/medio/src/pdfminer.six/pdfminer/data_structures.py: 83%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

35 statements  

1from typing import Any, Iterable, List, Optional, Tuple 

2 

3from pdfminer import settings 

4from pdfminer.pdfparser import PDFSyntaxError 

5from pdfminer.pdftypes import dict_value, int_value, list_value 

6from pdfminer.utils import choplist 

7 

8 

9class NumberTree: 

10 """A PDF number tree. 

11 

12 See Section 3.8.6 of the PDF Reference. 

13 """ 

14 

15 def __init__(self, obj: Any): 

16 self._obj = dict_value(obj) 

17 self.nums: Optional[Iterable[Any]] = None 

18 self.kids: Optional[Iterable[Any]] = None 

19 self.limits: Optional[Iterable[Any]] = None 

20 

21 if "Nums" in self._obj: 

22 self.nums = list_value(self._obj["Nums"]) 

23 if "Kids" in self._obj: 

24 self.kids = list_value(self._obj["Kids"]) 

25 if "Limits" in self._obj: 

26 self.limits = list_value(self._obj["Limits"]) 

27 

28 def _parse(self) -> List[Tuple[int, Any]]: 

29 items = [] 

30 if self.nums: # Leaf node 

31 for k, v in choplist(2, self.nums): 

32 items.append((int_value(k), v)) 

33 

34 if self.kids: # Root or intermediate node 

35 for child_ref in self.kids: 

36 items += NumberTree(child_ref)._parse() 

37 

38 return items 

39 

40 values: List[Tuple[int, Any]] # workaround decorators unsupported by mypy 

41 

42 @property # type: ignore[no-redef,misc] 

43 def values(self) -> List[Tuple[int, Any]]: 

44 values = self._parse() 

45 

46 if settings.STRICT: 

47 if not all(a[0] <= b[0] for a, b in zip(values, values[1:])): 

48 raise PDFSyntaxError("Number tree elements are out of order") 

49 else: 

50 values.sort(key=lambda t: t[0]) 

51 

52 return values