U
    
3g                  
   @   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 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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 ddlm7Z7m8Z8 e9e:Z;dZ<e=dZ>G dd de?e3Z@G dd deAe3ZBG dd deBZCeddddZDG dd  d eBZEG d!d" d"eEZFG d#d$ d$eEZGG d%d& d&eFZHd.eeedeIe
eI eeJeIf f ee3eJeIeHf d'd(d)ZKG d*d+ d+eCZLG d,d- d-eCZMdS )/zMathieu Fenniakzbiziqe@mathieu.fenniak.net    N)BytesIO)AnyDictIterableListOptionalTupleUnioncast   )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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_destr-   clone)indirect_referencepdf	Exceptionr
   _reference_cloner-   
isinstanceStreamObjectr5   appendhasattr)selfr0   r1   r2   arrdatadupr.   r.   C/tmp/pip-unpacked-wheel-ifm06wwb/PyPDF2/generic/_data_structures.pyr5   O   s"    

 
zArrayObject.cloner3   c                 C   s   t | S )zS
        Emulate DictionaryObject.items for a list
        (index, object)
        )	enumerater>   r.   r.   rB   itemsj   s    zArrayObject.itemsstreamencryption_keyr3   c                 C   s8   | d | D ]}| d ||| q| d d S )N   [    s    ])writewrite_to_stream)r>   rH   rI   r@   r.   r.   rB   rM   q   s
    

zArrayObject.write_to_streamc                 C   s   t ddd | || d S NwriteToStreamrM   3.0.0r   rM   r>   rH   rI   r.   r.   rB   rO   z   s    zArrayObject.writeToStreamrH   r7   forced_encodingr3   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!   rJ   zCould not read array   ])r-   readr   isspaceseekr<   read_object)rH   r7   rT   r?   tmptokZ	peekaheadr.   r.   rB   read_from_stream   s    


zArrayObject.read_from_streamrH   r7   r3   c                 C   s   t ddd t| |S NreadFromStreamr]   rP   )r   r-   r]   rH   r7   r.   r.   rB   r`      s    zArrayObject.readFromStream)Fr.   )N)__name__
__module____qualname__r   boolr	   r   strr   r5   r   r   rF   r   bytesrM   rO   staticmethodr   intr]   r`   r.   r.   r.   rB   r-   N   s<      
   r-   c                   @   sj  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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.   .Nr/   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 )r4   rj   Nr   )	r6   r7   r8   r
   r9   	__class__lenkeys_cloner>   r0   r1   r2   Zd__r.   r.   rB   r5      s    
 zDictionaryObject.clonesrcr0   r1   r2   r3   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 )
update the object from src/Next/Prev/N/V))rs   rt   )ru   rv   rj   Nr6   r5   )listr:   raw_getr$   r
   r9   rk   r<   AssertionErrorr6   r%   r8   rn   rF   r;   r=   r5   )r>   rq   r0   r1   r2   lstkobjsZcur_objZprev_objZclonscvvvr.   r.   rB   rn      sz    
 


zDictionaryObject._clone)keyr3   c                 C   s   t | |S N)dict__getitem__r>   r   r.   r.   rB   rx      s    zDictionaryObject.raw_get)r   valuer3   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.   rB   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.   rB   r     s
    

zDictionaryObject.setdefaultc                 C   s   t | | S r   )r   r   
get_objectr   r.   r.   rB   r   	  s    zDictionaryObject.__getitem__rC   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.
        @return 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.   rB   xmp_metadata  s    
zDictionaryObject.xmp_metadatac                 C   s   t ddd | jS )W
        .. deprecated:: 1.28.3

            Use :meth:`xmp_metadata` instead.
        getXmpMetadatar   rP   r   r   rE   r.   r.   rB   r   #  s    zDictionaryObject.getXmpMetadatac                 C   s   t ddd | jS )r   xmpMetadatar   rP   r   rE   r.   r.   rB   r   .  s    zDictionaryObject.xmpMetadatarG   c                 C   sZ   | d t|  D ]4\}}||| | d ||| | d q| d d S )N   <<
rK      
   >>)rL   rw   rF   rM   )r>   rH   rI   r   r   r.   r.   rB   rM   8  s    

