a
    còfôå  ã                
   @   s˜  d Z dZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZ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m Z m!Z!m"Z" dd
l#m$Z$m%Z%m&Z& ddl#m'Z( ddl#m)Z* ddl#m+Z, ddl#m-Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZD ddlmEZEmFZF ejGdk�r‚ddl	mHZH nddlImHZH e JeK¡ZLdZMe Nd¡ZOG dd„ dee
 e;ƒZPG dd„ dee
e
f e;ƒZQG dd„ deQƒZRe
ddœd d!„ZSG d"d#„ d#eQƒZTG d$d%„ d%eTƒZUG d&d'„ d'eTƒZVG d(d)„ d)eUƒZWd1eee edeXeeX eeYeXf f ee;eYeXeWf d*œd+d,„ZZG d-d.„ d.eRƒZ[G d/d0„ d0eRƒZ\dS )2zMathieu Fenniakzbiziqe@mathieu.fenniak.neté    N)ÚBytesIO)Úceil)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSequenceÚSetÚTupleÚUnionÚcasté   )ÚPdfReaderProtocolÚPdfWriterProtocolÚXmpInformationProtocol)	ÚWHITESPACESÚ
StreamTypeÚb_Údeprecate_no_replacementÚdeprecate_with_replacementÚlogger_warningÚread_non_whitespaceÚread_until_regexÚskip_over_comment)ÚCheckboxRadioButtonAttributesÚFieldDictionaryAttributesÚOutlineFontFlag)ÚFilterTypes)ÚStreamAttributes)ÚTypArguments)ÚTypFitArguments)ÚSTREAM_TRUNCATED_PREMATURELYÚPdfReadErrorÚPdfStreamErroré   )	ÚBooleanObjectÚByteStringObjectÚFloatObjectÚIndirectObjectÚ
NameObjectÚ
NullObjectÚNumberObjectÚ	PdfObjectÚTextStringObject)ÚFit)Úextract_inline_A85Úextract_inline_AHxÚextract_inline_DCTÚextract_inline_defaultÚextract_inline_RL)Úread_hex_string_from_streamÚread_string_from_stream)é   é   )ÚSelfs   +-s   [+-]?(\d+)\s+(\d+)\s+R[^a-zA-Z]c                   @   sÜ   e Zd Zdeeeeeee	f   d dœdd„Z
ee dœdd„Zeee d	œd
d„Zed d	œdd„Zeed	œdd„Zeed	œdd„Zdeedeef ddœdd„Zedeee edeee ee	ef f d dœdd„ƒZdS )ÚArrayObjectF© ©Úpdf_destÚforce_duplicateÚignore_fieldsÚreturnc                 C   s¬   z| j j|kr|s| W S W n ty,   Y n0 td|  tƒ ||¡ƒ}| D ]^}t|tƒr|| | |||¡||¡}| 	|j ¡ qHt
|dƒrœ| 	| |||¡¡ qH| 	|¡ qH|S )úClone object into pdf_dest.r;   Úclone)Úindirect_referenceÚpdfÚ	Exceptionr   Ú_reference_cloner;   Ú
isinstanceÚStreamObjectrC   ÚappendÚhasattr)Úselfr>   r?   r@   ÚarrÚdataÚdupr<   r<   ú[/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pypdf/generic/_data_structures.pyrC   i   s*    
þ
ý
zArrayObject.clone©rA   c                 C   s   t | ƒS )z:Emulate DictionaryObject.items for a list (index, object).)Ú	enumerate©rL   r<   r<   rP   Úitems‡   s    zArrayObject.items)ÚlstrA   c                 C   sr   t |tttfƒrn\t |tƒr$|g}nJt |tƒrR|d dkrFt|ƒg}qnt|ƒg}nt |tƒrht	|ƒg}n|g}|S )Nr   ú/)
rH   ÚlistÚtupleÚsetr.   Ústrr+   r/   Úbytesr(   ©rL   rU   r<   r<   rP   Ú_to_lst‹   s    


zArrayObject._to_lstc                 C   s   t | ƒ}| |  |¡¡ |S )aÆ  
        Allow extension by adding list or add one element only

        Args:
            lst: any list, tuples are extended the list.
            other types(numbers,...) will be appended.
            if str is passed it will be converted into TextStringObject
            or NameObject (if starting with "/")
            if bytes is passed it will be converted into ByteStringObject

        Returns:
            ArrayObject with all elements
        )r;   Úextendr]   )rL   rU   Útempr<   r<   rP   Ú__add__œ   s    zArrayObject.__add__c                 C   s   |   |  |¡¡ | S )a‹  
         Allow extension by adding list or add one element only

        Args:
            lst: any list, tuples are extended the list.
            other types(numbers,...) will be appended.
            if str is passed it will be converted into TextStringObject
            or NameObject (if starting with "/")
            if bytes is passed it will be converted into ByteStringObject
        )r^   r]   r\   r<   r<   rP   Ú__iadd__®   s    zArrayObject.__iadd__c              	   C   s<   |   |¡D ],}z|  |¡}| |= W q
 ty4   Y q
0 q
| S )zAllow to remove items)r]   ÚindexÚ
ValueError)rL   rU   Úxr<   r<   rP   Ú__isub__¼   s    

zArrayObject.__isub__N©ÚstreamÚencryption_keyrA   c                 C   sH   |d urt ddƒ | d¡ | D ]}| d¡ | |¡ q | d¡ d S )Nú/the encryption_key parameter of write_to_streamú5.0.0ó   [ó    s    ])r   ÚwriteÚwrite_to_stream)rL   rg   rh   rN   r<   r<   rP   rn   Æ   s    ÿ

zArrayObject.write_to_stream©rg   rE   Úforced_encodingrA   c                 C   s‚   t ƒ }|  d¡}|dkr tdƒ‚|  d¡}| ¡ r>|  d¡}q*|  dd¡ |  d¡}|dkr^q~|  dd¡ | t| ||ƒ¡ q |S )Nr&   rk   zCould not read arrayéÿÿÿÿó   ])r;   Úreadr$   ÚisspaceÚseekrJ   Úread_object)rg   rE   rp   rM   ÚtmpÚtokZ
peek_aheadr<   r<   rP   Úread_from_streamÓ   s    


