U
    <g6                     @   sJ  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)f e-e&e*e)e*e	e#j#e*e*e+f ddd Z0e	e)e)f e-e&e*e)e	e#j#e*e*e+f d!d"d#Z1e#j#ee*ef ee
e*ee ef e+e#j#d$d%d&Z2ee*ef e)e
e*ee ef e	e&e+f d'd(d)Z3d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IndirectObject
NullObjectTextStringObject   )   
   )	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| trdS t| tr,nt| tsDtd| n| d drjd| 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| tr|  } t| |||d
 \}}|dfS | d dkr| }t| d
 }| d } t| trd|  } | 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   FzCannot interpret color spacer   z/Calz/Device   N	/ICCBasedr
   z/Nz
/Alternater   /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   
isinstancer   strlist
startswith
get_objectr	   intget_get_imagemoder   lenr   __name__values)	r)   r*   r+   r,   Zicc_profilemodeinvert_colorZoriginal_color_spaceZmode_map r@   =/tmp/pip-unpacked-wheel-wu2fni14/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   	bits2byte}   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[   )rC   rB   r>   r)   colorsobj_as_textr-   c                    s  d}d}t |tr4|d dkr4dd |D \}}}	|dkrNd}t|| d	}n|d
krfd}t|| d}t|| ||dkrHt 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 rnt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rNd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 qd|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   c                 s   s   | ]}|  V  qd S rO   )r7   )rQ   valuer@   r@   rA   rT      s     z _handle_flate.<locals>.<genexpr>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   )ra   rX   )rK   rA   rT      s   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)lookupr@   rA   rT      s       )rawmoder/   z.tifZTIFFF)r3   r   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)   r\   r]   	extensionimage_formatbaseZhivalnbconvZexpected_countZactual_countZarrZ_rgbZ_c_mZ_yZ_k_rZ_g_bZmode2r@   )ra   rX   re   rA   _handle_flate   s    









   



rv   )rC   rB   r>   r)   r\   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&   rw   )r   openr   r:   r	   r'   r>   rU   rC   tobytesrl   )
rC   rB   r>   r)   r\   rn   Zimg1r?   rX   ro   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   T  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   Y  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_decode8  s@    	
*

r   )r|   r\   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rpt|tspd|krpd	n|d\}}||fS )
Nr    z/BitsPerComponentrE   rJ   r   r   r
   ZGrayr   )r   ZCOLOR_SPACEr   Z
DEVICE_RGBr9   r:   r3   r   )r|   r\   r)   r>   r?   r@   r@   rA   _get_mode_and_invert_color`  s.      
r   )r   )4__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[   rv   r{   r   r   r@   r@   r@   rA   <module>   s~   $ 	
 
S 
 
p
'
)
  
