o
    jV                     @   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mZ ddl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raddlm Z  nddl!m Z  z
ddl"m#Z#m$Z$ W n e%y|   e%dw ed Z&e e'd< dZ(e)e'd< 	d7dee*e+e ef de)de&de)de,e&e-f f
ddZ.de/de,e)e)f de)de/fddZ0d e*de,e)e)f de/de#j#fd!d"Z1dede,eeeef fd#d$Z2de,e)e)f de/d e&dee*ef d%e)d&e*de,e#j#e*e*e-f fd'd(Z3de,e)e)f de/d e&de*d%e)de,e#j#e*e*e-f fd)d*Z4d+e#j#d,e5e*ef d-edee*e+e ef d.e-de#j#fd/d0Z6d,e5e*ef d%e)dee*e+e ef de,e&e-f fd1d2Z7	d8d3e5e*ef d4ee5e*ef df de,ee* e/ef fd5d6Z8dS )9z1Functions to convert an image XObject to an image    N)BytesIO)AnyLiteralOptionalUnioncast   )check_if_whitespace_onlylogger_warning)ColorSpacesStreamAttributes)FilterTypes)ImageAttributes)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           
      C   s  |t krtdt| rdS d}t| tr| }nt| ts"td| | s&dS | d dr8d| d dd	  }n| d d
krR| d  }tt	|d }|
dd}n~| d dkrs| d  }t||||d \}}|dv rod}||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	/ICCBased   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!   )1bitz/DeviceGraypalettez
/DeviceRGBr2   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 rH   b/var/www/html/fyndo/pharma/fyndo/venv/lib/python3.10/site-packages/pypdf/generic/_image_xobject.pyr>   *   s   