zArrayObject.read_from_stream)Fr<   )N)N)Ú__name__Ú
__module__Ú__qualname__r   Úboolr	   r
   r   rZ   ÚintrC   r   r   rT   r   r]   r`   r:   ra   re   r   r[   rn   Ústaticmethodr   r   ry   r<   r<   r<   rP   r;   h   s4     üû ÿþ ýür;   c                   @   s.  e Zd Zd eeeeeee	f   d dœdd„Z
d eeeeeee	f   eee	e	f  ddœdd	„Zeed
œdd„Zd!eeedœdd„Zeeedœdd„Zd"eee edœdd„Zeed
œdd„Zeee dœdd„ƒZd#eedeef ddœdd„Zed$eee edeee ee	ef f d dœdd„ƒZdS )%ÚDictionaryObjectFr<   r=   c                 C   s~   z| j j|kr|s| W S W n ty,   Y n0 tƒ }td|  |  ¡ ||¡ƒ}|du rXg }t| ¡ ƒdkrz| 	| ||||¡ |S )rB   r€   Nr   )
rD   rE   rF   rY   r   rG   Ú	__class__ÚlenÚkeysÚ_clone©rL   r>   r?   r@   ÚvisitedZd__r<   r<   rP   rC   î   s    
þzDictionaryObject.cloneN©Úsrcr>   r?   r@   r†   rA   c              
      sÎ  d}ˆ dusJ ‚t ˆ ƒ‰ |tˆ ƒk rntˆ | tƒrdttˆ | ƒdkrTˆ |= ˆ |= qnˆ |  d8  < |d7 }qt‡ ‡fdd„dD ƒƒ�r.t ˆ ƒ‰ dD �]–}|D �]Š}g }	|ˆv rž|| vržtˆ |¡tƒržtˆ| tƒržˆ 	dd¡du �s&ttˆ| ƒ 	dd¡du �s&ˆ 	dd¡ttˆ| ƒ 	dd¡kržtd	ˆ| ƒ}
| }|
du�rtd	|
 
|
 ¡ ||¡ƒ}|jdu�rš|jj}|jj}||f|v �rŒd}
�q| ||f¡ |	 |
|f¡ |du�s¶J ‚|j|t|ƒ< |}z"|
ˆk�rÚd}
ntd	|
| ƒ}
W n t�y   d}
Y n0 �q8|	D ]\}}| |||ˆ |¡ �qqžq”ˆ ¡ D ]’\}}|ˆ v�r6t|tƒ�r–t|d
ƒ�sfd|_| ||ˆ ¡}|jdu�s„J ‚|j| | |¡< n0|| v�r6t|dƒ�rº| ||ˆ ¡n|| t|ƒ< �q6dS )z¯
        Update the object from src.

        Args:
            src: "DictionaryObject":
            pdf_dest:
            force_duplicate:
            ignore_fields:
        r   Nr&   c                 3   sˆ   | ]€}|ˆ vo~|ˆv o~t ˆ |¡tƒo~t ˆ| tƒo~ˆ d d¡du p~ttˆ| ƒ d d¡du p~ˆ d d¡ttˆ| ƒ d d¡kV  qdS )ú/TypeN)rH   Úraw_getr*   r€   Úgetr   )Ú.0Úfield©r@   rˆ   r<   rP   Ú	<genexpr>&  s   öÿþýÿ
ÿz*DictionaryObject._clone.<locals>.<genexpr>)ú/Nextú/Prevú/Nú/V))r�   r‘   )r’   r“   r‰   r€   rD   rC   )rW   r‚   rH   r~   r   ÚanyrŠ   r*   r€   r‹   rG   r�   rD   ÚidnumÚ
generationÚaddrJ   r+   rF   r„   rT   rI   rK   rC   )rL   rˆ   r>   r?   r@   r†   rd   rU   ÚkÚobjsZcur_objZprev_objZclonr•   r–   ÚsÚcÚvÚvvr<   rŽ   rP   r„     sž    
õ


ÿþýüø	÷

ÿöÿ

ÿþ

ÿ

ÿýzDictionaryObject._clone)ÚkeyrA   c                 C   s   t  | |¡S ©N)ÚdictÚ__getitem__©rL   rž   r<   r<   rP   rŠ   w  s    zDictionaryObject.raw_get)rž   ÚdefaultrA   c                 C   s\   || v r| | S zd| vr |W S t dƒ‚W n, t yV   td| d  ¡ ƒ ||¡ Y S 0 dS )a=  
        Returns the value of a key or from the parent if not found.
        If not found returns default.

        Args:
            key: string identifying the field to return

            default: default value to return

        Returns:
            Current key or inherited one, otherwise default value.
        ú/Parentznot presentr€   N)ÚKeyErrorr   Ú
get_objectÚget_inherited)rL   rž   r£   r<   r<   rP   r§   z  s    ÿzDictionaryObject.get_inherited)rž   ÚvaluerA   c                 C   s2   t |tƒstdƒ‚t |tƒs$tdƒ‚t | ||¡S ©Nzkey must be PdfObjectzvalue must be PdfObject)rH   r.   rc   r    Ú__setitem__©rL   rž   r¨   r<   r<   rP   rª   ’  s
    

zDictionaryObject.__setitem__c                 C   s2   t |tƒstdƒ‚t |tƒs$tdƒ‚t | ||¡S r©   )rH   r.   rc   r    Ú
setdefaultr«   r<   r<   rP   r¬   ™  s
    

zDictionaryObject.setdefaultc                 C   s   t  | |¡ ¡ S rŸ   )r    r¡   r¦   r¢   r<   r<   rP   r¡      s    zDictionaryObject.__getitem__rQ   c                 C   sN   ddl m} |  dd¡}|du r$dS | ¡ }t||ƒsJ||ƒ}|| tdƒ< |S )u©  
        Retrieve XMP (Extensible Metadata Platform) data relevant to the this
        object, if available.

        See Table 347 â€” Additional entries in a metadata stream dictionary.

        Returns:
          Returns a :class:`~pypdf.xmp.XmpInformation` instance
          that can be used to access XMP metadata from the document. Can also
          return None if no metadata was found on the document root.
        r   )ÚXmpInformationz	/MetadataN)Úxmpr­   r‹   r¦   rH   r+   )rL   r­   Úmetadatar<   r<   rP   Úxmp_metadata£  s    
zDictionaryObject.xmp_metadatarf   c                 C   s�   |d urt ddƒ | d¡ t|  ¡ ƒD ]X\}}t|ƒdkrV|d dkrV|d dkrVq(| ||¡ | d¡ | |¡ | d	¡ q(| d
¡ d S )Nri   rj   ó   <<
r   r&   ú%rq   rl   ó   
ó   >>)r   rm   rW   rT   r‚   rn   )rL   rg   rh   rž   r¨   r<   r<   rP   rn   ¼  s    ÿ
$

z DictionaryObject.write_to_streamro   c              
      sþ  t t tt  tt dœdd„‰ tttdœ‡ fdd„}|  d¡}|dkrZtd	t|  ¡ ƒ› d
�ƒ‚i }t	| ƒ}|dkrrq^n|dkr�|  
dd¡ t| ƒ q^|sœttƒ‚|dkr²|  d¡ �q¨|  
dd¡ z.t| |ƒ}t	| ƒ}|  
dd¡ t| ||ƒ}W nf t�yR }	 zL|d u�r|j�rt|	 ¡ ƒ‚t|	 ¡ tƒ tƒ }
|
 |¡ |
W  Y d }	~	S d }	~	0 0 | |¡�sj|||< q^dt|  ¡ ƒ› d|› �}|d u�rœ|j�rœt|ƒ‚t|tƒ q^|  ¡ }t	| ƒ}|dk�rÆ|  d¡dk�rÆ|  d¡}|dk�rô|  d¡}�qÜ|dv�rtdƒ‚|dk�r,|  d¡dk�r,|  
dd¡ tj|v�rz|d u�rT|j�rTtdƒ‚ntd|  ¡ › �tƒ tdƒ|ttjƒ< |tj }t|tƒ�r¼|  ¡ }|d u�s¦J ‚| |¡}|  
|d¡ |d u �rÊd}|  ¡ }|dk�rì|  |¡|d< nt| t  d¡ƒ|d< t	| ƒ}|  d¡}|| dk�rÒ|  ¡ }|  
d d¡ |  d!¡}|dk�r^|d d d… |d< nf|d u�r”|j�s”|  
|d¡ || |ƒ|d< |  ¡ }n0|  
|d¡ td"t|  ¡ ƒ› d#|›d$|›d%�ƒ‚n|  
|d¡ d|v �ræt! "|¡S tƒ }
|
 |¡ |
S d S )&N)ÚpÚp1Úrem_gensrE   rA   c              	      sV   ˆ}|D ]H}|j | }z&t|t‡ ‡fdd„| ¡ D ƒƒƒ}W q tyN   Y q0 q|S )Nc                    s(   g | ] }ˆ |  k rˆkrn q|‘qS r<   r<   ©rŒ   rd   ©rµ   r¶   r<   rP   Ú
<listcomp>Ú  ó    zODictionaryObject.read_from_stream.<locals>.get_next_obj_pos.<locals>.<listcomp>)ÚxrefÚminÚvaluesrc   )rµ   r¶   r·   rE   ÚoutÚgenÚlocr<   r¹   rP   Úget_next_obj_posÓ  s    
&z;DictionaryObject.read_from_stream.<locals>.get_next_obj_pos)rg   rE   rA   c                    sz   ˆ |   ¡ dt|jƒ|ƒd }|   ¡ }|  ||   ¡  ¡}| d¡}|dk rXtd|› d�ƒ‚|  || d ¡ |d |d … S )Nl        r&   ó	   endstreamr   z6Unable to find 'endstream' marker for obj starting at Ú.é	   )ÚtellrW   r¼   rs   Úfindr$   ru   )rg   rE   ZeonÚcurrÚrwrµ   ©rÂ   r<   rP   Úread_unsized_from_streamß  s    

ÿzCDictionaryObject.read_from_stream.<locals>.read_unsized_from_streamr   ó   <<zDictionary read error at byte z: stream must begin with '<<'ó    ó   %rq   r&   ó   >z+Multiple definitions in dictionary at byte z	 for key ó   sé   s   treamrl   )r³   ó   z)Stream data must be followed by a newlinerÒ   r³   zStream length not definedzStream length not defined @pos=r   Ú__streamdata__rÃ   é   iöÿÿÿrÅ   z7Unable to find 'endstream' marker after stream at byte z (nd='z', end='z').)#r~   r   r   r   r[   rs   r$   ÚhexrÆ   r   ru   r   r%   r#   rv   rF   ÚstrictÚ__repr__r   rz   r€   Úupdater‹   ÚSAÚLENGTHr-   r+   rH   r*   r¦   r   ÚreÚcompilerI   Úinitialize_from_dictionary)rg   rE   rp   rË   rw   rN   rx   rž   r¨   ÚexcÚretvalÚmsgÚposrš   ÚeolÚlengthÚtZpstartÚeZndstreamÚendr<   rÊ   rP   ry   Í  sÖ    þþ
ÿ




ÿÿÿ



ÿ




ÿ




ÿÿÿÿ


z!DictionaryObject.read_from_stream)Fr<   )N)N)N)N) rz   r{   r|   r   r}   r	   r
   r   rZ   r~   rC   r   r   r„   r   rŠ   r§   rª   r¬   r.   r¡   Úpropertyr   r°   r   r[   rn   r   r   r   r   ry   r<   r<   r<   rP   r€   í   sF     üûùq ÿþ ýür€   c                   @   s  e Zd Zd&ee ddœdd„Zedœdd„Zedœdd	„Ze	dœd
d„Z
ee	 dœdd„Ze	eddœdd„Zeded f eddœdd„Zeded f eddœdd„Zd'e	e	eeede	f  edœdd„Ze	e	e	e	ddœdd„Ze	ddœdd„Zddœd d!„Zddœd"d#„Zddœd$d%„ZdS )(Ú
TreeObjectN)ÚdctrA   c                 C   s   t  | ¡ |r|  |¡ d S rŸ   )r€   Ú__init__rØ   )rL   ré   r<   r<   rP   rê   e  s    
zTreeObject.__init__rQ   c                 C   s   t dddƒ |  ¡ S )NÚhasChildrenÚhas_childrenú4.0.0)r   rì   rS   r<   r<   rP   rë   j  s    zTreeObject.hasChildrenc                 C   s   d| v S )Nú/Firstr<   rS   r<   r<   rP   rì   n  s    zTreeObject.has_childrenc                 C   s   |   ¡ S rŸ   )ÚchildrenrS   r<   r<   rP   Ú__iter__q  s    zTreeObject.__iter__c                 c   sb   |   ¡ sd S | tdƒ }| ¡ }|V  || tdƒ kr:d S | tdƒ¡}|d u rTd S | ¡ }q d S )Nrî   ú/Lastr�   )rì   r+   r¦   r‹   )rL   Z	child_refÚchildr<   r<   rP   rï   t  s    zTreeObject.children)rò   rE   rA   c                 C   s   |   |d |¡ d S rŸ   )Úinsert_child)rL   rò   rE   r<   r<   rP   Ú	add_childƒ  s    zTreeObject.add_child)ÚparentÚnrA   c                 C   sb   |d u rd S t d| ¡ ƒ}d|v r^ttdt t|tdƒ ƒ| ƒƒ|tdƒ< |  | dd ¡|¡ d S )Nrè   ú/Countr   r¤   )r   r¦   r-   Úmaxr~   r+   Úinc_parent_counter_defaultr‹   )rL   rõ   rö   r<   r<   rP   rù   †  s    ÿz%TreeObject.inc_parent_counter_defaultc                 C   sŒ   |d u rd S t d| ¡ ƒ}| dd¡dk}t t| dd¡ƒ}|dk rLt|ƒ}t|| |r\dnd ƒ|tdƒ< |std S |  | dd ¡|¡ d S )	Nrè   z
/%is_open%Tr÷   r   r&   rq   r¤   )r   r¦   r‹   r~   Úabsr-   r+   Úinc_parent_counter_outline)rL   rõ   rö   Zopnr›   r<   r<   rP   rû   ’  s     z%TreeObject.inc_parent_counter_outline.)rò   ÚbeforerE   Úinc_parent_counterrA   c                 C   s®  |d u r| j }| ¡ }|j}d| vrŒ|| tdƒ< tdƒ| tdƒ< || tdƒ< | j|tdƒ< || | dd¡ƒ d|v rz|d= d|v rˆ|d= |S td	| d ƒ}|j|k�rd|v r¾td
|d ƒ}qštd
|ƒ|tdƒ< |j|tdƒ< | j|tdƒ< d|v rú|d= || tdƒ< || | dd¡ƒ |S qšz8t|d tƒ�s4J ‚||d tdƒ< |d |tdƒ< W n t	�yp   |d= Y n0 ||tdƒ< ||tdƒ< | j|tdƒ< || | dd¡ƒ |S )Nrî   r   r÷   rñ   r¤   r&   r�   r‘   r€   rè   )
rù   r¦   rD   r+   r-   r‹   r   rH   r€   rF   )rL   rò   rü   rE   rý   Ú	child_objÚprevr<   r<   rP   ró   ¢  sL    zTreeObject.insert_child)rÿ   Úprev_refÚcurÚlastrA   c                 C   sò   |  tdƒd¡}|du rŠ|rX| ¡ }|tdƒ= || tdƒ< t| tdƒ d ƒ| tdƒ< qîtdƒ| tdƒ< | tdƒ= tdƒ| v rî| tdƒ= nd|r°| ¡ }||tdƒ< ||tdƒ< n"||ks¼J ‚|tdƒ= || tdƒ< t| tdƒ d ƒ| tdƒ< dS )	z§
        Adjust the pointers of the linked list and tree node count.

        Args:
            prev:
            prev_ref:
            cur:
            last:
        r�   Nr‘   rî   r÷   r&   r   rñ   )r‹   r+   r¦   r-   )rL   rÿ   r   r  r  Znext_refZnext_objr<   r<   rP   Ú_remove_node_from_treeÕ  s*    
ÿ

z!TreeObject._remove_node_from_tree)rò   rA   c           
      C   sâ   |  ¡ }|j}tdƒ|vr$tdƒ‚n|tdƒ | kr<tdƒ‚d}d }d }| tdƒ }|  ¡ }| tdƒ }|  ¡ }	|d urÊ||kr–|  ||||	¡ d}qÊ|}|}tdƒ|v rÀ|tdƒ }|  ¡ }qpd }d }qp|sÖtd	ƒ‚t|ƒ d S )
Nr¤   ú/Removed child does not appear to be a tree itemz*Removed child is not a member of this treeFrî   rñ   Tr�   z"Removal couldn't find item in tree)r¦   rD   r+   rc   r  Ú_reset_node_tree_relationship)
rL   rò   rþ   Úfoundr   rÿ   Zcur_refr  Zlast_refr  r<   r<   rP   Úremove_childÿ  s8    

zTreeObject.remove_childc                 C   s.   t dƒ| vrtdƒ‚ntd| d ƒ | ¡ dS )z)Remove the object from the tree it is in.r¤   r  rè   N)r+   rc   r   r  rS   r<   r<   rP   Úremove_from_tree$  s    
zTreeObject.remove_from_treec                 C   s   t dddƒ |  ¡  d S )NÚ	emptyTreeÚ
empty_treerí   )r   r
  rS   r<   r<   rP   r	  +  s    zTreeObject.emptyTreec                 C   s`   | D ]}|  ¡ }t|ƒ qtdƒ| v r0| tdƒ= tdƒ| v rF| tdƒ= tdƒ| v r\| tdƒ= d S )Nr÷   rî   rñ   )r¦   r  r+   )rL   rò   rþ   r<   r<   rP   r
  /  s    


