U
    c                  
   @   s.  d Z dZddl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mZ ddl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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& ddlm'Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddlm8Z8m9Z9 e:e;Z<dZ=e>dZ?G dd de@e4ZAG dd deBe4ZCG dd deCZDeddddZEG dd  d eCZFG d!d" d"eFZGG d#d$ d$eFZHG d%d& d&eGZId.eee edeJe
eJ eeKeJf f ee4eKeJeIf d'd(d)ZLG d*d+ d+eDZMG d,d- d-eDZNdS )/zMathieu Fenniakzbiziqe@mathieu.fenniak.net    N)BytesIO)AnyDictIterableListOptionalTupleUnioncast   )PdfReaderProtocolPdfWriterProtocol)
WHITESPACES
StreamTypeb_deprecate_with_replacementdeprecation_with_replacementhex_strlogger_warningread_non_whitespaceread_until_regexskip_over_comment)CheckboxRadioButtonAttributesFieldDictionaryAttributes)FilterTypes)OutlineFontFlag)StreamAttributes)TypArguments)TypFitArguments)STREAM_TRUNCATED_PREMATURELYPdfReadErrorPdfStreamError   )BooleanObjectFloatObjectIndirectObject
NameObject
NullObjectNumberObject	PdfObjectTextStringObject)Fit)read_hex_string_from_streamread_string_from_streams   +-s   [+-]?(\d+)\s+(\d+)\s+R[^a-zA-Z]c                   @   s   e Zd Zdeeeeedf ee df d dddZ	e
e dd	d
Zeedeef ddddZ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eeed dddZdS )ArrayObjectF .Npdf_destforce_duplicateignore_fieldsreturnc                 C   s   z| j j|kr|s| W S W n tk
r.   Y nX td| t |}| D ]\}t|trz||||||}|	|j  qHt
|dr|	|||| qH|	| qHtd|S )Clone object into pdf_dest.r.   clone)indirect_referencepdf	Exceptionr
   _reference_cloner.   
isinstanceStreamObjectr6   appendhasattr)selfr1   r2   r3   arrdatadupr/   r/   B/tmp/pip-unpacked-wheel-u_n6aelj/pypdf/generic/_data_structures.pyr6   O   s"    

 
zArrayObject.cloner4   c                 C   s   t | S )z:Emulate DictionaryObject.items for a list (index, object).)	enumerater?   r/   r/   rC   itemsh   s    zArrayObject.itemsstreamencryption_keyr4   c                 C   s8   | d | D ]}| d ||| q| d d S )N   [    s    ])writewrite_to_stream)r?   rI   rJ   rA   r/   r/   rC   rN   l   s
    

zArrayObject.write_to_streamc                 C   s   t ddd | || d S NwriteToStreamrN   3.0.0r   rN   r?   rI   rJ   r/   r/   rC   rP   u   s    zArrayObject.writeToStreamrI   r8   forced_encodingr4   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seekr=   read_object)rI   r8   rU   r@   tmptokZ	peekaheadr/   r/   rC   read_from_stream{   s    


zArrayObject.read_from_streamrI   r8   r4   c                 C   s   t ddd t| |S NreadFromStreamr^   rQ   )r   r.   r^   rI   r8   r/   r/   rC   ra      s    zArrayObject.readFromStream)Fr/   )N)__name__
__module____qualname__r   boolr	   r   strr   r6   r   r   rG   r   bytesrN   rP   staticmethodr   r   r   intr^   ra   r/   r/   r/   rC   r.   N   s<      
   r.   c                   @   sn  e Zd Zd'eeeeedf ee df d dddZ	d eeeeedf ee f ddd	d
