106
106
MERGE_CROP_BOX = "cropbox" # pypdf<=3.4.0 used 'trimbox'
107
107
108
108
109
- def _get_rectangle (self : Any , name : str , defaults : Iterable [str ]) -> RectangleObject :
109
+ def _get_rectangle (self : Any , name : str , defaults : Iterable [str ], allow_truncate : bool ) -> RectangleObject :
110
110
retval : Union [None , RectangleObject , IndirectObject ] = self .get (name )
111
111
if isinstance (retval , RectangleObject ):
112
112
return retval
@@ -117,6 +117,13 @@ def _get_rectangle(self: Any, name: str, defaults: Iterable[str]) -> RectangleOb
117
117
break
118
118
if isinstance (retval , IndirectObject ):
119
119
retval = self .pdf .get_object (retval )
120
+ if allow_truncate and (isinstance (retval , list ) or isinstance (retval , tuple )):
121
+ if len (retval ) != 4 :
122
+ logger_warning (
123
+ f"Expected { name } to be a rectangle with 4 points, but found: { retval } " ,
124
+ __name__
125
+ )
126
+ retval = retval [:4 ]
120
127
retval = RectangleObject (retval ) # type: ignore
121
128
_set_rectangle (self , name , retval )
122
129
return retval
@@ -131,9 +138,14 @@ def _delete_rectangle(self: Any, name: str) -> None:
131
138
del self [name ]
132
139
133
140
134
- def _create_rectangle_accessor (name : str , fallback : Iterable [str ]) -> property :
141
+ def _create_rectangle_accessor (name : str , fallback : Iterable [str ], allow_truncate : bool = False ) -> property :
142
+ """
143
+ Params:
144
+ allow_truncate: True to permissively truncate the value at name down to the 4 points
145
+ expected by RectangleObject if the value is a Tuple or List with a greater length.
146
+ """
135
147
return property (
136
- lambda self : _get_rectangle (self , name , fallback ),
148
+ lambda self : _get_rectangle (self , name , fallback , allow_truncate = allow_truncate ),
137
149
lambda self , value : _set_rectangle (self , name , value ),
138
150
lambda self : _delete_rectangle (self , name ),
139
151
)
@@ -2452,12 +2464,12 @@ def _get_fonts(self) -> Tuple[Set[str], Set[str]]:
2452
2464
unembedded = fonts - embedded
2453
2465
return embedded , unembedded
2454
2466
2455
- mediabox = _create_rectangle_accessor (PG .MEDIABOX , ())
2467
+ mediabox = _create_rectangle_accessor (PG .MEDIABOX , (), allow_truncate = True )
2456
2468
"""A :class:`RectangleObject<pypdf.generic.RectangleObject>`, expressed in
2457
2469
default user space units, defining the boundaries of the physical medium on
2458
2470
which the page is intended to be displayed or printed."""
2459
2471
2460
- cropbox = _create_rectangle_accessor ("/CropBox" , (PG .MEDIABOX ,))
2472
+ cropbox = _create_rectangle_accessor ("/CropBox" , (PG .MEDIABOX ,), allow_truncate = True )
2461
2473
"""
2462
2474
A :class:`RectangleObject<pypdf.generic.RectangleObject>`, expressed in
2463
2475
default user space units, defining the visible region of default user
0 commit comments