zTreeObject.empty_tree)N)N)rz   r{   r|   r	   r€   rê   r}   rë   rì   r   rð   r   rï   r   rô   r   r*   r~   rù   rû   r   ró   r  r  r  r	  r
  r<   r<   r<   rP   rè   d  s6   þþ ûú4þ*%rè   )rþ   rA   c                 C   s:   | t dƒ= t dƒ| v r | t dƒ= t dƒ| v r6| t dƒ= dS )z›
    Call this after a node has been removed from a tree.

    This resets the nodes attributes in respect to that tree.

    Args:
        child_obj:
    r¤   r�   r‘   N)r+   )rþ   r<   r<   rP   r  <  s
    	

r  c                       s  e Zd Zddœdd„Zeeeeee	e
ef   eeeef  ddœ‡ fdd„Ze	ee
f dœdd	„Zedd
œdd„Zedœ‡ fdd„Zdee	de
ef ddœdd„Zeee
ef e	d d
œdd„ƒZeee
ef e	d d
œdd„ƒZdeddœdd„Zedœdd„Z‡  ZS ) rI   NrQ   c                 C   s   d| _ d | _d S ©Nr»   )Ú_dataÚdecoded_selfrS   r<   r<   rP   rê   M  s    zStreamObject.__init__r‡   c                    sp   t d|ƒj| _z6t d|ƒj}|du r,d| _nt d| |||¡ƒ| _W n tyV   Y n0 tƒ  |||||¡ dS )ú›
        Update the object from src.

        Args:
            src:
            pdf_dest:
            force_duplicate:
            ignore_fields:
        rI   NÚDecodedStreamObject)r   r  r  rC   rF   Úsuperr„   )rL   rˆ   r>   r?   r@   r†   r  ©r�   r<   rP   r„   Q  s    þ