Z
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ee dddZeee dddZeedeef ddddZ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eeed d$d%d&ZdS )*DictionaryObjectFr/   .Nr0   c                 C   sv   z| j j|kr|s| W S W n tk
r.   Y nX td| |  |}|dkrRg }t| dkrr|| ||| |S )r5   rk   Nr   )	r7   r8   r9   r
   r:   	__class__lenkeys_cloner?   r1   r2   r3   Zd__r/   r/   rC   r6      s    
 zDictionaryObject.clonesrcr1   r2   r3   r4   c              
   C   s  d|krd|ksDd|kr d|ksDd|kr0d|ksDd|krFd|krFt |}dD ]}|D ]}g }||krX|| krXt||trXtd|| }| }	|dk	rtd|| |}
|||
f |	dk	st|
j	|	t
|< |
}	z ||krd}ntd|| }W q tk
r   d}Y qX q|D ] \}}||||||g  q qXqP| D ]\}}||krNt|trt|ds~d|_	||||}|j	dk	st|j	| ||< n0|| krNt|d	r||||n|| t
|< qNdS )
z
        Update the object from src.

        Args:
            src: "DictionaryObject":
            pdf_dest:
            force_duplicate:
            ignore_fields:
        /Next/Prev/N/V))rs   rt   )ru   rv   rk   Nr7   r6   )listr;   raw_getr%   r
   r:   rl   r=   AssertionErrorr7   r&   r9   ro   rG   r<   r>   r6   )r?   rr   r1   r2   r3   lstkobjsZcur_objZprev_objZclonscvvvr/   r/   rC   ro      sz     


zDictionaryObject._clone)keyr4   c                 C   s   t | |S N)dict__getitem__r?   r   r/   r/   rC   rx      s    zDictionaryObject.raw_get)r   valuer4   c                 C   s2   t |tstdt |ts$tdt| ||S Nzkey must be PdfObjectzvalue must be PdfObject)r;   r)   
ValueErrorr   __setitem__r?   r   r   r/   r/   rC   r      s
    

zDictionaryObject.__setitem__c                 C   s2   t |tstdt |ts$tdt| ||S r   )r;   r)   r   r   
setdefaultr   r/   r/   rC   r     s
    

zDictionaryObject.setdefaultc                 C   s   t | | S r   )r   r   
get_objectr   r/   r/   rC   r     s    zDictionaryObject.__getitem__rD   c                 C   sN   ddl m} | dd}|dkr$dS | }t||sJ||}|| td< |S )a  
        Retrieve XMP (Extensible Metadata Platform) data relevant to the this
        object, if available.

        Stability: Added in v1.12, will exist for all future v1.x releases.

        Returns:
          Returns a {@link #xmp.XmpInformation XmlInformation} 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   getr   r;   r&   )r?   r   metadatar/   r/   rC   xmp_metadata  s    
zDictionaryObject.xmp_metadatac                 C   s   t ddd | jS )S
        Use :meth:`xmp_metadata` instead.

        .. deprecated:: 1.28.3
        getXmpMetadatar   rQ   r   r   rF   r/   r/   rC   r   (  s    zDictionaryObject.getXmpMetadatac                 C   s   t ddd | jS )r   xmpMetadatar   rQ   r   rF   r/   r/   rC   r   3  s    zDictionaryObject.xmpMetadatarH   c                 C   sZ   | d t|  D ]4\}}||| | d ||| | d q| d d S )N   <<
rL      
   >>)rM   rw   rG   rN   )r?   rI   rJ   r   r   r/   r/   rC   rN   =  s    

z DictionaryObject.write_to_streamc                 C   s   t ddd | || d S rO   rR   rS   r/   r/   rC   rP   H  s    zDictionaryObject.writeToStreamrT   c              
      s  t t tt  tt d fdd tttd fdd}| d}|dkr^td	t|   d
i }t	| }|dkrvqbn|dkr| 
dd t|  qb|stt|dkr| d q| 
dd z.t| |}t	| }| 
dd t| ||}W nh tk
rX }	 zH|d k	r"|jr"t|	 t|	 t t }
|
| |
 W Y S d }	~	X Y nX ||sp|||< qbdt|   d| }|d k	r|jrt|t|t qb|  }t	| }|dkrd| ddkrd| d}|dkr| d}q|dkrtd|dkr2| ddkr2| 