r>   datasizebitsc                 C   s   ddl m} |d |d  }||krtd| d| dt|}d|> d }d}d| }t|d D ]9}	|d| krC|d7 }d| }t|d D ]"}
| | |? |@ ||
|	|d   < ||8 }|dk rk|d7 }d| }qIq3t|S )Nr   )FLATE_MAX_BUFFER_SIZEr/   zRequested buffer size z exceeds limit of .   )pypdf.filtersrM   r   	bytearrayrangebytes)rJ   rK   rL   rM   buffer_sizebyte_buffermask
data_indexbityxrH   rH   rI   	bits2byte|   s*    r[   rD   c              
      s   z
t | ||}W |S  tyU } z?|d |d  }t|}|dkr'td||| dkr/||t|  |  d fdd|D }t | ||}W Y d }~|S d }~ww )Nr   r/   z9Data is 0 bytes, cannot process an image from empty data.    c                 3   s"    | ]}t |ft  V  qd S N)rS   r<   .0rZ   krH   rI   	<genexpr>   s     z-_extended_image_from_bytes.<locals>.<genexpr>)r   	frombytes
ValueErrorr?   r   join)rD   rK   rJ   imgexcnb_pixdata_lengthrH   r`   rI   _extended_image_from_bytes   s(   rj   c                 C   s   t | }|dkrdd | D \} }}}| |||fS | d }t|tr$|n| }|dkrNd|v rN| d  | d  } }|d\}}t|}| |||fS td	| d
|  )Nr-   c                 s   s    | ]}|  V  qd S r]   )r;   )r_   valuerH   rH   rI   rb      s    z*__handle_flate__indexed.<locals>.<genexpr>r/   r    r   r   z(Expected color space with 4 values, got z: )r?   r7   r8   r;   splitr<   r   )r(   countbasehivallookupelement1rH   rH   rI   __handle_flate__indexed   s   rs   colorsobj_as_textc                    s  d}d}t |tr|d dkrt|\}}}	|dkr$d}t|| d}n|dkr0d}t|| d	}t|| ||dkrt ttfrF t trNj	t t
rW zd
dd
dddt|ddd  \}
}}W n ty   td| dt dY n>w jdkrd|
 }t}||kr||k rt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|n|t|	d |
 krtd| t dnu|dkrddd D d }nc|d!krg }fd"dtdd	td	  d	D D ]A\}}}}td#d|d#   d|d#   }td#d|d#   d|d#   }td#d|d#   d|d#   }|t|||f q7d|d }durj|d$ |tjkrdnd n%t|s|d d%kr|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
    .png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 rN   z!Too many lookup values: Expected r\   c                 3   s6    | ] d   fddtjd D V  qdS )r\   c                 3   s.    | ]}  |fd krdnd V  qdS )   r/   r   N)getpixelr^   )
colors_arrrf   rY   rH   rI   rb      s
    
z*_handle_flate.<locals>.<genexpr>.<genexpr>r   N)re   rR   rK   )r_   )rz   rf   )rY   rI   rb      s    
z _handle_flate.<locals>.<genexpr>r/   zInvalid Lookup Table in r#   c                 S   s   g | ]	}t |||gqS rH   )rS   )r_   brH   rH   rI   
<listcomp>  s    z!_handle_flate.<locals>.<listcomp>r   r%   c                 3   s     | ]} ||d   V  qdS )r-   NrH   )r_   n)rq   rH   rI   rb     s    
   )rawmoder.   .tifTIFFF) r7   r   rs   r[   rj   r   r   get_datar   original_bytesr8   encoder>   KeyErrorr
   r@   rD   r?   rS   r	   re   rR   rK   r   rc   convertr<   append
putpaletter   DEVICE_GRAYr   )rK   rJ   rD   r(   rt   ru   	extensionimage_formatro   rp   nbconvexpected_countactual_countarr_rgb_c_m_y_k_r_g_bmode2rH   )rz   rf   rq   rI   _handle_flate   s   









   




r   c           
      C   s   d}t jt|d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=|}n|j|hddhkrQt ||j|	 }n|
|}|jdkrd|d
krd|
d}d}	||	||fS )zc
    Process image encoded as JPX/JPEG2000
    Returns img, image_format, extension, inversion
    .jp2)JPEG2000formatsr   r%   r$   r   r#   r"   r.   r   )r   openr   r>   r   r&   rD   rc   rK   tobytesr   )
rK   rJ   rD   r(   rt   r   img1rE   rf   r   rH   rH   rI   _handle_jpx-  s"   

r   rf   x_object_objlfiltersrE   c                    sX  t j|v r|t j  n;| jdkr(|tjkr(|sddgnddg  t|    n| jdkr2|tjks9|rD| jdkrDddgt|    nd  t|t	rU|d 
 dkrUd  t|t	rl|d 
 dkrlddgt|     d urt fdd	tt D sg }tdt d
D ]} |  |d  |fdd	tdD  q| |} | S )Nr%   g      ?g        r#   r   r0   r1   c                 3   s     | ]} | |d  kV  qdS )r   NrH   )r_   i)decoderH   rI   rb   q  s    z _apply_decode.<locals>.<genexpr>r   r/   c                 3   s,    | ]}t d |d       V  qdS )g     o@N)round)r_   j)dmaxdminrH   rI   rb   v  s    
   )IADECODErD   FT
JPX_DECODEr?   getbands
DCT_DECODEr7   r   r;   allrR   extendpoint)rf   r   r   r(   rE   lutr   rH   )r   r   r   rI   _apply_decodeR  s4   
	"&

r   c                 C   s   t j| v r| t j tjkrd}| dddk r*t| dd ddd\}}||fS t||dkr:t|s:d|vr:d	n|d\}}||fS )
Nr   z/BitsPerComponentrO   rX   r   r   r/   Grayr   )r   COLOR_SPACEr   
DEVICE_RGBr=   r>   r   )r   rt   r(   rD   rE   rH   rH   rI   _get_mode_and_invert_color}  s&   
r   x_objectpillow_parametersc                 C   s&  dt j dtttf dtdtdtdtt j ttf fdd}| d	u r%| j n|  }tt| t	j
 tt| t	j f}|  }t|trF| }t||d
 |d   dkr`|d dkr`|d	d }| dd}| dt  }t|trt|dkr|d
  }t| ||\}}	| tjt  }
t|
tr|
d n|
}| tj}|rt|ttfr|d
 }ni }t|tsi }d	}|tjtjfv rt||||||\}}}}n|tjtjfv r|tjkrd}d}nd}d}zt jt|dd}W n t y   t!|||}Y nw |tj"krt t|dd}}}nq|tj#kr,t$|||||\}}}}	n^|tj%krDt jt|dddddf\}}}}	nF|tj&kr\t jt|dddddf\}}}}	n.|dkrpt!|||dddf\}}}}	n|dkr|t'd|  t!|||dddf\}}}}	t(|| |||	}||| |||\}}}|d	u ri }|dkrd|_)d|vrd |d< t }z|j*|fd!|i| W n t+y   |,d"}d}d}t }|j*||d# Y nw |- }z	t t|}W n t.y } zt/d$| t0 d	}W Y d	}~nd	}~ww |||fS )%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]

    rf   r   ru   r   r   r,   c                 S   s   d }t j|v rPt|t j d }| j|jkrtd| t n$|jdkr)|d}| jdkr4| d} n
| jdkr>| d} | | d|v rLd}d	}nd
}d}| ||fS )Nr   z"image and mask size not matching: r#   r"   r   r   JPEGr   r   rw   rv   )	r   S_MASK_xobj_to_imagerK   r
   r@   rD   r   putalpha)rf   r   ru   r   r   alpharH   rH   rI   _apply_alpha  s(   








z$_xobj_to_image.<locals>._apply_alphaNr   r/   r   z/Colorsz/ColorSpacer   z.tiffrw   rv   )r   rw   r   r   z.jpg)r   F)rw   PPMr%   r   r   zColorSpace field not found in qualitykeepformatr$   )r   zFailed loading image: )1r   dictr8   r   tupleindirect_reference__repr__r   r<   r   WIDTHHEIGHTr   r7   r   r?   r=   r   r;   r9   r   r   FILTERDECODE_PARMSr   FLATE_DECODERUN_LENGTH_DECODEr   
LZW_DECODEASCII_85_DECODEr   r   r   rj   r   r   r   CCITT_FAX_DECODEJBIG2_DECODEr   r   r   saveOSErrorr   getvalue	Exceptionr
   r@   )r   r   r   ru   rK   rJ   rt   r(   rD   rE   filtersr   decode_parmsr   rf   r   _img_byte_arrr   	exceptionrH   rH   rI   r     s   

"
 
(














r   )r   r]   )9__doc__sysior   typingr   r   r   r   r   _utilsr	   r
   	constantsr   r   r   r   r   r   errorsr   r   r   genericr   r   r   r   r   r   version_infor   typing_extensionsPILr   r   ImportErrorr&   __annotations__r'   r<   r8   r9   r   boolr>   rS   r[   rj   rs   r   r   r   r   r   r   rH   rH   rH   rI   <module>   s     	

"R




s

%

+


 