zStreamObject._clonec                 C   s   | j S rŸ   ©r  rS   r<   r<   rP   Úget_datap  s    zStreamObject.get_data©rN   rA   c                 C   s
   || _ d S rŸ   r  ©rL   rN   r<   r<   rP   Úset_datas  s    zStreamObject.set_datac                    s   t ƒ  ¡ }|t| jƒ7 }|S rŸ   )r  Úhash_value_datar   r  r  r  r<   rP   r  v  s    
zStreamObject.hash_value_datarf   c                 C   sb   |d urt ddƒ tt| jƒƒ| ttjƒ< t | |¡ | tj= | 	d¡ | 	| j¡ | 	d¡ d S )Nri   rj   s   
stream
s
   
endstream)
r   r-   r‚   r  r+   rÙ   rÚ   r€   rn   rm   ©rL   rg   rh   r<   r<   rP   rn   {  s    ÿ
zStreamObject.write_to_stream)ÚEncodedStreamObjectr  c                 C   s   t dddƒ t | ¡S )NÚinitializeFromDictionaryrÝ   rj   )r   rI   rÝ   )rN   r<   r<   rP   r  ‰  s    ÿz%StreamObject.initializeFromDictionaryc                 C   s>   t j| v rtƒ }ntƒ }| d |_| d= | t j= | | ¡ |S )NrÓ   )rÙ   ÚFILTERr  r  r  rÚ   rØ   )rN   rß   r<   r<   rP   rÝ   ’  s    


