U
    ߦwh9                     @   sf  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	m
Z
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
l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rddlm Z  nddl!m Z  zddl"m#Z#m$Z$ W n e%k
r   e%dY nX ed Z&e e'd< dZ(e)e'd< d-e
e*ee ef e)e&e)e	e&e+f dddZ,e-e	e)e)f e)e-dddZ.e*e	e)e)f e-e#j#dddZ/ee	eeeef ddd Z0e	e)e)f e-e&e*e)e*e	e#j#e*e*e+f d!d"d#Z1e	e)e)f e-e&e*e)e	e#j#e*e*e+f d$d%d&Z2e#j#ee*ef ee
e*ee ef e+e#j#d'd(d)Z3ee*ef e)e
e*ee ef e	e&e+f d*d+d,Z4dS ).z9Code in here is only used by pypdf.filters._xobj_to_image    N)BytesIO)AnyDictListLiteralTupleUnioncast   )check_if_whitespace_onlylogger_warning)ColorSpaces)FilterTypes)ImageAttributes)EmptyImageDataError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           
      C   s  |t krtdt| rdS d}t| tr2| }nzt| tsJtd| nb| d drpd| d dd	  }n<| d d
kr| d  }tt	|d }|
dd}n| d dkr| d  }t||||d \}}|dkrd}||fS | d dkr | d  }t||||d \}}|dfS | d dkr| }t| d }| d  }|dkr|dkr|d d dkrtd|d d  dt dS t||||d \}}||fS dddddddd }	|	
|pt|	 | p|}||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	/ICCBasedr
   z/Nz
/Alternate/Indexed)r    r&   r#   /Separationr   Tz/DeviceN/DeviceCMYKz/BlackzColor z8 converted to Gray. Please share PDF with pypdf dev team)r$   Tr   r$   r    r&   r!   r"   )Z1bitz/DeviceGrayZpalettez
/DeviceRGBr2   Z2bitZ4bit)r(   r   r   
isinstancestrlist
startswith
get_objectr	   intget_get_imagemodelenr   __name__values)
r)   r*   r+   r,   Zcolor_space_strZicc_profilemodeinvert_colorZoriginal_color_spaceZmode_map r@   =/tmp/pip-unpacked-wheel-r8zeli8p/pypdf/_xobj_image_helpers.pyr:   *   s    

          r:   )datasizebitsr-   c           	      C   s   d|> d }t |d |d  }d}d| }t|d D ]r}|d| krX|d7 }d| }t|d D ]D}| | |? |@ ||||d   < ||8 }|dk rd|d7 }d| }qdq8t|S )Nr
   r      )	bytearrayrangebytes)	rB   rC   rD   maskZbyte_bufferZ
data_indexbityxr@   r@   rA   	bits2bytez   s     rM   )r>   rC   rB   r-   c              
      s   zt | ||}W n tk
r } zt|d |d  }t|}|dkrNtd||| dkr^||t|  |  d fdd|D }t | ||}W 5 d }~X Y nX |S )Nr   r
   z9Data is 0 bytes, cannot process an image from empty data.    c                 3   s    | ]}t |ft  V  qd S N)rH   r8   .0rL   kr@   rA   	<genexpr>   s     z,_extended_image_frombytes.<locals>.<genexpr>)r   	frombytes