z DictionaryObject.write_to_streamc                 C   s   t ddd | || d S rN   rQ   rR   r.   r.   rB   rO   C  s    zDictionaryObject.writeToStreamrS   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rL| ddkrL| 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rz|  }||}| 
|d |  }| ||d< t	| }| d}|| dkrX|  }| 
dd | d }|dkr|d d d |d< n\|js| 
|d || ||d< |  }n0| 
|d td!t|   d"|d#|d$n| 
|d d|krlt|S t }
|
| |
S d S )%N)pp1rem_gensr7   r3   c                    sb   |j |d  }|D ]$}||| kr| || k r|| }qt|dkrH|S  | ||dd  |S d S )Nr   r!   )xrefrl   )r   r   r   r7   loget_next_obj_posr.   rB   r   O  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   rW   findr   rY   )rH   r7   Zeoncurrrwr   r   r.   rB   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 '<<'       %rU   r!      >z+Multiple definitions in dictionary at byte z	 for key    s   s   treamrK   )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').)ri   r   r   r   rg   rW   r   r   r   r   rY   r   r    r   rZ   r8   strict__repr__r   rb   rj   updater   SALENGTHr:   r$   r   r;   initialize_from_dictionary)rH   r7   rT   r   r[   r@   r\   r   r   excretvalmsgposr}   eollengthtZpstarteZndstreamendr.   r   rB   r]   I  s       

















z!DictionaryObject.read_from_streamr^   c                 C   s   t ddd t| |S r_   )r   rj   r]   ra   r.   r.   rB   r`     s    zDictionaryObject.readFromStream)Fr.   )N)N)rb   rc   rd   r   re   r	   r   rf   r   r5   rn   r   rx   r   r   r   r(   r   propertyr   r   r   r   rg   rM   rO   rh   r   ri   r]   r`   r.   r.   r.   rB   rj      s\     @
     rj   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 )#
TreeObjectNrC   c                 C   s   t |  d S r   )rj   __init__rE   r.   r.   rB   r     s    zTreeObject.__init__c                 C   s   t ddd |  S )NhasChildrenhas_children4.0.0)r   r   rE   r.   r.   rB   r     s    zTreeObject.hasChildrenc                 C   s   d| kS )N/Firstr.   rE   r.   r.   rB   r     s    zTreeObject.has_childrenc                 C   s   |   S r   )childrenrE   r.   r.   rB   __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.   rB   r     s    zTreeObject.children)r   r7   r3   c                 C   s   t ddd | || d S )NaddChild	add_childrP   )r   r   r>   r   r7   r.   r.   rB   r     s    zTreeObject.addChildc                 C   s   |  |d | d S r   )insert_childr   r.   r.   rB   r     s    zTreeObject.add_child)r   beforer7   r3   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nr3   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'   ri   r%   r   )r   r   inc_parent_counterr.   rB   r     s    z3TreeObject.insert_child.<locals>.inc_parent_counterr   r   r   r   r   r!   rs   rt   rj   r   )r	   r$   r   ri   r   r6   r%   r'   r   r
   r:   rj   ry   r8   )r>   r   r   r7   	child_objprevr.   r   rB   r     sN     
zTreeObject.insert_child)r   r3   c                 C   s   t ddd | | d S )NremoveChildremove_childrP   )r   r   )r>   r   r.   r.   rB   r   4  s    zTreeObject.removeChild)r   prev_refcurlastr3   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.rs   Nrt   r   r   r!   r   )r   r%   r   r'   ry   )r>   r   r   r   r   Znext_refZnext_objr.   r.   rB   _remove_node_from_tree8  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   r6   r%   r   r   _reset_node_tree_relationship)
r>   r   r   foundr   r   Zcur_refr   Zlast_refr   r.   r.   rB   r   [  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   rE   r.   r.   rB   remove_from_tree  s    
zTreeObject.remove_from_treec                 C   s   t ddd |   d S )N	emptyTree
empty_treer   )r   r   rE   r.   r.   rB   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.   rB   r     s    


zTreeObject.empty_tree)rb   rc   rd   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   rB   r     s&   7   #%	r   )r   r3   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.
    r   rs   rt   N)r%   )r   r.   r.   rB   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;   NrC   c                 C   s   d | _ d | _d S r   )_StreamObject__datadecoded_selfrE   r.   r.   rB   r     s    zStreamObject.__init__.rp   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 )rr   r;   NT)r
   _datar   r5   r8   superrn   )r>   rq   r0   r1   r2   r   rk   r.   rB   rn     s    zStreamObject._clonec                    s   t   }|t| j7 }|S r   )r   hash_value_datar   r   r>   r@   r   r.   rB   r     s    
