
    mj\                     t   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-de.de+e(e(f   de(de.fdZ/de)de+e(e(f   de.de"jD                  fdZ0dede+eeeef   fdZ1d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"Z2de+e(e(f   de.de%de)d e(de+e"jD                  e)e)e,f   fd#Z3d$e"jD                  d%e4e)ef   d&edee)e*e   ef   d'e,de"jD                  fd(Z5d%e4e)ef   d e(dee)e*e   ef   de+e%e,f   fd)Z6	 d-d%e4e)ef   d*ee4e)ef   df   de+ee)   e.ef   fd+Z7y# e$$ r	  e$d      w xY w).z1Functions 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palettez
/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              O/root/.hermes/venv/lib/python3.12/site-packages/pypdf/generic/_image_xobject.pyrB   rB   )   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bitsc                    ddl m} |d   |d   z  }||kD  rt        d| d| d      t        |      }d|z  dz
  }|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 ]S  }|
d|z
  k7  r
|	dz  }	d|z
  }
t        |d         D ].  }| |	   |
z	  |z  ||||d   z  z   <   |
|z  }
|
dk  s%|	dz  }	d|z
  }
0 U 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.filtersrT   r   	bytearrayrC   r   rD   rangebytes)rO   rP   rQ   rT   buffer_sizebyte_buffermaskrequiredlength
data_indexbityxs                rM   	bits2byterf      sT   3q'DG#K**"8EWXmWnno pqqK(KI?DAw47T>A-!34Hd)x'GPXY8f,--J
d(C47^ 	!d(?!OJd(CtAw 	A,0,<,Ct+KKAQK(4KCQwa
$h			 rN   rH   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   rS   zRequested image buffer size z exceeds limit rU   z9Data is 0 bytes, cannot process an image from empty data.rN   c              3   N   K   | ]  }t        |ft              z          y wN)r\   r@   ).0re   ks     rM   	<genexpr>z$_image_from_bytes.<locals>.<genexpr>   s      ;qdSVm,;s   "%)	rC   rY   rT   r   r   	frombytes
ValueErrorr   join)rH   rP   rO   pixel_countbytes_per_pixelrequired_byte_countrT   imgexcdata_lengthrk   s             @rM   _image_from_bytesrv      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ri   )r?   )rj   values     rM   rl   z*__handle_flate__indexed.<locals>.<genexpr>   s     +X5E,<,<,>+Xs   r1   r    r   r	   z(Expected color space with 4 values, got z: )rC   r;   r<   r?   splitr@   r   )r)   countbasehivallookupelement1s         rM   __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YrN   colorsobj_as_textc           
         d}d}t        |t              r|d   dk(  rt        |      \  }}}	|dk(  rd}t        || d      }n|dk(  rd}t        || d	      }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%}|
||d&fS c c}}w c c}w # t>        $ r t        d"t               dY 9w xY w)'zh
    Process image encoded in flateEncode
    Returns img, image_format, extension, color inversion
    PNG.pngr   r2   r!   r#   r	   r"   r/   )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}   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   rN   r    r&   c              3   .   K   | ]  }||d z      yw)r/   N )rj   nr   s     rM   rl   z _handle_flate.<locals>.<genexpr>3  s!      +./q1q5)+s      )rawmodez=Base %(base)s not coded. Please share PDF with pypdf dev teamr0   .tifTIFFF)"r;   r   r   rf   rv   r   r   get_datar   original_bytesr<   encoderB   rH   r   rD   rC   r\   r
   convertzippointr   mergero   r[   r@   append
putpaletter   DEVICE_GRAYKeyErrorr   rm   )rP   rO   rH   r)   r   r   image_format	extensionr}   r~   rs   nbconvr   r   
colors_arrr5   	low_value
high_valuebandsb_rgb_c_m_y_k_r_g_bmode2r   s                                 @rM   _handle_flater      sm    LI +{+A*0L+B;+O(T5&wtQ'	tQ'
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..[ 'Im  	O
 F	s   O	 :&N>O	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   rB   r   r'   rH   rm   rP   tobytesr   )rP   rO   rH   r)   r   img1rI   rs   s           rM   _handle_jpxr   O  s     

74=-HD(fdCD,rzM499-v~yyFtu}yyDTYY-#s;
))T	vv.	. oodDIIt||~>ll4  xx6k[8kk% 
FL00rN   rs   x_objectlfiltersrI   c                 x  	 t         j                  |v r|t         j                     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  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 )Nr&   g      ?g        r$   r   r2   r3   c              3   4   K   | ]  }|   |d z  k(    yw)r	   Nr   )rj   idecodes     rM   rl   z _apply_decode.<locals>.<genexpr>  s     %UQfQi1q5&8%Us   r	   r1   c              3   R   K   | ]  }t        d |d z  z
  z  z   z           yw)g     o@N)round)rj   jdmaxdmins     rM   rl   z _apply_decode.<locals>.<genexpr>  s2      FGeq5yD4K84?@As   $'   )r   DECODErH   FT