z'StreamObject.initialize_from_dictionaryrq   r  )ÚlevelrA   c              	   C   s  ddl m} tj| v r¼| tj }t|tƒrŽtttjƒg|¢ƒ}z tt	ƒ g|  
tjtƒ ¡¢ƒ}W qº tyŠ   tt	ƒ |  
tjtƒ ¡gƒ}Y qº0 qÊtttjƒ|gƒ}tt	ƒ |  
tjt	ƒ ¡gƒ}nttjƒ}d }tƒ }| | ¡ ||ttjƒ< |d urþ||ttjƒ< | t| jƒ|¡|_|S )Nr   ©ÚFlateDecode)Úfiltersr  rÙ   r  rH   r;   r+   ÚFTÚFLATE_DECODEr,   r‹   ÚDECODE_PARMSÚ	TypeErrorr  rØ   Úencoder   r  )rL   r  r  ÚfÚparamsrß   r<   r<   rP   Úflate_encode¡  s4    


ÿÿÿ

zStreamObject.flate_encodec                 C   sv   ddl m} |  dd¡dkrXz| j› d�}W n  tyL   |  ¡ › d�}Y n0 t|tƒ || ƒ\}}}|du rrdS |S )	a}  
        Try to decode the stream object as an image

        Returns:
            a PIL image if proper decoding has been found
        Raises:
            Exception: (any)during decoding to to invalid object or
                errors during decoding will be reported
                It is recommended to catch exceptions to prevent
                stops in your program.
        r   )Ú_xobj_to_imagez/SubtypeÚ z/Imagez does not seem to be an Imagez$ object does not seem to be an ImageN)r  r(  r‹   rD   ÚAttributeErrorr×   r   rz   )rL   r(  rà   Ú	extensionZbyte_streamÚimgr<   r<   rP   Údecode_as_imageÁ  s    
zStreamObject.decode_as_image)N)rq   )rz   r{   r|   rê   r€   r   r}   r	   r
   r   rZ   r~   r   r   r„   r[   r  r  r  r   rn   r   r   r   r  rÝ   r'  r-  Ú__classcell__r<   r<   r  rP   rI   L  s4   ù ÿþ
þ
þ rI   c                   @   s   e Zd ZdS )r  N)rz   r{   r|   r<   r<   r<   rP   r  Û  s   r  c                       sH   e Zd Zddœdd„Zeeef dœdd„Zeddœ‡ fdd	„Z‡  Z	S )
r  NrQ   c                 C   s
   d | _ d S rŸ   )r  rS   r<   r<   rP   rê   à  s    zEncodedStreamObject.__init__c                 C   s|   ddl m} | jd ur | j ¡ S tƒ }| t|| ƒƒ¡ t|  ¡ ƒD ]$\}}|t	j
t	jt	jfvrD|||< qD|| _| ¡ S d S )Nr   )Údecode_stream_data)r  r/  r  r  r  r  r   rW   rT   rÙ   rÚ   r  r"  )rL   r/  Údecodedrž   r¨   r<   r<   rP   r  ä  s    