zStreamObject.hash_value_dataDecodedStreamObjectc                 C   s   t ddd | jS NdecodedSelfr   rP   r   r   rE   r.   r.   rB   r     s    zStreamObject.decodedSelfr   r3   c                 C   s   t ddd || _d S r   r   r>   r   r.   r.   rB   r     s    c                 C   s   | j S r   r   rE   r.   r.   rB   r     s    zStreamObject._datac                 C   s
   || _ d S r   r   r   r.   r.   rB   r     s    rG   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'   rl   r   r%   r   r   rj   rM   rL   Z	_securityr   )r>   rH   rI   r@   r   r.   r.   rB   rM     s    


zStreamObject.write_to_stream)EncodedStreamObjectr   r@   r3   c                 C   s
   t | S r   )r;   r   )r@   r.   r.   rB   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   )r@   r   r.   r.   rB   r     s    


z'StreamObject.initialize_from_dictionaryr   c                 C   s   t ddd |  S )NflateEncodeflate_encoderP   )r   r   rE   r.   r.   rB   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.   rB   r     s    



zStreamObject.flate_encode)rb   rc   rd   r   rj   r   re   r	   r   rf   r   rn   rg   r   r   r   r   setterr   r   r   rM   rh   r   r   r   r   r   __classcell__r.   r.   r   rB   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   rC   c                 C   s   | j S r   r   rE   r.   r.   rB   get_data  s    zDecodedStreamObject.get_datar   c                 C   s
   || _ d S r   r  r   r.   r.   rB   set_data  s    zDecodedStreamObject.set_datac                 C   s   t ddd | jS NgetDatar  rP   )r   r   rE   r.   r.   rB   r    s    zDecodedStreamObject.getDataNc                 C   s   t ddd | | d S NsetDatar  rP   r   r  r   r.   r.   rB   r    s    zDecodedStreamObject.setData)rb   rc   rd   r   r  r  r  r  r.   r.   r.   rB   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   NrC   c                 C   s
   d | _ d S r   )r   rE   r.   r.   rB   r   $  s    zEncodedStreamObject.__init__r   c                 C   s   t ddd | jS r   r   rE   r.   r.   rB   r   '  s    zEncodedStreamObject.decodedSelfr   c                 C   s   t ddd || _d S r   r   r   r.   r.   rB   r   ,  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   rF   r   r   r   ZDECODE_PARMS)r>   r
  decodedr   r   r.   r.   rB   r  1  s    



zEncodedStreamObject.get_datac                 C   s   t ddd |  S r  )r   r  rE   r.   r.   rB   r  B  s    zEncodedStreamObject.getDatar   c                 C   s   t dd S )Nz7Creating EncodedStreamObject is not currently supported)r   r   r.   r.   rB   r  F  s    zEncodedStreamObject.set_datac                 C   s   t ddd | |S r  r	  r   r.   r.   rB   r  I  s    zEncodedStreamObject.setData)rb   rc   rd   r   r   r   r   r   r   r	   rf   rg   r  r  r   r  r  r.   r.   r.   rB   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 )ContentStreamNrS   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   rU   r   )r7   
operationsr   r:   r-   r   r  rl   r   ry   rT   $_ContentStream__parse_content_stream)	r>   rH   r7   rT   r@   r}   Zstream_bytesZstream_dataZstream_data_bytesr.   r.   rB   r   O  s"    


zContentStream.__init__Fr.   .r/   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 )r4   r  N)r6   r7   r8   r
   r9   rk   rn   ro   r.   r.   rB   r5   o  s    
 zContentStream.clonerp   c                 C   s*   || _ ttd|j| _td|j| _dS )rr   r  N)r7   rw   r
   r  rT   )r>   rq   r0   r1   r2   r.   r.   rB   rn     s    zContentStream._clone)rH   r3   c                 C   s   | dd g }t|}|dks|dkr*q| dd | sF|dkrt|tjd}|dkr|g ksht| |}| j	|df q| j	||f g }q|d	kr|d
kr|
d}qq|	t|d | j qd S )Nr   r  rU   r!   )   '   "T   BI   INLINE IMAGEr   r   r   )rY   r   isalphar   r%   Zdelimiter_patternry   _read_inline_imager  r<   rW   rZ   rT   )r>   rH   operandspeekoperatoriir.   r.   rB   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rv||	d |	 tkrv|d}||
 }d}|tkrFd}||7 }|d}q"|r^|dd qn|dd |
| q~|dd |
| q~|| dS )NrU   r!      I   r   s   IDi    zUnexpected end of stream   Er   FT)settingsr@   )rj   r   rY   rZ   r7   rW   ry   r   r   r   rL   rl   r   getvalue)r>   rH   r  r\   r   r   r[   r@   buflocZtok2Ztok3infoZhas_q_whitespacer.   r.   rB   r    sN    





 

z ContentStream._read_inline_imagerC   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   s   ID r@   s   EIrK   r   )r   r  rL   rM   r  r   )r>   newdatar  r  Zdicttextopr.   r.   rB   r     s     