dd tj|krFtd|tj }t|tr|  }|d k	srt||}| 
|d |  }| ||d< t	| }| d}|| dkrp|  }| 
dd | d }|dkr|d d d |d< nf|d k	r2|js2| 
|d || ||d< |  }n0| 
|d td!t|   d"|d#|d$n| 
|d d|krt|S t }
|
| |
S d S )%N)pp1rem_gensr8   r4   c                    sb   |j |d  }|D ]$}||| kr| || k r|| }qt|dkrH|S  | ||dd  |S d S )Nr   r"   )xrefrm   )r   r   r   r8   locoget_next_obj_posr/   rC   r   T  s    
z;DictionaryObject.read_from_stream.<locals>.get_next_obj_posr_   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   rX   findr    rZ   )rI   r8   Zeoncurrrwr   r   r/   rC   read_unsized_from_steam`  s    

zBDictionaryObject.read_from_stream.<locals>.read_unsized_from_steamr      <<zDictionary read error at byte z: stream must begin with '<<'       %rV   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 definedr   __streamdata__   r   ir   z7Unable to find 'endstream' marker after stream at byte z (nd='z', end='z').)rj   r   r   r   rh   rX   r    r   r   r   rZ   r   r!   r   r[   r9   strict__repr__r   rc   rk   updater   SALENGTHr;   r%   ry   r   r<   initialize_from_dictionary)rI   r8   rU   r   r\   rA   r]   r   r   excretvalmsgposr}   eollengthtZpstarteZndstreamendr/   r   rC   r^   N  s        

















z!DictionaryObject.read_from_streamr_   c                 C   s   t ddd t| |S r`   )r   rk   r^   rb   r/   r/   rC   ra     s    zDictionaryObject.readFromStream)Fr/   )N)N) rc   rd   re   r   rf   r	   r   rg   r   r6   ro   r   rx   r   r   r   r)   r   propertyr   r   r   r   rh   rN   rP   ri   r   r   rj   r^   ra   r/   r/   r/   rC   rk      s\     H
     rk   c                   @   s   e Zd Z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eddddZeeeddddZed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 )#
TreeObjectNrD   c                 C   s   t |  d S r   )rk   __init__rF   r/   r/   rC   r     s    zTreeObject.__init__c                 C   s   t ddd |  S )NhasChildrenhas_children4.0.0)r   r   rF   r/   r/   rC   r     s    zTreeObject.hasChildrenc                 C   s   d| kS )N/Firstr/   rF   r/   r/   rC   r     s    zTreeObject.has_childrenc                 C   s   |   S r   )childrenrF   r/   r/   rC   __iter__  s    zTreeObject.__iter__c                 c   sb   |   sd S | td }| }|V  || td kr:d S |td}|d krTd S | }q d S )Nr   /Lastrs   )r   r&   r   r   )r?   Z	child_refchildr/   r/   rC   r     s    zTreeObject.children)r   r8   r4   c                 C   s   t ddd | || d S )NaddChild	add_childrQ   )r   r   r?   r   r8   r/   r/   rC   r     s    zTreeObject.addChildc                 C   s   |  |d | d S r   )insert_childr   r/   r/   rC   r     s    zTreeObject.add_child)r   beforer8   r4   c                    s  t d ttf td d fdd | }|j}d| kr|| td< td| td< || td< | j|td<  | |dd	 d
|kr|d
= d|kr|d= d S t	d| d }|j|kr2d
|krt	d|d
 }qt	d||td
