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
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
1from typing import Any, Iterable, List, Optional, Tuple
3from pdfminer import settings
4from pdfminer.pdfparser import PDFSyntaxError
5from pdfminer.pdftypes import dict_value, int_value, list_value
6from pdfminer.utils import choplist
9class NumberTree:
10 """A PDF number tree.
12 See Section 3.8.6 of the PDF Reference.
13 """
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
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"])
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))
34 if self.kids: # Root or intermediate node
35 for child_ref in self.kids:
36 items += NumberTree(child_ref)._parse()
38 return items
40 values: List[Tuple[int, Any]] # workaround decorators unsupported by mypy
42 @property # type: ignore[no-redef,misc]
43 def values(self) -> List[Tuple[int, Any]]:
44 values = self._parse()
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])
52 return values