zContentStream._datar   c                 C   s   |  tt| d S r   )r  r   r   r   r.   r.   rB   r     s    )N)Fr.   )rb   rc   rd   r   r	   rf   r   r   ri   r   re   r   r5   rj   r   rn   r   r  r  r   rg   r   r   r.   r.   r.   rB   r  N  s6    #  <r  rS   c              	   C   s  |  d}| dd |dkr*t| |S |dkrl|  d}| dd |dkr^t| ||S t| |S nV|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r@|dkr |  d}t
|dk rtd qt| }| dd t| ||S |dkr|  d}| t
| d t|d k	rt| |S t| S n4| dd td|d|   d|  d  d S )Nr!   rU      /   <r   r#  r   rJ      t   f   (   e   s   endobji   nr   r  r   zFile ended unexpectedly.s   0123456789+-.   iz(Invalid Elementary Object starting with z @z: P   )rW   rY   r%   r]   rj   r+   r-   r"   r,   r&   rl   r    r   rZ   IndirectPatternmatchr$   r'   r   r   r   )rH   r7   rT   r\   r  r.   r.   rB   rZ     sN    









"rZ   c                   @   sr  e Zd ZdZe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	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()<PyPDF2.PdfReader.get_fields>`
    Nr   c              	   C   sR   t |  t t  }|D ].}z|| | t|< W q tk
rJ   Y qX qd S r   )rj   r   r   
attributesr   r%   KeyError)r>   r@   Zfield_attributesattrr.   r.   rB   r   E  s    
zField.__init__rC   c                 C   s   |  tjS )z4Read-only property accessing the type of this field.)r   r   r   rE   r.   r.   rB   
field_typeR  s    zField.field_typec                 C   s   t ddd | jS )zX
        .. deprecated:: 1.28.3

            Use :py:attr:`field_type` instead.
        	fieldTyper6  rP   )r   r6  rE   r.   r.   rB   r7  W  s    zField.fieldTypec                 C   s   |  tjS )z6Read-only property accessing the parent of this field.)r   r   ZParentrE   r.   r.   rB   r   a  s    zField.parentr-   c                 C   s   |  tjS )z4Read-only property accessing the kids of this field.)r   r   ZKidsrE   r.   r.   rB   kidsf  s    z