< |j|td< | j|td< d
|kr|d
= || td<  | |dd	 d S qz8t
|d tsHt||d td
< |d |td< W n tk
r   |d
= Y nX ||td
< ||td< | j|td<  | |dd	 d S )N)parentnr4   c                    sZ   | d krd S t d|  } d| krVtt t| td | | td<  | dd | d S )Nr   /Count/Parent)r
   r   r(   rj   r&   r   )r   r   inc_parent_counterr/   rC   r     s    z3TreeObject.insert_child.<locals>.inc_parent_counterr   r   r   r   r   r"   rs   rt   rk   r   )r	   r%   r   rj   r   r7   r&   r(   r   r
   r;   rk   ry   r9   )r?   r   r   r8   	child_objprevr/   r   rC   r     sN     
zTreeObject.insert_child)r   r4   c                 C   s   t ddd | | d S )NremoveChildremove_childrQ   )r   r   )r?   r   r/   r/   rC   r   ;  s    zTreeObject.removeChild)r   prev_refcurlastr4   c                 C   s   | tdd}|dkr|rX| }|td= || td< t| td d | td< q| td dkslt| td= | td= td| kr| td= nd|r| }||td< ||td< n"||kst|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:
        rs   Nrt   r   r   r"   r   )r   r&   r   r(   ry   )r?   r   r   r   r   Znext_refZnext_objr/   r/   rC   _remove_node_from_tree?  s,    



z!TreeObject._remove_node_from_treec           
      C   s   |  }|j}td|kr$tdn|td | kr<tdd}d }d }| td }|  }| td }|  }	|d k	r||kr| ||||	 d}q|}|}td|kr|td }|  }qpd }d }qp|st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   Trs   z"Removal couldn't find item in tree)r   r7   r&   r   r   _reset_node_tree_relationship)
r?   r   r   foundr   r   Zcur_refr   Zlast_refr   r/   r/   rC   r   j  s8    

zTreeObject.remove_childc                 C   s.   t d| krtdntd| d |  dS )z)Remove the object from the tree it is in.r   r   r   N)r&   r   r
   r   rF   r/   r/   rC   remove_from_tree  s    