zEncodedStreamObject.get_datar  c                    sl   ddl m} |  tjd¡tjkr`t|tƒs2t	dƒ‚| j
d us@J ‚| j
 |¡ tƒ  | |¡¡ ntdƒ‚d S )Nr   r  r)  zdata must be byteszLStreams encoded with different filter from only FlateDecode is not supported)r  r  r‹   rÙ   r  r   r!  rH   r[   r#  r  r  r  r$  r$   )rL   rN   r  r  r<   rP   r  ö  s    
ÿzEncodedStreamObject.set_data)
rz   r{   r|   rê   r   r[   rZ   r  r  r.  r<   r<   r  rP   r  ß  s   r  c                
       s^  e Zd ZdZd"eeedeee ee	ef f ddœ‡ fdd„Z
d#eeeeeee	f   d dœd	d
„Zeeeeeeee	f   eee	e	f  ddœ‡ fdd„Zeddœdd„Zeeeef dœdd„Zedœdd„Zeddœ‡ fdd„Zeeeeef  dœdd„ƒZejeeeef  ddœdd„ƒZddœdd„Zd$eedeef ddœ‡ fd d!„Z‡  ZS )%ÚContentStreama¥  
    In order to be fast, this data structure can contain either:

    * raw data in ._data
    * parsed stream operations in ._operations.

    At any time, ContentStream object can either have both of those fields defined,
    or one field defined and the other set to None.

    These fields are "rebuilt" lazily, when accessed:

    * when .get_data() is called, if ._data is None, it is rebuilt from ._operations.
    * when .operations is called, if ._operations is None, it is rebuilt from ._data.

    Conversely, these fields can be invalidated:

    * when .set_data() is called, ._operations is set to None.
    * when .operations is set, ._data is set to None.
    Nro   c                    s¶   || _ g | _|d u r"tƒ  d¡ n�| ¡ }t|tƒrˆd}|D ]8}|t| ¡  ¡ ƒ7 }t	|ƒdksl|d dkr<|d7 }q<tƒ  t
|ƒ¡ n$| ¡ }|d usœJ ‚tƒ  t|ƒ¡ || _d S )Nr»   r   rq   r³   )rE   Ú_operationsr  r  r¦   rH   r;   r   r  r‚   r[   rp   )rL   rg   rE   rp   rN   rš   Zstream_datar  r<   rP   rê     s     

zContentStream.__init__Fr<   r=   c                 C   sr   z| j j|kr|s| W S W n ty,   Y n0 tƒ }td|  |  dd¡||¡ƒ}|du r\g }| | ||||¡ |S )zÁ
        Clone object into pdf_dest.

        Args:
            pdf_dest:
            force_duplicate:
            ignore_fields:

        Returns:
            The cloned ContentStream
        r1  N)rD   rE   rF   rY   r   rG   r�   r„   r…   r<   r<   rP   rC   :  s     
ÿþzContentStream.cloner‡   c                    s:   t d|ƒ}tƒ  t|jƒ¡ || _t|jƒ| _|j| _dS )r  r1  N)	r   r  r  r   r  rE   rW   r2  rp   )rL   rˆ   r>   r?   r@   r†   Zsrc_csr  r<   rP   r„   ]  s
    
zContentStream._clone)rg   rA   c                 C   sÐ   |  dd¡ g }t|ƒ}|dksÌ|dkr*qÌ|  dd¡ | ¡ sF|dv r˜t|tjƒ}|dkr‚|g ksfJ ‚|  |¡}| j |df¡ qÊ| j ||f¡ g }q|dkr¶|d	vrÊ| 	d¡}q q| t
|d | jƒ¡ qd S )
Nr   r»   rq   r&   )ó   'ó   "ó   BIó   INLINE IMAGErÎ   )rÒ   r³   r»   )ru   r   Úisalphar   r+   Zdelimiter_patternÚ_read_inline_imager2  rJ   rs   rv   rp   )rL   rg   ÚoperandsÚpeekÚoperatorÚiir<   r<   rP   Ú_parse_content_streamv  s$    
z#ContentStream._parse_content_streamc                 C   s.  t ƒ }t|ƒ}| dd¡ |dkr$qZt|| jƒ}t|ƒ}| dd¡ t|| jƒ}|||< q| d¡}|d d… dksxJ ‚| d| dd	¡¡}| ¡ }t|t	ƒr¦|d
 }d|v s¶d|v rÂt
|ƒ}	�nd|v sÒd|v rÜt|ƒ}	núd|v sìd|v röt|ƒ}	nàd|v �s
d|v �rt|ƒ}	nÂ|d	k�rÎ| dd¡}
d|
v �r:d}nJd|
v �rJd}n:| d|
dv �r^dnd¡}|d
k�rx|d }nt|ƒ}	d}|d
k�r¸| ttt|d ƒ| ƒtt|d ƒ ¡}	t|ƒ}| dd¡ nt|ƒ}	| d¡}| dd¡ |d
d… dk�s|dd… tv�r$| |d
¡ t|ƒ}	||	dœS ) Nrq   r&   ó   Ir8   r   s   IDú/Fz/Filterznot setr   ZAHxZASCIIHexDecodeZA85ZASCII85DecodeZRLZRunLengthDecodeZDCTZ	DCTDecodez/CSr)  ÚRGBZCMYKé   z/BPC>   z/DeviceGrayz/Gz/Indexedz/IrÔ   g       @z/Wz/Hó   EI)ÚsettingsrN   )r€   r   ru   rv   rE   rs   r‹   rÆ   rH   rW   r2   r1   r5   r3   r4   r   r   r~   r   )rL   rg   rC  rx   rž   r¨   rw   ZfiltrZsavposrN   ÚcsZlcsÚbitsÚeir<   r<   rP   r8  •  sf    








þ


"ÿ
$z ContentStream._read_inline_imagerQ   c                 C   sÆ   | j s¼tƒ }| jD ]ž\}}|dkrz| d¡ tƒ }|d  |¡ | | ¡ dd… ¡ | d¡ | |d ¡ | d¡ n,|D ]}| |¡ | d	¡ q~| t|ƒ¡ | d
¡ q| ¡ | _ t| j ƒS )Nr6  r5  rC  r   éþÿÿÿs   ID rN   rB  rl   r³   )r  r   r2  rm   rn   Úgetvaluer   )rL   Znew_datar9  r;  Z	dict_textÚopr<   r<   rP   r  Ô  s$    



zContentStream.get_datar  c                    s   t ƒ  |¡ g | _d S rŸ   )r  r  r2  r  r  r<   rP   r  ê  s    zContentStream.set_datac                 C   s,   | j s&| jr&|  tt| jƒƒ¡ d| _| j S r  )r2  r  r=  r   r   rS   r<   r<   rP   Ú
operationsî  s    zContentStream.operations)rJ  rA   c                 C   s   || _ d| _d S r  )r2  r  )rL   rJ  r<   r<   rP   rJ  õ  s    c                 C   sH   | j r*| j  dg df¡ | j  g df¡ n| jrDdt| jƒ d | _d S )Nr   ÚqÚQs   q
s   
Q
)r2  ÚinsertrJ   r  r   rS   r<   r<   rP   Úisolate_graphics_stateú  s
    z$ContentStream.isolate_graphics_staterf   c                    s&   | j s| jr|  ¡  tƒ  ||¡ d S rŸ   )r  r2  r  r  rn   r  r  r<   rP   rn     s    zContentStream.write_to_stream)N)Fr<   )N) rz   r{   r|   Ú__doc__r   r   rZ   r   r   r~   rê   r}   r	   r
   rC   r€   r   r   r   r„   r   r=  r8  r[   r  r  rç   rJ  ÚsetterrN  rn   r.  r<   r<   r  rP   r1    sJ    üû#  üû%ù?	 ÿþr1  ro   c              	   C   sÖ  |   d¡}|  dd¡ |dkr*t | |¡S |dkrl|   d¡}|  dd¡ |dkr^t | ||¡S t| |ƒS �nf|dkr‚t | ||¡S |d	ks’|d
krœt | ¡S |dkr®t| |ƒS |dkrÖ|   d¡dkrÖ|  dd¡ t	ƒ S |dk� rêt	 | ¡S |dk�rB|dv�r"|   d¡}t
|ƒdk� rôtdƒ‚� qôt| ƒ}|  dd¡ t| ||ƒS |dv �rž|   d¡}|  t
|ƒ d¡ t |¡d u�r’|d u�s†J ‚t | |¡S t | ¡S n4|  dd¡ td|›d|  ¡ › d|   d¡ ¡ › �ƒ‚d S )Nr&   rq   ó   /ó   <r   rG  rÌ   rk   ó   tó   fó   (ó   eé   s   endobjiúÿÿÿó   nrÎ   )rÒ   r³   r   zFile ended unexpectedly.s   0123456789+-.é   iìÿÿÿz(Invalid Elementary Object starting with z @z: éP   )rs   ru   r+   ry   r€   r6   r;   r'   r7   r,   r‚   r%   r   rv   ÚIndirectPatternÚmatchr*   r-   r$   rÆ   r×   )rg   rE   rp   rx   r:  r<   r<   rP   rv   
  sP    










"ÿrv   c                   @   sü   e Zd ZdZeddœdd„Zeee dœdd„ƒZ	eee dœd	d
„ƒZ
eed dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZdS )ÚFieldz‹
    A class representing a field dictionary.

    This class is accessed through
    :meth:`get_fields()<pypdf.PdfReader.get_fields>`
    Nr  c              	   C   s¸   t  | ¡ t ¡ t ¡  }|j| _|D ],}z|| | t|ƒ< W q& tyP   Y q&0 q&t|  	d¡t
ƒr´tt
| tdƒ ƒ ¡ }t|tƒrŽ| ¡ }n|d u rœd}ntdƒ‚t|ƒ| tdƒ< d S )Nr“   r)  zShould never happen)r€   rê   r   Ú
attributesr   rD   r+   r¥   rH   r‹   r  r   r  r[   ÚdecoderF   r/   )rL   rN   Zfield_attributesÚattrÚdZd_strr<   r<   rP   rê   I  s&    
ÿÿ

zField.__init__rQ   c                 C   s   |   tj¡S )z4Read-only property accessing the type of this field.)r‹   r   r   rS   r<   r<   rP   Ú
field_type`  s    zField.field_typec                 C   s   |   tj¡S )z6Read-only property accessing the parent of this field.)r‹   r   ZParentrS   r<   r<   rP   rõ   e  s    zField.parentr;   c                 C   s   |   tj¡S )z4Read-only property accessing the kids of this field.)r‹   r   ZKidsrS   r<   r<   rP   Úkidsj  s    z
Field.kidsc                 C   s   |   tj¡S )z4Read-only property accessing the name of this field.)r‹   r   ÚTrS   r<   r<   rP   Únameo  s    z
Field.namec                 C   s   |   tj¡S )z>Read-only property accessing the alternate name of this field.)r‹   r   ZTUrS   r<   r<   rP   Úalternate_namet  s    zField.alternate_namec                 C   s   |   tj¡S )zÒ
        Read-only property accessing the mapping name of this field.

        This name is used by pypdf as a key in the dictionary returned by
        :meth:`get_fields()<pypdf.PdfReader.get_fields>`
        )r‹   r   ZTMrS   r<   r<   rP   Úmapping_namey  s    zField.mapping_namec                 C   s   |   tj¡S )z¢
        Read-only property accessing the field flags, specifying various
        characteristics of the field (see Table 8.70 of the PDF 1.7 reference).
        )r‹   r   ZFfrS   r<   r<   rP   Úflagsƒ  s    zField.flagsc                 C   s   |   tj¡S )zs
        Read-only property accessing the value of this field.

        Format varies based on field type.
        )r‹   r   ÚVrS   r<   r<   rP   r¨   ‹  s    zField.valuec                 C   s   |   tj¡S )z=Read-only property accessing the default value of this field.)r‹   r   ZDVrS   r<   r<   rP   Údefault_value”  s    zField.default_valuec                 C   s   |   tj¡S )zÚ
        Read-only property accessing the additional actions dictionary.

        This dictionary defines the field's behavior in response to trigger
        events. See Section 8.5.2 of the PDF 1.7 reference.
        )r‹   r   ZAArS   r<   r<   rP   Úadditional_actions™  s    zField.additional_actions)rz   r{   r|   rO  r€   rê   rç   r	   r+   rb  rõ   rc  rZ   re  rf  rg  r~   rh  r   r¨   rj  rk  r<   r<   r<   rP   r]  A  s,   	r]  c                   @   sd  e Zd ZU dZdZee ed< ee	e
