From 8465c0d4fe8f690727fe82c8f126cdd9308887fd Mon Sep 17 00:00:00 2001 From: Lars Marius Garshol Date: Thu, 21 Aug 2025 10:18:17 +0200 Subject: [PATCH] ENH: Optimize getting of named destinations in readers --- pypdf/_reader.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pypdf/_reader.py b/pypdf/_reader.py index ef92025ed..9b2ea322e 100644 --- a/pypdf/_reader.py +++ b/pypdf/_reader.py @@ -66,6 +66,7 @@ ArrayObject, ContentStream, DecodedStreamObject, + Destination, DictionaryObject, EncodedStreamObject, IndirectObject, @@ -75,6 +76,7 @@ PdfObject, StreamObject, TextStringObject, + TreeObject, is_null_or_none, read_object, ) @@ -138,6 +140,8 @@ def __init__( elif password is not None: raise PdfReadError("Not an encrypted file") + self._named_destinations_cache: Optional[dict[str, Destination]] = None + def _initialize_stream(self, stream: Union[StrByteType, Path]) -> None: if hasattr(stream, "mode") and "b" not in stream.mode: logger_warning( @@ -1274,3 +1278,18 @@ def _repr_mimebundle_( data = {k: v for k, v in data.items() if k not in exclude} return data + + def _get_named_destinations( + self, + tree: Union[TreeObject, None] = None, + retval: Optional[dict[str, Destination]] = None, + ) -> dict[str, Destination]: + """Override from PdfDocCommon. In the reader we can assume this is + static, but not in the writer. + """ + if tree or retval: + return PdfDocCommon._get_named_destinations(self, tree, retval) + + if self._named_destinations_cache is None: + self._named_destinations_cache = PdfDocCommon._get_named_destinations(self) + return self._named_destinations_cache