zTreeObject.remove_from_treec                 C   s   t ddd |   d S )N	emptyTree
empty_treer   )r   r   rF   r/   r/   rC   r     s    zTreeObject.emptyTreec                 C   s`   | D ]}|  }t| qtd| kr0| td= td| krF| td= td| kr\| td= d S )Nr   r   r   )r   r   r&   )r?   r   r   r/   r/   rC   r     s    


zTreeObject.empty_tree)rc   rd   re   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   rC   r     s&   6   +%r   )r   r4   c                 C   s:   | t d= t d| kr | t d= t d| k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   rs   rt   N)r&   )r   r/   r/   rC   r     s
    	

r   c                       s*  e Zd ZddddZeeeeee	df e
e	 f dd fddZed fd	d
Zeed dddZejdddddZeedddZejeddddZ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dddZdddd Z  ZS )!r<   NrD   c                 C   s   d | _ d | _d S r   )_StreamObject__datadecoded_selfrF   r/   r/   rC   r     s    zStreamObject.__init__.rq   c                    sj   t d|j| _z0t d|j}|dkr,d| _n||d|| _W n tk
rR   Y nX t |||| dS )
        Update the object from src.

        Args:
            src:
            pdf_dest:
            force_duplicate:
            ignore_fields:
        r<   NT)r
   _datar   r6   r9   superro   )r?   rr   r1   r2   r3   r   rl   r/   rC   ro     s    zStreamObject._clonec                    s   t   }|t| j7 }|S r   )r   hash_value_datar   r   r?   rA   r   r/   rC   r     s    
zStreamObject.hash_value_dataDecodedStreamObjectc                 C   s   t ddd | jS NdecodedSelfr   rQ   r   r   rF   r/   r/   rC   r     s    zStreamObject.decodedSelfr   r4   c                 C   s   t ddd || _d S r   r   r?   r   r/   r/   rC   r     s    c                 C   s   | j S r   r   rF   r/   r/   rC   r     s    zStreamObject._datac                 C   s
   || _ d S r   r   r   r/   r/   rC   r     s    rH   c                 C   sp   t t| j| ttj< t| || | tj= |d | j}|rXddl	m
} |||}|| |d d S )Ns   
stream
r   )RC4_encrypts
   
endstream)r(   rm   r   r&   r   r   rk   rN   rM   Z	_securityr   )r?   rI   rJ   rA   r   r/   r/   rC   rN     s    


zStreamObject.write_to_stream)EncodedStreamObjectr   rA   r4   c                 C   s
   t | S r   )r<   r   )rA   r/   r/   rC   initializeFromDictionary  s    z%StreamObject.initializeFromDictionaryc                 C   s>   t j| krt }nt }| d |_| d= | t j= ||  |S )Nr   )r   FILTERr   r   r   r   r   )rA   r   r/   r/   rC   r     s    


z'StreamObject.initialize_from_dictionaryr   c                 C   s   t ddd |  S )NflateEncodeflate_encoderQ   )r   r   rF   r/   r/   rC   r     s    zStreamObject.flateEncodec                 C   s   ddl m} tj| krb| tj }t|tr>|dttj	 qjt }|
td |
| |}ntd}t }||ttj< || j|_|S )Nr   )FlateDecoder   z/FlateDecode)filtersr   r   r   r;   r.   insertr&   FTZFLATE_DECODEr=   r   encoder   )r?   r   fZnewfr   r/   r/   rC   r     s    



zStreamObject.flate_encode)rc   rd   re   r   rk   r   rf   r	   r   rg   r   ro   rh   r   r   r   r   setterr   r   r   rN   ri   r   r   r   r   r   __classcell__r/   r/   r   rC   r<     s<    

r<   c                   @   sH   e Zd ZedddZeedddZedddZed	dd
dZd	S )r   rD   c                 C   s   | j S r   r   rF   r/   r/   rC   get_data,  s    zDecodedStreamObject.get_datar   c                 C   s
   || _ d S r   r  r   r/   r/   rC   set_data/  s    zDecodedStreamObject.set_datac                 C   s   t ddd | jS NgetDatar  rQ   )r   r   rF   r/   r/   rC   r  2  s    zDecodedStreamObject.getDataNc                 C   s   t ddd | | d S NsetDatar  rQ   r   r  r   r/   r/   rC   r	  6  s    zDecodedStreamObject.setData)rc   rd   re   r   r  r  r  r	  r/   r/   r/   rC   r   +  s   r   c                   @   s   e Zd ZddddZeed dddZejeddd	dZe	de
ef dd
dZe	de
ef dddZeddddZeddddZdS )r   NrD   c                 C   s
   d | _ d S r   )r   rF   r/   r/   rC   r   <  s    zEncodedStreamObject.__init__r   c                 C   s   t ddd | jS r   r   rF   r/   r/   rC   r   ?  s    zEncodedStreamObject.decodedSelfr   c                 C   s   t ddd || _d S r   r   r   r/   r/   rC   r   D  s    c                 C   sr   ddl m} | jd k	r | j S t }|| |_t|  D ]$\}}|tj	tj
tjfkr<|||< q<|| _|jS d S )Nr   )decode_stream_data)r   r  r   r  r   r   rw   rG   r   r   r   ZDECODE_PARMS)r?   r  decodedr   r   r/   r/   rC   r  I  s    



zEncodedStreamObject.get_datac                 C   s   t ddd |  S r  )r   r  rF   r/   r/   rC   r  Z  s    zEncodedStreamObject.getDatar   c                 C   s   t dd S )Nz7Creating EncodedStreamObject is not currently supported)r    r   r/   r/   rC   r  ^  s    zEncodedStreamObject.set_datac                 C   s   t ddd | |S r  r
  r   r/   r/   rC   r	  a  s    zEncodedStreamObject.setData)rc   rd   re   r   r   r   r   r  r   r	   rg   rh   r  r  r   r  r	  r/   r/   r/   rC   r   ;  s   r   c                
   @   s   e Zd Zdeeedeee eeef f ddddZ	dee
eeedf ee df d dd	d
Zeee
eeedf ee f ddddZeddddZeeeef dddZeedddZejeeef ddddZdS )ContentStreamNrT   c           	      C   s   || _ g | _|d k	r| }t|trrd}|D ]8}|t|  7 }t|dks^|d dkr.|d7 }q.t|}n$| }|d k	st	t|}t|}|| _
| | d S )N    r   rV   r   )r8   
operationsr   r;   r.   r   r  rm   r   ry   rU   $_ContentStream__parse_content_stream)	r?   rI   r8   rU   rA   r}   Zstream_bytesZstream_dataZstream_data_bytesr/   r/   rC   r   g  s"    


zContentStream.__init__Fr/   .r0   c                 C   sj   z| j j|kr|s| W S W n tk
r.   Y nX td| | dd|}|dkrVg }|| ||| |S )z
        Clone object into pdf_dest.

        Args:
            pdf_dest:
            force_duplicate:
            ignore_fields:

        Returns:
            The cloned ContentStream
        r  N)r7   r8   r9   r
   r:   rl   ro   rp   r/   r/   rC   r6     s    
 zContentStream.clonerq   c                 C   s*   || _ ttd|j| _td|j| _dS )r   r  N)r8   rw   r
   r  rU   )r?   rr   r1   r2   r3   r/   r/   rC   ro     s    zContentStream._clone)rI   r4   c                 C   s   | dd g }t|}|dks|dkr*q| dd | sF|dkrt|tj}|dkr|g ksft| |}| j	|df q| j	||f g }q|dkr|d	kr|
d}qq|	t|d | j qd S )
Nr   r  rV   r"   )   '   "   BI   INLINE IMAGEr   r   r   )rZ   r   isalphar   r&   Zdelimiter_patternry   _read_inline_imager  r=   rX   r[   rU   )r?   rI   operandspeekoperatoriir/   r/   rC   Z__parse_content_stream  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sxtt }|d}|std|	d	}	|	dkr|
| q~|
|d
|	  ||	t| d |d}|d}
|
dkr|dd |
| q~||
 }|d}|tkrB|dd |
| q~||	d |	 tkr|tkrp|d}qX|dd qq~|tkr||7 }|d}q|dd |dkrqq~|d	kr|d}|dd |dkrqq~|
| q~|| dS )NrV   r"      I   r   s   IDi    zUnexpected end of stream   Er      Qs   EMC)settingsrA   )rk   r   rZ   r[   r8   rX   ry   r   r    r   rM   rm   r   getvalue)r?   rI   r"  r]   r   r   r\   rA   bufr   Ztok2infoZtok3Zoper/   r/   rC   r    sl    













z ContentStream._read_inline_imagerD   c                 C   s   t  }| jD ]\}}|dkrv|d t  }|d |d  || dd  |d ||d  |d n.|D ]}||d  |d	 qz|t| |d
 q| S )Nr  r  r"  r   r  s   ID rA   s   EIrL   r   )r   r  rM   rN   r#  r   )r?   newdatar  r  Zdicttextopr/   r/   rC   r   )  s     

zContentStream._datar   c                 C   s   |  tt| d S r   )r  r   r   r   r/   r/   rC   r   =  s    )N)Fr/   )rc   rd   re   r   r	   rg   r   r   rj   r   rf   r   r6   rk   r   ro   r   r  r  r   rh   r   r  r/   r/   r/   rC   r  f  s6    #  !Nr  rT   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rt| ||S |d	ks|d
krt| S |dkrt| |S |dkr|  ddkr| dd t	 S |dk rt	| S |dkrB|dkr"|  d}t
|dk rtd qt| }| dd t| ||S |dkr|  d}| t
| d t|d k	r|d k	stt| |S t| S n4| dd td|d|   d|  d  d S )Nr"   rV      /   <r   r  r   rK      t   f   (   e   s   endobji   nr   r  r   zFile ended unexpectedly.s   0123456789+-.   iz(Invalid Elementary Object starting with z @z: P   )rX   rZ   r&   r^   rk   r,   r.   r#   r-   r'   rm   r!   r   r[   IndirectPatternmatchry   r%   r(   r    r   r   )rI   r8   rU   r]   r  r/   r/   rC   r[   B  sP    










"r[   c                   @   sj  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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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   sZ   t |  t t  }|j| _|D ].}z|| | t|< W q& tk
rR   Y q&X q&d S r   )rk   r   r   
attributesr   r7   r&   KeyError)r?   rA   Zfield_attributesattrr/   r/   rC   r     s    
zField.__init__rD   c                 C   s   |  tjS )z4Read-only property accessing the type of this field.)r   r   r   rF   r/   r/   rC   
field_type  s    zField.field_typec                 C   s   t ddd | jS )zT
        Use :py:attr:`field_type` instead.

        .. deprecated:: 1.28.3
        	fieldTyper8  rQ   )r   r8  rF   r/   r/   rC   r9    s    zField.fieldTypec                 C   s   |  tjS )z6Read-only property accessing the parent of this field.)r   r   ZParentrF   r/   r/   rC   r     s    zField.parentr.   c                 C   s   |  tjS )z4Read-only property accessing the kids of this field.)r   r   ZKidsrF   r/   r/   rC   kids  s    z
Field.kidsc                 C   s   |  tjS )z4Read-only property accessing the name of this field.)r   r   TrF   r/   r/   rC   name  s    z
Field.namec                 C   s   |  tjS )z>Read-only property accessing the alternate name of this field.)r   r   ZTUrF   r/   r/   rC   alternate_name  s    zField.alternate_namec                 C   s   t ddd | jS )zX
        Use :py:attr:`alternate_name` instead.

        .. deprecated:: 1.28.3
        altNamer=  rQ   )r   r=  rF   r/   r/   rC   r>    s    zField.altNamec                 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TMrF   r/   r/   rC   mapping_name  s    zField.mapping_namec                 C   s   t ddd | jS )zV
        Use :py:attr:`mapping_name` instead.

        .. deprecated:: 1.28.3
        mappingNamer?  rQ   )r   r?  rF   r/   r/   rC   r@    s    zField.mappingNamec                 C   s   |  tjS )zRead-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FfrF   r/   r/   rC   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   VrF   r/   r/   rC   r     s    zField.valuec                 C   s   |  tjS )z=Read-only property accessing the default value of this field.)r   r   ZDVrF   r/   r/   rC   default_value  s    zField.default_valuec                 C   s   t ddd | jS )zW
        Use :py:attr:`default_value` instead.

        .. deprecated:: 1.28.3
        defaultValuerC  rQ   )r   rC  rF   r/   r/   rC   rD    s    zField.defaultValuec                 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AArF   r/   r/   rC   additional_actions  s    zField.additional_actionsc                 C   s   t ddd | jS )z\
        Use :py:attr:`additional_actions` instead.

        .. deprecated:: 1.28.3
        additionalActionsrE  rQ   )r   rE  rF   r/   r/   rC   rF    s    zField.additionalActions)rc   rd   re   __doc__rk   r   r   r   r&   r8  r9  r   r:  rg   r<  r=  r>  r?  r@  rj   rA  r   r   rC  rD  rE  rF  r/   r/   r/   rC   r4  y  s@   						r4  c                   @   s  e Zd ZU dZdZee ed< g 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d	ddZ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 8.2.1 of the PDF 1.6 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childs)titlepagefitr4   c                 C   st  |j }|j}t|  t|| td< || td< || td< |dkrp|\| ttj< | ttj< | td< n |t	j
kr|\| ttj< | ttj< | ttj< | ttj< n|t	jt	jfk rz|\| ttj< W n$ tk
r   t | ttj< Y nX nr|t	jt	jfkrNz|\| ttj< W n& tk
rJ   t | ttj< Y nX n"|t	jt	jfkrbntd|d S )N/Title/Page/Typez/XYZ/ZoomzUnknown Destination Type: )Zfit_typeZfit_argsrk   r   r*   r&   TALEFTZTOPTFZFIT_RZBOTTOMRIGHTZFIT_HZFIT_BHr9   r'   ZFIT_VZFIT_BVZFITZFIT_Br    )r?   rK  rL  rM  typargsr/   r/   rC   r     sD    


zDestination.__init__r.   rD   c                    s(   t  d d g fdddD  S )NrO  rP  c                    s   g | ]}| kr | qS r/   r/   ).0xrF   r/   rC   
<listcomp>G  s   z*Destination.dest_array.<locals>.<listcomp>)/Left/Bottom/Right/ToprQ  )r.   rx   rF   r/   rF   rC   
dest_arrayC  s    
zDestination.dest_arrayc                 C   s   t ddd | jS )zT
        Use :py:attr:`dest_array` instead.

        .. deprecated:: 1.28.3
        getDestArrayr_  rQ   )r   r_  rF   r/   r/   rC   r`  N  s    zDestination.getDestArrayrH   c                 C   s   | d td}||| | d | j}||| td}||| | d td}||| | d | d d S )Nr   z/DrL   z/Sz/GoTor   r   )rM   r&   rN   r_  )r?   rI   rJ   r   r   Zvalue_sr/   r/   rC   rN   W  s    



