
    JՁjl                        U d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
mZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZmZmZmZmZ ej<                  dd dk\  rddlmZ nddl mZ 	 ddl!m"Z"m#Z# ed   Z%ee&d<   dZ'e(e&d<   	 d/dee)e*e   ef   de(de%de(de+e%e,f   f
dZ-	 	 d0de.de+e(e(f   de(de(de,de.fdZ/de%de+e(e(f   de.dee)ef   de+e%e.f   f
d Z0de)de+e(e(f   de.de"jD                  fd!Z1dede+eeeef   fd"Z2de+e(e(f   de.de%dee)ef   de(d#e)de+e"jD                  e)e)e,f   fd$Z3de+e(e(f   de.de%de)de(de+e"jD                  e)e)e,f   fd%Z4d&e"jD                  d'e5e)ef   d(edee)e*e   ef   d)e,de"jD                  fd*Z6d'e5e)ef   de(dee)e*e   ef   de+e%e,f   fd+Z7	 	 d1d'e5e)ef   d,ee5e)ef   df   d-ee8e(      de+ee)   e.ef   fd.Z9y# e$$ r	  e$d      w xY w)2z1Functions to convert an image XObject to an image    N)BytesIO)AnyLiteralOptionalUnioncast   )check_if_whitespace_onlylogger_warning)ColorSpacesImageAttributesStreamAttributes)FilterTypes)EmptyImageDataErrorLimitReachedErrorPdfReadError)ArrayObjectDecodedStreamObjectEncodedStreamObject
NullObjectTextStringObjectis_null_or_none)   
   )	TypeAlias)ImageUnidentifiedImageErrorz]pillow is required to do image extraction. It can be installed via 'pip install pypdf[image]')	 1RGB2bits4bitsPLRGBACMYKmode_str_typer   MAX_IMAGE_MODE_NESTING_DEPTHcolor_spacecolor_components	prev_modedepthreturnc                    |t         kD  rt        d      t        |       ryd}t        | t              r| }n^t        | t
              st        d|       | sy| d   j                  d      rd| d   dd	 z   }n| d   d
k(  r9| d   j                         }t        t        |d         }|j                  dd      }n| d   dk(  r1| d   j                         }t        ||||dz         \  }}|dv rd}||fS | d   dk(  r+| d   j                         }t        ||||dz         \  }}|dfS | d   dk(  ri| }t        | d         }| d   j                         }|dk(  r)|dk(  r$|d   d   dk7  rt        dt        |d   d          yt        ||||dz         \  }}||fS dddddddd }	t        |	j                               }
|	j                  |      xs" d|cxk  rt        |
      k  rn n|
|   nd	xs |}||dk(  fS )!z
    Returns:
        Image mode, not taking into account mask (transparency).
        ColorInversion is required (like for some DeviceCMYK).

    z^Color spaces nested too deeply. If required, consider increasing MAX_IMAGE_MODE_NESTING_DEPTH.)r   Fr   zCannot interpret color spacer   z/Calz/Device   N	/ICCBased   z/Nz
/Alternate/Indexed)r    r&   r#   /Separationr	   Tz/DeviceN/DeviceCMYKz/BlackzGColor %(color)s converted to Gray. Please share PDF with pypdf dev team)sourcecolor)r$   Tr   r$   r    r&   r!   r"   )1bitz/DeviceGraypalette
/DeviceRGBr4   2bit4bit)r(   r   r   
isinstancestrlist
startswith
get_objectr   intget_get_image_modelenr   __name__values)r)   r*   r+   r,   color_space_stricc_profilemodeinvert_colororiginal_color_spacemode_mapmode_valuess              C/tmp/pip-target-jj2dfcxx/lib/python/pypdf/generic/_image_xobject.pyrC   rC   )   s    ++l
 	
 {#O+s#%T**K
 	
 	Q	"	"6	*#k!nQR&88	Q;	&!!n//1[%67%//,;	Q:	%%a.335,-y%!)
l ?"D\!!	Q=	(%a.335,-y%!)
l Tz	Q:	%*{1~.%a.335m+0@A0E#A&q)X5]#.q1!4
 ,-y%!)
l \!! *H x()K_% 	 $7s;'77 ()		  	     datasizebitscolorsscalec                    ddl m} |d   |z  }||d   z  }||kD  rt        d| d| d      t        |      }d|z  dz
  }	|r|	rd|	z  nd}
|d   ||z  dz   d	z  z  }t	        |       x}|k  rt        d
t               | d||z
  z  z  } d}d	|z
  }t        |d         D ]P  }|d	|z
  k7  r
