Skip to content

Commit 2c3fb66

Browse files
committed
ENH: Optimize getting of named destinations in readers
1 parent bc318d7 commit 2c3fb66

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

pypdf/_reader.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
ArrayObject,
6767
ContentStream,
6868
DecodedStreamObject,
69+
Destination,
6970
DictionaryObject,
7071
EncodedStreamObject,
7172
IndirectObject,
@@ -75,6 +76,7 @@
7576
PdfObject,
7677
StreamObject,
7778
TextStringObject,
79+
TreeObject,
7880
is_null_or_none,
7981
read_object,
8082
)
@@ -138,6 +140,9 @@ def __init__(
138140
elif password is not None:
139141
raise PdfReadError("Not an encrypted file")
140142

143+
# cache so we don't have to parse this over and over
144+
self._named_destinations: Optional[dict[str, Destination]] = None
145+
141146
def _initialize_stream(self, stream: Union[StrByteType, Path]) -> None:
142147
if hasattr(stream, "mode") and "b" not in stream.mode:
143148
logger_warning(
@@ -1274,3 +1279,18 @@ def _repr_mimebundle_(
12741279
data = {k: v for k, v in data.items() if k not in exclude}
12751280

12761281
return data
1282+
1283+
def _get_named_destinations(
1284+
self,
1285+
tree: Union[TreeObject, None] = None,
1286+
retval: Optional[dict[str, Destination]] = None,
1287+
) -> dict[str, Destination]:
1288+
"""Override from PdfDocCommon. In the reader we can assume this is
1289+
static, but not in the writer.
1290+
"""
1291+
if tree or retval:
1292+
return PdfDocCommon._get_named_destinations(self, tree, retval)
1293+
1294+
if self._named_destinations is None:
1295+
self._named_destinations = PdfDocCommon._get_named_destinations(self)
1296+
return self._named_destinations

0 commit comments

Comments
 (0)