zDestination.write_to_streamc                 C   s
   |  dS )z3Read-only property accessing the destination title.rN  r   rF   r/   r/   rC   rK  j  s    zDestination.titlec                 C   s
   |  dS )z9Read-only property accessing the destination page number.rO  ra  rF   r/   r/   rC   rL  o  s    zDestination.pagec                 C   s
   |  dS )z2Read-only property accessing the destination type.rP  ra  rF   r/   r/   rC   rV  t  s    zDestination.typc                 C   s   |  ddS )z-Read-only property accessing the zoom factor.rQ  Nra  rF   r/   r/   rC   zoomy  s    zDestination.zoomc                 C   s   |  ddS )z<Read-only property accessing the left horizontal coordinate.r[  Nra  rF   r/   r/   rC   left~  s    zDestination.leftc                 C   s   |  ddS )z=Read-only property accessing the right horizontal coordinate.r]  Nra  rF   r/   r/   rC   right  s    zDestination.rightc                 C   s   |  ddS )z9Read-only property accessing the top vertical coordinate.r^  Nra  rF   r/   r/   rC   top  s    zDestination.topc                 C   s   |  ddS )z<Read-only property accessing the bottom vertical coordinate.r\  Nra  rF   r/   r/   rC   bottom  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$   rF   r/   r/   rC   color  s     zDestination.colorc                 C   s   |  ddS )z_
        Read-only property accessing the font type.

        1=italic, 2=bold, 3=both
        z/Fr   ra  rF   r/   r/   rC   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 descendents at all levels
        r   Nra  rF   r/   r/   rC   outline_count  s    	zDestination.outline_count)&rc   rd   re   rG  rI  r   rk   __annotations__rJ  r   r   rg   r	   r(   r%   r'   r+   r   r   r_  r`  r   rh   rN   rK  rj   rL  rV  rb  r$   rc  rd  re  rf  rg  r   rh  ri  r/   r/   r/   rC   rH    sP   
+

 rH  )N)O
__author____author_email__loggingreior   typingr   r   r   r   r   r   r	   r
   Z
_protocolsr   r   _utilsr   r   r   r   r   r   r   r   r   r   	constantsr   r   r   r   r   r   r   r   rR  r   rT  errorsr   r    r!   _baser#   r$   r%   r&   r'   r(   r)   r*   Z_fitr+   r,   r-   	getLoggerrc   loggerZNumberSignscompiler2  rw   r.   r   rk   r   r   r<   r   r   r  rg   rj   r[   r4  rH  r/   r/   r/   rC   <module>   sT   (0(


N  G Gt+ ` 7 