|dz  }d	|z
  }t        |      D ].  }| |   |z	  |	z  |
z  ||||z  z   <   ||z  }|dk  s%|dz  }d	|z
  }0 R t        |      S )Nr   FLATE_MAX_BUFFER_SIZEr1   zRequested buffer size z exceeds limit of .         z.Image data is not rectangular. Adding padding.)r5       )	pypdf.filtersrW   r   	bytearrayrD   r   rE   rangebytes)rP   rQ   rR   rS   rT   rW   samples_per_rowbuffer_sizebyte_buffermaskfactorrequiredlength
data_indexbityxs                    rN   	bits2byterl      su    4 1g&O!DG+K**"8EWXmWnno pqqK(KI?D "dSD[FAw?T1A5!;<Hd)x'GPXY8f,--J
d(C47^ !d(?!OJd(C' 	Az"c)T1V; A//0 4KCQwa
$h		 rO   rI   c                 z    | dvr| |fS t        | d         }|dk(  rdt        |||dd      fS dt        |||      fS )	a,  
    Expand 2- or 4-bit-per-component samples to one byte per component.

    Pillow has no mode for sub-byte samples, so the packed data has to be
    unpacked before an image can be built from it. For a single-component
    color space the samples are palette/grayscale indices ("P"). For a
    multi-component space such as /DeviceRGB they are interleaved color
    components, so they are also scaled to the full 0-255 range and become
    an "RGB" image.

    Returns the resulting mode and data, unchanged when the mode is not a
    low-bit one.
    )r!   r"   r   r9   r    r   T)rS   rT   r#   )rA   rl   )rI   rQ   rP   r)   rR   s        rN   _expand_low_bit_samplesrn      sX    & %%TztAw<Dl"idD$GGG	$d+++rO   c                   
 |d   |d   z  }t        |       }||z  }ddlm} ||kD  rt        d| d| d      	 t	        j
                  | ||      }|S # t        $ rf}t        |      }	|	dk(  rt        d      ||	|z  dk7  r ||	z  
dj                  
fd	|D              }t	        j
                  | ||      }Y d }~|S d }~ww xY w)
Nr   r1   rV   zRequested image buffer size z exceeds limit rX   z9Data is 0 bytes, cannot process an image from empty data.rO   c              3   N   K   | ]  }t        |ft              z          y wN)r`   rA   ).0rk   ks     rN   	<genexpr>z$_image_from_bytes.<locals>.<genexpr>   s      ;qdSVm,;s   "%)	rD   r]   rW   r   r   	frombytes
ValueErrorr   join)rI   rQ   rP   pixel_countbytes_per_pixelrequired_byte_countrW   imgexcdata_lengthrs   s             @rN   _image_from_bytesr~      s     q'DG#K$iO%7322*+>*?OdNeefg
 	
0oodD$/ J  
0$i!%K $)+-xx;d;;oodD$/J
0s   A 	CAB>>Cc                 b   t        |       }|dk(  rd | D        \  } }}}| |||fS | d   }t        |t              r|n|j                         }|dk(  rOd|v rK| d   j                         | d   j                         }} |j	                  d      \  }}t        |      }| |||fS t        d| d	|        )
Nr/   c              3   <   K   | ]  }|j                           y wrq   )r@   )rr   values     rN   rt   z*__handle_flate__indexed.<locals>.<genexpr>   s     +X5E,<,<,>+Xs   r1   r    r   r	   z(Expected color space with 4 values, got z: )rD   r<   r=   r@   splitrA   r   )r)   countbasehivallookupelement1s         rN   __handle_flate__indexedr      s    Ez+XK+X(T5&D%// 1~H%h4x(:M:M:OHzf()!n779;q>;T;T;VVnnV,eE
D%//
A%;-X
YYrO   obj_as_textc           
         t        |t              r|d   dk(  rt        |      \  }}}t        || ||      \  }}t	        || |      }|dk(  rt        t
        t        f      rj                         t        t              rj                  t        t              rj                         	 ddddddt        dd      d      \  }	}
}|j                  d	k(  r|	dk(  rt        d
t        |       n2|j                  d	k(  rd|	z  }t!              }||k7  rT||k  r)t        dt        ||       t#        dg||z
  z        z  n!t%        |d       st        dt        ||       d| d|	 |	d g}|j'                  d      }t)        |d   |d         D cg c]!  \  }}|j+                  |gdz  |gdz  z         # }}}|	dk(  r|d   nt-        j.                  ||      }n?|j'                  |
      }t!              dz   |	z  k7  rt        dt        |       dn|dk(  r.dj1                  D cg c]  }t#        |||g       c}      d}n|dk(  rg }fdt3        ddt!              dz  z  d      D        D ]{  \  }}}}t5        dd|dz  z
  z  d|dz  z
  z        }t5        dd|dz  z
  z  d|dz  z
  z        }t5        dd|dz  z
  z  d|dz  z
  z        }|j7                  t#        |||f             } dj1                  |      d}|j9                  |       |j'                  |t:        j<                  k(  rdnd      }nDtA        |      s9|d   dk(  r1|d	k7  r,t        |||      d   }||k7  rt-        jB                  || |      }|dk(  rd}d }nd!}d"}|||d#fS c c}}w c c}w # t>        $ r t        dt               dY >w xY w)$z
    Process image encoded using the zlib/deflate compression method, corresponds to the FlateDecode filter
    Returns img, image_format, extension, color inversion
    r   r2   )r   r   r   )r1   r#   r$   )r   r#   r    )r/   r#   r&   )r   r$   r#   r    r&   r   r   z`Cannot apply lookup for base %(base)s to image with mode 1. Please share PDF with pypdf dev team)r5   r   r	   zLNot enough lookup values: Expected %(expected_count)d, got %(actual_count)d.)r5   expected_countactual_countNzJToo many lookup values: Expected %(expected_count)d, got %(actual_count)d.r$   r1      z'Invalid Lookup Table in %(obj_as_text)sr5   r   rO   r    r&   c              3   .   K   | ]  }||d z      yw)r/   N )rr   nr   s     rN   rt   z _handle_flate.<locals>.<genexpr>U  s!      +./q1q5)+s   r/   rY   )rawmodez=Base %(base)s not coded. Please share PDF with pypdf dev teamr0   TIFF.tifPNG.pngF)"r<   r   r   rn   r~   r   r   get_datar   original_bytesr=   encoderC   rI   r   rE   rD   r`   r
   convertzippointr   mergerw   r_   rA   append
