U
    Nf*                     @   s  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 ddlmZ dd	l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 ejdd
 dkrddlmZ nddlmZ zddl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!f e%ee"e!e"eeje"e"e#f dddZ&ee!e!f e%ee"e!eeje"e"e#f dddZ'dS )z9Code in here is only used by pypdf.filters._xobj_to_image    N)BytesIO)AnyListTupleUnioncast   )check_if_whitespace_onlylogger_warning)ColorSpaces)PdfReadError)ArrayObjectDecodedStreamObjectEncodedStreamObjectIndirectObject
NullObject   )      )Literal)r   
   )	TypeAlias)Imagez]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  } nj| d d	kr| d
  }tt	|d }|
dd} n4| d dkr| d
 } t| tr|  } t| |||d
 \}}|dkrd}||fS | d dkr8| d } t| tr|  } t| |||d
 \}}|dfS | d dkr| }t| d
 }| d } t| trr|  } | 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 }|
| pt| | 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 deep. If required, consider increasing MAX_IMAGE_MODE_NESTING_DEPTH.)r   FzCannot interpret colorspacer   z/Calz/Device   N	/ICCBasedr   z/Nz
/Alternater   /Indexed)r   r!   r   z/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
/DeviceRGBr,   Z2bitZ4bit)r#   r   
isinstancer   strlist
startswith
get_objectr   intgetr   _get_imagemodelenr
   __name__values)
r$   r%   r&   r'   Zicc_profilemode2invert_colorZoriginal_color_spaceZmode_mapmode r;   =/tmp/pip-unpacked-wheel-zevpxvmc/pypdf/_xobj_image_helpers.pyr4   .   s    


 
         
r4   )sizedatar:   r$   colorsobj_as_textr(   c                    s  t tttf tt ddd}d}d}t|trP|d dkrPdd	 |D \}}	}
|d
krjd}||| d}n|dkrd}||| d}t|| ||dkr^ddlm} tt	t
fr t|r̈jttrވ z*ddddddt|	ddd  \}}}W n. tk
r6   td|	 dt dY qX jdkr
d| }t|krt|k rtd| dt dt|d std| dt d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rdd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	rBj|d) |	tjkrVd#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
    )r>   r=   bitsr(   c           	      S   s   d|> d }t |d |d  }d}d| }t|d D ]z}|dkr`|d| kr`|d7 }d| }t|d D ]D}| | |? |@ |||d  | < ||8 }|dk rl|d7 }d| }qlq8t|S )Nr   r   r   r   )	bytearrayrangebytes)	r>   r=   rA   maskZnbuffZbybityxr;   r;   r<   	bits2byte   s     z _handle_flate.<locals>.bits2bytez.pngZPNGr   r+   c                 s   s   | ]}|  V  qd S )N)r1   ).0valuer;   r;   r<   	<genexpr>   s     z _handle_flate.<locals>.<genexpr>r   r   r   r   r)   r   )TextStringObject)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     c                    s2   g | ]* d   fddtjd D qS )rO   c                    s*   g | ]"}  |fd kr dnd qS )   r   r   )Zgetpixel)rJ   rH   )
colors_arrimgrG   r;   r<   
<listcomp>   s   z,_handle_flate.<locals>.<listcomp>.<listcomp>r   )joinrC   r=   )rJ   )rQ   rR   )rG   r<   rS      s   z!_handle_flate.<locals>.<listcomp>zInvalid Lookup Table in r   c                 S   s   g | ]}t |||gqS r;   )rD   )rJ   br;   r;   r<   rS      s     r   r!   c                 3   s   | ]} ||d   V  qdS )r)   Nr;   )rJ   n)lookupr;   r<   rL      s       )rawmoder*   z.tifZTIFFF) rD   r   r2   r-   r   r   	frombytesgenericrM   r   r   get_dataoriginal_bytesr.   encoder4   KeyErrorr
   r6   r:   r5   r   r	   rT   rC   r=   convertappendZ
putpaletter   ZDEVICE_GRAYr   )r=   r>   r:   r$   r?   r@   rI   	extensionimage_formatbaseZhivalrM   nbconvZexpected_countZarrZ_rgbZ_c_mZ_yZ_k_rZ_g_br8   r;   )rQ   rR   rW   r<   _handle_flate   s    







   



rj   )r=   r>   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}z(|j|krzt ||j|	 }n|}W n( t
k
r   t ||j|	 }Y nX |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!   rk   )r   openr   r4   r   r"   r:   rZ   r=   tobytesOSErrorr`   )
r=   r>   r:   r$   r?   rb   Zimg1r9   rR   rc   r;   r;   r<   _handle_jpx  s$    


rp   )r   )(__doc__sysior   typingr   r   r   r   r   _utilsr	   r
   	constantsr   errorsr   r[   r   r   r   r   r   version_infor   Ztyping_extensionsr   ZPILr   ImportErrorr"   __annotations__r#   r2   r.   boolr4   rD   rj   rp   r;   r;   r;   r<   <module>   s^   
 
S
 