JPX_DECODErC   getbands
DCT_DECODEr;   r   r?   allr[   extendr   )
rs   r   r   r)   rI   lutr   r   r   r   s
          @@@rM   _apply_decoder   r  s    )/001 
V	BMM 9#/#sc3Z#clln--
((f
R]]!:QTQYQY]`Q`sc#,,.11 	;,N%%':5;,N%%'=8sc#,,.11#%U%FBT%U"Uq#f+q) 	A!9D!a%=DJJ KPQT: 	 iinJrN   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/BitsPerComponentrW   rc   r   r   r1   Grayr	   )r   COLOR_SPACEr   
DEVICE_RGBrA   rB   r   )r   r   r)   rH   rI   s        rM   _get_mode_and_invert_colorr     s     	##x/_001[5K5KK $||'+a/,||/34C8!R
l"  - !'4k1  
l rN   pillow_parametersc                 
   dt         j                   dt        t        t        f   dt        dt        dt        dt        t         j                   t        t        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!                  t*        j,                  t#                     j%                         }
t        |
t&              r|
d   n|
}| j!                  t*        j.                        }|rt        |t        t&        f      r|d	   }ni }t        |t              si }d}|t0        j2                  t0        j4                  fv rt7        ||||||      \  }}}}n~|t0        j8                  t0        j:                  fv r?|t0        j8                  k(  rd}d}nd}d}	 t        j<                  t?        |      d      }n|t0        jD                  k(  r#t        j<                  t?        |            dd}}}n|t0        jF                  k(  rtI        |||||      \  }}}}	n|t0        jJ                  k(  r*t        j<                  t?        |      d      dddf\  }}}}	n|t0        jL                  k(  r*t        j<                  t?        |      d      dddf\  }}}}	nE|dk(  rtC        |||      dddf\  }}}}	n)|dk(  rtO        d|        tC        |||      dddf\  }}}}	tQ        || |||	      } ||| |||      \  }}}|i }|dk(  rd|_)        d|vrd|d<   t?               }	  |jT                  |fd |i| |j[                         }	 t        j<                  t?        |            }|||fS # t@        $ r tC        |||      }Y w xY w# tV        $ r5 |jY                  d!      }d}d}t?               }|jU                  ||"       Y w xY w# t\        $ r}t_        d#t`        |$       d}Y d}~d}~ww xY w)%a  
    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>

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

    rs   r   r   r   r   r-   c                    t         j                  |v rt        |t         j                           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 )Nr	   z1image and mask size not matching: %(obj_as_text)sr   r$   r#   r    r   JPEGr   r   r   r   )	r   S_MASK_xobj_to_imagerP   r   rD   rH   r   putalpha)rs   r   r   r   r   alphas         rM   _apply_alphaz$_xobj_to_image.<locals>._apply_alpha  s     !!X-"8O,B,B#CDQGExx5::%G# + ::$!MM#.E88s?++e,CXX_++c*CU#%)"	$"	I|++rN   Nr   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)1r   dictr<   r   tupleindirect_reference__repr__r   r@   r   WIDTHHEIGHTr   r;   r   rC   rA   r   r?   r=   r   r   FILTERDECODE_PARMSr   FLATE_DECODERUN_LENGTH_DECODEr   
LZW_DECODEASCII_85_DECODEr   r   r   rv   r   r   r   CCITT_FAX_DECODEJBIG2_DECODEr   r   r   saveOSErrorr   getvalue	Exceptionr   rD   )r   r   r   r   rP   rO   r   r)   rH   rI   filtersr   decode_parmsr   rs   r   _img_byte_arrr   r   s                       rM   r   r     s   &,[[,sCx., , 	,
 , 
u{{C$	%,F  	##,,.   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	6**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 dD$/	6
2\9l Xxl
KC#/X{L)$ CL  v 
--+1i( 9L5HlH6GH   "Djj' dCS & 	6#D$5C	6v  5{{6"	y		,|	45  <XYbcs<   4 Q? 6R S ?RR;SS	T%S>>T)r   ri   )8__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(   r@   r<   r=   r   boolrB   r\   rf   rv   r   r   r   r   r   r   r   r   rN   rM   <module>r     s7   7 
  6 6 = F F ) I I  BQ7" +1 #>y  %' c & 	U sDIs*+U U  U  	U 
 =$U pE sCx   <
38_,1
[[:Z ZsCc?Q9R Z$~/
S/~/
~/ ~/ sK'(	~/
 ~/ ~/ 5;;S$&'~/B 1
S/ 1
 1  1 	 1
  1 5;;S$&' 1F(	(38n( ( sDIs*+	(
 ( [[(V38n&)8=c49c>Q8R
=$@ :>t sCx.t  c3h!56t  8C=%$%t   
	= s   .F) )F7