putpaletter   DEVICE_GRAYKeyErrorr   ru   )rQ   rP   rI   r)   rS   r   r   r   r{   nbconvr   r   
colors_arrr5   	low_value
high_valuebandsb_rgb_c_m_y_k_r_g_bmode2image_format	extensionr   s                                 @rN   _handle_flater      sK    +{+A*0L+B;+O(T5&(tT;GJD$
D$
-Cj f24GHI__&Ff./**Ffc"]]_FO	Q " &( dAr*1-/NBd xx327 ;#	 S!"R"6{>1#n4&j#++9)5	 %~/L(M"NN5f^_6MN&h#++9)5	 $O^4F$Sbk6"#;7
S)
 25Z]JqM1R	 .	: LL"c)ZL3,>>  #%'eAhu{{4/Gkk$'v;519"22"#LU]kvw!FS[ XX&HAuaAY'7&HIF D V^D+38AVPQAQ<RTU3V+ 9BB !BH!5R#X!FG BH!5R#X!FG BH!5R#X!FGE2r2,$789 !XXd^F D%NN64N8++T[-D-D%Dc%PC[)k!n.K
 3;#K>qAEu}oodD$7v~		i..a 'Im  	O
 F	s   1N2 &N'7N-2OOc                    t        j                  t        |      d      }t        |||      \  }}|dk(  rt	        t
        |j                        }|dk(  }|j                  dk(  r|dk(  rd}|j                  |k(  s|j                  |hddhk(  r|}nT|j                  |hddhk(  r0t        j                  ||j                  |j                               }n|j                  |      }|j                  dk(  r|d	k(  r|j                  d      }|d
d|fS )zc
    Process image encoded as JPX/JPEG2000
    Returns img, image_format, extension, inversion
    )JPEG2000formatsr   r&   r%   r    r$   r#   r0   r   .jp2)r   openr   rC   r   r'   rI   ru   rQ   tobytesr   )rQ   rP   rI   r)   rS   img1rJ   r{   s           rN   _handle_jpxr   t  s     

74=-HD(fdCD,rzM499-v~yyFtu}yyDTYY-#s;
))T	vv.	. oodDIIt||~>ll4  xx6k[8kk% 
FL00rO   r{   x_objectlfiltersrJ   c                   	
 t         j                  |v rq|t         j                     	| j                  dk(  r|t        j                  k(  rt        dt        	      dz
  d      D cg c]  }	|dz      	|   fD ]  }|  c}}	n| j                  dk(  r:|t        j                  k(  r'|sddgnddg		t        | j                               z  	nT| j                  dk(  r|t        j                  k(  s|r.| j                  dk(  rddgt        | j                               z  	nd 	t        |t              r|d   j                         dk(  rd 	t        |t              r4|d   j                         d	k(  rddgt        | j                               z  		5t        	t              rt        	      dz  dk7  rt        d
t        	       d 		t        	fdt        t        	            D              s_g }t        dt        	      d      D ]3  }	|   	|dz      
|j!                  
fdt        d      D               5 | j#                  |      } | S c c}}w )Nr&   r   r1   r	   g      ?g        r$   r2   r3   zOIgnoring malformed /Decode array %(decode)s; expected an even number of values.)r5   decodec              3   4   K   | ]  }|   |d z  k(    yw)r	   Nr   )rr   ir   s     rN   rt   z _apply_decode.<locals>.<genexpr>  s     %UQfQi1q5&8%Us   c              3   R   K   | ]  }t        d |d z  z
  z  z   z           yw)g     o@N)round)rr   jdmaxdmins     rN   rt   z _apply_decode.<locals>.<genexpr>  s2      FGeq5yD4K84?@As   $'   )r   DECODErI   FT
DCT_DECODEr_   rD   
JPX_DECODEgetbandsr<   r   r@   r>   r   rE   allextendr   )r{   r   r   r)   rJ   indexr   lutr   r   r   r   s            @@@rN   _apply_decoder     s3    )/00188v(bmm"; #1c&kAoq9$UQY/?  F
 
V	BMM 9#/#sc3Z#clln--
((f
R]]!:QTQYQY]`Q`sc#,,.11 	;,N%%':5;,N%%'=8sc#,,.11vt$Fa1(< 	]	

 #%U%FBT%U"Uq#f+q) 	A!9D!a%=DJJ KPQT: 	 iinJ[s   'Ic                 >   t         j                  | v r&| t         j                     t        j                  k(  rd}| j	                  dd      dk  r't        | j	                  dd       ddd      \  }}||fS t        ||dk(  rt        |      sd|vrd	n|d      \  }}||fS )
Nr    z/BitsPerComponentr[   ri   r   r   r1   Grayr	   )r   COLOR_SPACEr   
DEVICE_RGBrB   rC   r   )r   rS   r)   rI   rJ   s        rN   _get_mode_and_invert_colorr     s     	##x/_001[5K5KK $||'+a/,||/34C8!R
l"  - !'4k1  
l rO   pillow_parametersvisitedc                 
   
t               j                  t        |              dt        j                  dt        t
        t        f   dt
        dt
        dt
        dt        t        j                  t
        t
        f   ffd}| | j                  j                         n| j                         }t        t        | t        j                           t        t        | t        j                           f}| j                         }t!        |t
              r|j#                         }t%        |      |d	   |d
   z  z  d
k(  r|d   dk(  r|dd }| j'                  dd
      }| j'                  dt)                     j+                         }t!        |t,              r!t%        |      d
k(  r|d	   j+                         }t/        | ||      \  }	}
| j'                  t0        j2                  t)                     j+                         }t!        |t,              r|d   n|}| j'                  t0        j4                        }|rt!        |t        t,        f      r|d	   }ni }t!        |t              si }d}|t6        j8                  t6        j:                  fv rt=        |||	|||      \  }}}}n|t6        j>                  t6        j@                  fv r?|t6        j>                  k(  rd}d}nd}d}	 t        jB                  tE        |      d      }n.|t6        jL                  k(  r#t        jB                  tE        |            dd}}}n|t6        jN                  k(  rtQ        |||	||      \  }}}}
n|t6        jR                  k(  r*t        jB                  tE        |      d      dddf\  }}}}
n|t6        jT                  k(  r*t        jB                  tE        |      d      dddf\  }}}}
nV|	dk(  rtK        |	||      dddf\  }}}}
n:|	dk(  rtW        d|        tI        |	|||      \  }	}tK        |	||      dddf\  }}}}
tY        || |||
      } ||| |||      \  }}}|i }|dk(  rd|_-        d|vrd|d<   tE               }	  |j\                  |fd |i| |jc                         }	 t        jB                  tE        |            }|||fS # tF        $ r! tI        |	|||      \  }}tK        |||      }Y w xY w# t^        $ r5 |ja                  d!      }d}d}tE               }|j]                  ||"       Y w xY w# td        $ r}tg        d#th        |$       d}Y d}~d}~ww xY w)%aT  
    Users need to have the pillow package installed.

    It's unclear if pypdf will keep this function here, hence it's private.
    It might get removed at any point.

    Args:
        x_object:
        pillow_parameters: parameters provided to Pillow Image.save() method,
            cf. <https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save>
        visited: Set of id() values of XObjects already being converted higher
            up the /SMask chain, used to detect cyclic soft masks.

    Returns:
        Tuple[file extension, bytes, PIL.Image.Image]

    Nr{   r   r   r   r   r-   c                    t         j                  |v r|t         j                     }t        |      v rt        dt        |       | ||fS t        |      d   }| j                  |j                  k7  rt        dt        |       nr|j                  dk7  r|j                  d      }| j                  dk(  r| j                  d      } n | j                  d	k(  r| j                  d      } | j                  |       d
|v rd}d}nd}d}| ||fS )Nz3Ignoring cyclic /SMask reference in %(obj_as_text)sr   )r   r	   z1image and mask size not matching: %(obj_as_text)sr$   r#   r    r   JPEGr   r   r   r   )
r   S_MASKidr   rE   _xobj_to_imagerQ   rI   r   putalpha)r{   r   r   r   r   s_maskalphar   s          rN   _apply_alphaz$_xobj_to_image.<locals>._apply_alpha  s    !!X-o445F&zW$
 I# +
 I|33"67;A>Exx5::%G# + ::$!MM#.E88s?++e,CXX_++c*CU#%)"	$"	I|++rO   r   r1   r   z/Colorsz/ColorSpacer   z.tiffr   r   )r   r   r   r   z.jpg)r   F)r   PPMr&   r   r   zColorSpace field not found in qualitykeepformatr%   )r   z#Failed loading image: %(exception)s)r5   	exception)5setaddr   r   dictr=   r   tupleindirect_reference__repr__r   rA   r   WIDTHHEIGHTr   r<   r   rD   rB   r   r@   r>   r   r   FILTERDECODE_PARMSr   FLATE_DECODERUN_LENGTH_DECODEr   
LZW_DECODEASCII_85_DECODEr   r   r   rn   r~   r   r   r   CCITT_FAX_DECODEJBIG2_DECODEr   r   r   saveOSErrorr   getvalue	Exceptionr   rE   )r   r   r   r   r   rQ   rP   rS   r)   rI   rJ   filtersr   decode_parmsr   r{   r   _fallback_modefallback_dataimg_byte_arrr   r   s     `                    rN   r   r     sR   , %KK8*,[[*,sCx.*, *, 	*,
 *, 
u{{C$	%*,^  	##,,.   h4456S(?KaKaBb8cdDD${{}
4yDGd1g%&!+RD0@CRy \\)Q'F||M:<@KKMK+t$[)9Q)>!!n//13HfkRD, ll+22JLALLNG($7wr{WH<< 0 = =>L
<%?#AlD)IBOOR%9%9::*7+
'\9a 
bmmR%7%78	8 r}}$!LI LI	H**WT]ODC 
R]]	"',zz'$-'@&&9\	R]]	"5@$k66
2\9l 
R((	(JJwt}i8	6
2\9l 
R__	$JJwt}n=	6
2\9l 
dD$/	6
2\9l 
;H:FGG -T4{K
ddD$/	6
2\9l Xxl
KC#/X{L)$ CL  v 
--+1i( 9L5HlH6GH   "Djj' dC_ & 	H+BdD+,(M= $M4GC		HB  5{{6"	y		,|	45  <XYbcs<    R9 0S& T' 9'S#"S#&;T$#T$'	U0U		U)r   )r1   F)NN):__doc__sysior   typingr   r   r   r   r   _utilsr
   r   	constantsr   r   r   r   r   errorsr   r   r   genericr   r   r   r   r   r   version_infor   typing_extensionsPILr   r   ImportErrorr'   __annotations__r(   rA   r=   r>   r   boolrC   r`   rl   rn   r~   r   r   r   r   r   r   r   r   r   rO   rN   <module>r     s   7 
  6 6 = F F ) I I  BQ7" +1 #>y  %' c & 	U sDIs*+U U  U  	U 
 =$U x )
)
S/) ) 	)
 ) )X,
,
S/, , sK'(	,
 =% ,6
38_,1
[[:Z ZsCc?Q9R Z$z/
S/z/
z/ z/ sK'(	z/
 z/ z/ 5;;S$&'z/z 1
S/ 1
 1  1 	 1
  1 5;;S$&' 1FD	D38nD D sDIs*+	D
 D [[DN38n&)8=c49c>Q8R
=$@ :>&*M sCx.M  c3h!56M  #c(#M  8C=%$%	M A  
	= s   .G G$