eeef eddœdd„Zeddœd	d
„ƒZd$ee	deef ddœdd„Zeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeed dœdd„ƒZeee dœd d!„ƒZ eee dœd"d#„ƒZ!dS )%ÚDestinationa­  
    A class representing a destination within a PDF file.

    See section 12.3.2 of the PDF 2.0 reference.

    Args:
        title: Title of this destination.
        page: Reference to the page of this destination. Should
            be an instance of :class:`IndirectObject<pypdf.generic.IndirectObject>`.
        fit: How the destination is displayed.

    Raises:
        PdfReadError: If destination type is invalid.
    NÚnode)ÚtitleÚpageÚfitrA   c                 C   sØ  g | _ |j}|j}t | ¡ t|ƒ| tdƒ< || tdƒ< || tdƒ< |dkrÄt|ƒdk rf| t	dƒ¡ t|ƒdk r€| t	dƒ¡ t|ƒdk rš| t	dƒ¡ |\| tt
jƒ< | tt
jƒ< | td	ƒ< �nt|ƒd
krÔ�n |tjk�r|\| tt
jƒ< | tt
jƒ< | tt
jƒ< | tt
jƒ< n¾|tjtjfv �rdz|\| tt
jƒ< W n$ t�y`   tƒ | tt
jƒ< Y n0 np|tjtjfv �r²z|\| tt
jƒ< W n$ t�y®   tƒ | tt
jƒ< Y n0 n"|tjtjfv �rÆntd|›�ƒ‚d S )Nú/Titleú/Pager‰   z/XYZr&   g        r   r8   ú/Zoomr   zUnknown Destination Type: )Z_filtered_childrenZfit_typeZfit_argsr€   rê   r/   r+   r‚   rJ   r-   ÚTAÚLEFTZTOPÚTFZFIT_RZBOTTOMÚRIGHTZFIT_HZFIT_BHrF   r,   ZFIT_VZFIT_BVZFITZFIT_Br$   )rL   rn  ro  rp  ÚtypÚargsr<   r<   rP   rê   ¸  sV    
ü
ýûüzDestination.__init__r;   rQ   c                    s(   t ˆ  d¡ˆ d g‡ fdd„dD ƒ ƒS )Nrr  r‰   c                    s   g | ]}|ˆ v rˆ | ‘qS r<   r<   r¸   rS   r<   rP   rº   ñ  s   þz*Destination.dest_array.<locals>.<listcomp>)ú/Leftú/Bottomú/Rightú/Toprs  )r;   rŠ   rS   r<   rS   rP   Ú
dest_arrayí  s    
þÿÿzDestination.dest_arrayrf   c                 C   sŽ   |d urt ddƒ | d¡ tdƒ}| |¡ | d¡ | j}| |¡ tdƒ}| |¡ | d¡ tdƒ}| |¡ | d¡ | d	¡ d S )
Nri   rj   r±   z/Drl   z/Sz/GoTor³   r´   )r   rm   r+   rn   r~  )rL   rg   rh   rž   r¨   Zvalue_sr<   r<   rP   rn   ø  s"    ÿ







zDestination.write_to_streamc                 C   s
   |   d¡S )z3Read-only property accessing the destination title.rq  ©r‹   rS   r<   r<   rP   rn    s    zDestination.titlec                 C   s
   |   d¡S )z9Read-only property accessing the destination page number.rr  r  rS   r<   r<   rP   ro    s    zDestination.pagec                 C   s
   |   d¡S )z2Read-only property accessing the destination type.r‰   r  rS   r<   r<   rP   rx    s    zDestination.typc                 C   s   |   dd¡S )z-Read-only property accessing the zoom factor.rs  Nr  rS   r<   r<   rP   Úzoom  s    zDestination.zoomc                 C   s   |   dd¡S )z<Read-only property accessing the left horizontal coordinate.rz  Nr  rS   r<   r<   rP   Úleft#  s    zDestination.leftc                 C   s   |   dd¡S )z=Read-only property accessing the right horizontal coordinate.r|  Nr  rS   r<   r<   rP   Úright(  s    zDestination.rightc                 C   s   |   dd¡S )z9Read-only property accessing the top vertical coordinate.r}  Nr  rS   r<   r<   rP   Útop-  s    zDestination.topc                 C   s   |   dd¡S )z<Read-only property accessing the bottom vertical coordinate.r{  Nr  rS   r<   r<   rP   Úbottom2  s    zDestination.bottomc                 C   s"   |   dttdƒtdƒtdƒgƒ¡S )zHRead-only property accessing the color in (R, G, B) with values 0.0-1.0.z/Cr   )r‹   r;   r)   rS   r<   r<   rP   Úcolor7  s    ÿzDestination.colorc                 C   s   |   dd¡S )z_
        Read-only property accessing the font type.

        1=italic, 2=bold, 3=both
        r?  r   r  rS   r<   r<   rP   Úfont_format>  s    zDestination.font_formatc                 C   s   |   dd¡S )zÀ
        Read-only property accessing the outline count.

        positive = expanded
        negative = collapsed
        absolute value = number of visible descendants at all levels
        r÷   Nr  rS   r<   r<   rP   Úoutline_countG  s    	zDestination.outline_count)N)"rz   r{   r|   rO  rm  r	   r€   Ú__annotations__rZ   r   r-   r*   r,   r0   rê   rç   r~  r   r[   rn   rn  r~   ro  rx  r€  r)   r�  r‚  rƒ  r„  r…  r   r†  r‡  r<   r<   r<   rP   rl  ¤  sN   
þÿû5 ÿþrl  )N)]Ú
__author__Ú__author_email__ÚloggingrÛ   ÚsysÚior   Úmathr   Útypingr   r   r   r   r   r	   r
   r   r   r   r   Z
_protocolsr   r   r   Ú_utilsr   r   r   r   r   r   r   r   r   Ú	constantsr   r   r   r   r   r    rÙ   r!   rt  r"   rv  Úerrorsr#   r$   r%   Ú_baser'   r(   r)   r*   r+   r,   r-   r.   r/   Z_fitr0   Z_image_inliner1   r2   r3   r4   r5   r6   r7   Úversion_infor:   Ztyping_extensionsÚ	getLoggerrz   ÚloggerZNumberSignsrÜ   r[  r;   r€   rè   r  rI   r  r  r1  rZ   r~   rv   r]  rl  r<   r<   r<   rP   Ú<module>   sb   4,,

   y Y &  
 ýü7c