Skip to content

Commit 5f25cc9

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

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

pypdf/_reader.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
TYPE_CHECKING,
3838
Any,
3939
Callable,
40+
Dict,
4041
Optional,
4142
Union,
4243
cast,
@@ -66,6 +67,7 @@
6667
ArrayObject,
6768
ContentStream,
6869
DecodedStreamObject,
70+
Destination,
6971
DictionaryObject,
7072
EncodedStreamObject,
7173
IndirectObject,
@@ -75,6 +77,7 @@
7577
PdfObject,
7678
StreamObject,
7779
TextStringObject,
80+
TreeObject,
7881
is_null_or_none,
7982
read_object,
8083
)
@@ -138,6 +141,9 @@ def __init__(
138141
elif password is not None:
139142
raise PdfReadError("Not an encrypted file")
140143

144+
# cache so we don't have to parse this over and over
145+
self._named_destinations: Optional[Dict[str, Destination]] = None
146+
141147
def _initialize_stream(self, stream: Union[StrByteType, Path]) -> None:
142148
if hasattr(stream, "mode") and "b" not in stream.mode:
143149
logger_warning(
@@ -1274,3 +1280,18 @@ def _repr_mimebundle_(
12741280
data = {k: v for k, v in data.items() if k not in exclude}
12751281

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

0 commit comments

Comments
 (0)