Field.kidsc                 C   s   |  tjS )z4Read-only property accessing the name of this field.)r   r   TrE   r.   r.   rB   namek  s    z
Field.namec                 C   s   |  tjS )z>Read-only property accessing the alternate name of this field.)r   r   ZTUrE   r.   r.   rB   alternate_namep  s    zField.alternate_namec                 C   s   t ddd | jS )z\
        .. deprecated:: 1.28.3

            Use :py:attr:`alternate_name` instead.
        altNamer;  rP   )r   r;  rE   r.   r.   rB   r<  u  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 PyPDF2 as a key in the dictionary returned by
        :meth:`get_fields()<PyPDF2.PdfReader.get_fields>`
        )r   r   ZTMrE   r.   r.   rB   mapping_name  s    zField.mapping_namec                 C   s   t ddd | jS )zZ
        .. deprecated:: 1.28.3

            Use :py:attr:`mapping_name` instead.
        mappingNamer=  rP   )r   r=  rE   r.   r.   rB   r>    s    zField.mappingNamec                 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FfrE   r.   r.   rB   flags  s    zField.flagsc                 C   s   |  tjS )zr
        Read-only property accessing the value of this field. Format
        varies based on field type.
        )r   r   VrE   r.   r.   rB   r     s    zField.valuec                 C   s   |  tjS )z=Read-only property accessing the default value of this field.)r   r   ZDVrE   r.   r.   rB   default_value  s    zField.default_valuec                 C   s   t ddd | jS )z[
        .. deprecated:: 1.28.3

            Use :py:attr:`default_value` instead.
        defaultValuerA  rP   )r   rA  rE   r.   r.   rB   rB    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AArE   r.   r.   rB   additional_actions  s    zField.additional_actionsc                 C   s   t ddd | jS )z`
        .. deprecated:: 1.28.3

            Use :py:attr:`additional_actions` instead.
        additionalActionsrC  rP   )r   rC  rE   r.   r.   rB   rD    s    zField.additionalActions)rb   rc   rd   __doc__r   rf   r   r   r   r   r%   r6  r7  rj   r   r8  r:  r;  r<  r=  r>  ri   r?  r   rA  rB  rC  rD  r.   r.   r.   rB   r2  =  s@   				r2  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.

    :param str title: Title of this destination.
    :param IndirectObject page: Reference to the page of this destination. Should
        be an instance of :class:`IndirectObject<PyPDF2.generic.IndirectObject>`.
    :param Fit fit: How the destination is displayed.
    :raises PdfReadError: If destination type is invalid.


    Nnodechilds)titlepagefitr3   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_argsrj   r   r)   r%   TALEFTZTOPTFZFIT_RZBOTTOMRIGHTZFIT_HZFIT_BHr8   r&   ZFIT_VZFIT_BVZFITZFIT_Br   )r>   rI  rJ  rK  typargsr.   r.   rB   r     sD    


zDestination.__init__r-   rC   c                    s(   t  d d g fdddD  S )NrM  rN  c                    s   g | ]}| kr | qS r.   r.   ).0xrE   r.   rB   
<listcomp>  s   z*Destination.dest_array.<locals>.<listcomp>)/Left/Bottom/Right/ToprO  )r-   rx   rE   r.   rE   rB   
dest_array  s    
zDestination.dest_arrayc                 C   s   t ddd | jS )zX
        .. deprecated:: 1.28.3

            Use :py:attr:`dest_array` instead.
        getDestArrayr]  rP   )r   r]  rE   r.   r.   rB   r^    s    zDestination.getDestArrayrG   c                 C   s   | d td}||| | d | j}||| td}||| | d td}||| | d | d d S )Nr   z/DrK   z/Sz/GoTor   r   )rL   r%   rM   r]  )r>   rH   rI   r   r   Zvalue_sr.   r.   rB   rM     s    



zDestination.write_to_streamc                 C   s
   |  dS )z3Read-only property accessing the destination title.rL  r   rE   r.   r.   rB   rI  *  s    zDestination.titlec                 C   s
   |  dS )z9Read-only property accessing the destination page number.rM  r_  rE   r.   r.   rB   rJ  /  s    zDestination.pagec                 C   s
   |  dS )z2Read-only property accessing the destination type.rN  r_  rE   r.   r.   rB   rT  4  s    zDestination.typc                 C   s   |  ddS )z-Read-only property accessing the zoom factor.rO  Nr_  rE   r.   r.   rB   zoom9  s    zDestination.zoomc                 C   s   |  ddS )z<Read-only property accessing the left horizontal coordinate.rY  Nr_  rE   r.   r.   rB   left>  s    zDestination.leftc                 C   s   |  ddS )z=Read-only property accessing the right horizontal coordinate.r[  Nr_  rE   r.   r.   rB   rightC  s    zDestination.rightc                 C   s   |  ddS )z9Read-only property accessing the top vertical coordinate.r\  Nr_  rE   r.   r.   rB   topH  s    zDestination.topc                 C   s   |  ddS )z<Read-only property accessing the bottom vertical coordinate.rZ  Nr_  rE   r.   r.   rB   bottomM  s    zDestination.bottomc                 C   s"   |  dttdtdtdgS )zGRead-only property accessing the color in (R, G, B) with values 0.0-1.0z/Cr   )r   r-   r#   rE   r.   r.   rB   colorR  s     zDestination.colorc                 C   s   |  ddS )zDRead-only property accessing the font type. 1=italic, 2=bold, 3=bothz/Fr   r_  rE   r.   r.   rB   font_formatY  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   Nr_  rE   r.   r.   rB   outline_count^  s    zDestination.outline_count)&rb   rc   rd   rE  rG  r   rj   __annotations__rH  r   r   rf   r	   r'   r$   r&   r*   r   r   r]  r^  r   rg   rM   rI  ri   rJ  rT  r`  r#   ra  rb  rc  rd  re  r   rf  rg  r.   r.   r.   rB   rF    sP   
+

 rF  )N)N
__author____author_email__loggingreior   typingr   r   r   r   r   r   r	   r
   Z
_protocolsr   _utilsr   r   r   r   r   r   r   r   r   r   	constantsr   r   r   r   r   r   r   r   rP  r   rR  errorsr   r   r    _baser"   r#   r$   r%   r&   r'   r(   r)   Z_fitr*   r+   r,   	getLoggerrb   loggerZNumberSignscompiler0  rw   r-   r   rj   r   r   r;   r   r   r  rf   ri   rZ   r2  rF  r.   r.   r.   rB   <module>   sT   (0(


S  : Bl+ < 7 	