ValueErrorr;   r   join)r>   rC   rB   imgexcZnb_pixdata_lengthr@   rR   rA   _extended_image_frombytes   s"     r[   )r)   r-   c                 C   s   t | }|dkr2dd | D \} }}}| |||fS | d }t|trH|n| }|dkrd|kr| d  | d   } }|d\}}t|}| |||fS td	| d
|  d S )Nr.   c                 s   s   | ]}|  V  qd S rO   )r7   )rQ   valuer@   r@   rA   rT      s     z*__handle_flate__indexed.<locals>.<genexpr>r
   r    r   r   z(Expected color space with 4 values, got z: )r;   r3   r4   r7   splitr8   r   )r)   countbasehivallookupZelement1r@   r@   rA   __handle_flate__indexed   s    rc   )rC   rB   r>   r)   colorsobj_as_textr-   c                    s  d}d}t |tr.|d dkr.t|\}}}	|dkrHd}t|| d}n|dkr`d}t|| d	}t|| ||dkrBt ttfr t trj	t t
r z*d
dd
dddt|ddd  \}
}}W n. tk
r   td| dt dY qX jdkrd|
 }t}||kr||k rhtd| d| dt tdg||  7 n*t|d std| d| dt d| d|
 |
d g d fddtjd D }t|j|n8|t|	d |
 kr$td| t dn|dkrHddd D d }n|d!krg }fd"dtdd	td	  d	D D ]\}}}}td#d|d#   d|d#   }td#d|d#   d|d#   }td#d|d#   d|d#   }|t|||f q|d|d }dk	r&j|d$ |tjkr:dnd nBt |ts|d d%krt|||d }||krt|| ||d!krd&}d'}||d(fS ))zh
    Process image encoded in flateEncode
    Returns img, image_format, extension, color inversion
    z.pngZPNGr   r0   r!   r#   r   r"   r.   )r   r   r   )r
   r#   r$   )r   r#   r    )r.   r#   r&   )r   r$   r#   r    r&   r   zBase z8 not coded please share the pdf file with pypdf dev teamNr   z#Not enough lookup values: Expected z, got .z!Too many lookup values: Expected rN   c                 3   s4   | ], d   fddtjd D V  qdS )rN   c                 3   s,   | ]$}  |fd krdnd V  qdS )   r
   r   N)ZgetpixelrP   )
colors_arrrX   rK   r@   rA   rT      s   z*_handle_flate.<locals>.<genexpr>.<genexpr>r   N)rW   rG   rC   )rQ   )rh   rX   )rK   rA   rT      s   z _handle_flate.<locals>.<genexpr>r
   zInvalid Lookup Table in r$   c                 S   s   g | ]}t |||gqS r@   )rH   )rQ   br@   r@   rA   
<listcomp>  s     z!_handle_flate.<locals>.<listcomp>r    r&   c                 3   s   | ]} ||d   V  qdS )r.   Nr@   )rQ   n)rb   r@   rA   rT   	  s       )rawmoder/   z.tifZTIFFF) r3   r   rc   rM   r[   r   r   get_datar   original_bytesr4   encoder:   KeyErrorr   r<   r>   r;   rH   r   rW   rG   rC   r   rU   convertr8   appendZ
putpaletter   ZDEVICE_GRAYr   )rC   rB   r>   r)   rd   re   	extensionimage_formatr`   ra   nbconvZexpected_countZactual_countZarrZ_rgbZ_c_mZ_yZ_k_rZ_g_bZmode2r@   )rh   rX   rb   rA   _handle_flate   s    









   



r{   )rC   rB   r>   r)   rd   r-   c           
      C   s   d}t jt|dd}t|||\}}|dkrBtt|j}|dk}|jdkrX|dkrXd}|j|kst|j|hdd	hkrz|}n2|j|hdd
hkrt ||j|	 }n
|
|}|jd
kr|
d}d}	||	||fS )zb
    Process image encoded in flateEncode
    Returns img, image_format, extension, inversion
    z.jp2)JPEG2000)formatsr   )r&   r%   r    r$   r#   r&   r|   )r   openr   r:   r	   r'   r>   rU   rC   tobytesrr   )
rC   rB   r>   r)   rd   rt   Zimg1r?   rX   ru   r@   r@   rA   _handle_jpx!  s"    


r   )rX   x_object_objlfiltersr)   r?   r-   c                    s  | tj| jdkr"|tjtjfks0|rD| jdkrDddgt|   nd  t	|t
rh|d  dkrhd  t	|t
r|d  dkrddgt|     d k	rt fdd	tt D sg }tdt d
D ]6} |  |d  |fdd	tdD  q| |} | S )Nr&   r$   g      ?g        r   r0   r1   c                 3   s   | ]} | |d  kV  qdS )r   Nr@   )rQ   i)decoder@   rA   rT   c  s     z _apply_decode.<locals>.<genexpr>r   r
   c                 3   s*   | ]"}t d |d       V  qdS )g     o@N)round)rQ   j)dmaxdminr@   rA   rT   h  s       )r9   IAZDECODEr>   FTZ
DCT_DECODEZ
JPX_DECODEr;   Zgetbandsr3   r   r7   allrG   extendpoint)rX   r   r   r)   r?   Zlutr   r@   )r   r   r   rA   _apply_decodeG  s@    	
*

r   )r   rd   r)   r-   c                 C   s   t j| kr| t j tjkrd}| dddk rNt| dd ddd\}}n,t||dkrnt|snd|krnd	n|d\}}||fS )
Nr    z/BitsPerComponentrE   rJ   r   r   r
   ZGrayr   )r   ZCOLOR_SPACEr   Z
DEVICE_RGBr9   r:   r   )r   rd   r)   r>   r?   r@   r@   rA   _get_mode_and_invert_coloro  s.      
r   )r   )5__doc__sysior   typingr   r   r   r   r   r   r	   _utilsr   r   	constantsr   r   r   r   r   errorsr   r   Zgenericr   r   r   r   r   r   version_infor   Ztyping_extensionsZPILr   r   ImportErrorr'   __annotations__r(   r8   r4   boolr:   rH   rM   r[   rc   r{   r   r   r   r@   r@   r@   rA   <module>   s   $ 	
 
P 
 
p
'
)
  
