U
    Nf_                     @   sn  d dl 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 ddl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 dd	lmZmZm Z  d
Z!dZ"G dd deZ#G dd de#Z$G dd de#Z%G dd de#Z&dZ'G dd de(e#Z)G dd de*e#Z+G dd de,e#Z-G dd de.e#Z/G dd de.e#Z0e.e,dd d!Z1dS )"    N)	unhexlify)log10)AnyCallableClassVarDictOptionalSequenceUnioncast   )_pdfdoc_encoding_rev)PdfObjectProtocolPdfWriterProtocol)
StreamTypeb_deprecate_no_replacementlogger_warningread_non_whitespaceread_until_regexstr_)STREAM_TRUNCATED_PREMATURELYPdfReadErrorPdfStreamErrorzMathieu Fenniakzbiziqe@mathieu.fenniak.netc                   @   s   e Zd ZU ejZed ed< ed ed< e	dddZ
e	ddd	Zdeeeeeeef   d dddZdeeeedddZed  dddZdeedee	f ddddZdS )	PdfObject).zhashlib._Hash	hash_funcIndirectObjectindirect_referencereturnc                 C   s   d|    S )Nz%s)encodeself r#   7/tmp/pip-unpacked-wheel-zevpxvmc/pypdf/generic/_base.pyhash_value_data9   s    zPdfObject.hash_value_datac                 C   s"   d| j j| |   f  S )Nz%s:%s)	__class____name__r   r%   	hexdigestr    r!   r#   r#   r$   
hash_value<   s    zPdfObject.hash_valueFr#   pdf_destforce_duplicateignore_fieldsr   c                 C   s   t | jj ddS )a  
        Clone object into pdf_dest (PdfWriterProtocol which is an interface for PdfWriter).

        By default, this method will call ``_reference_clone`` (see ``_reference``).


        Args:
          pdf_dest: Target to clone to.
          force_duplicate: By default, if the object has already been cloned and referenced,
            the copy will be returned; when ``True``, a new copy will be created.
            (Default value = ``False``)
          ignore_fields: List/tuple of field names (for dictionaries) that will be ignored
            during cloning (applies to children duplication as well). If fields are to be
            considered for a limited number of levels, you have to add it as integer, for
            example ``[1,"/B","/TOTO"]`` means that ``"/B"`` will be ignored at the first
            level only but ``"/TOTO"`` on all levels.

        Returns:
          The cloned PdfObject
        z! does not implement .clone so farN)NotImplementedErrorr&   r'   r"   r+   r,   r-   r#   r#   r$   cloneE   s    zPdfObject.clone)r0   r+   r,   r   c                 C   s  z|s|j j|kr|W S W n tk
r.   Y nX z
| j }W n tk
rR   | Y S X t|jd }|dk	 rt|j|jkri |jt|j< |j|jt|j d< |s|j|jt|j kr|	|jt|j |j }|dk	st
|S ||jt|j |j< |j| t|d||_ |S )aW  
        Reference the object within the _objects of pdf_dest only if
        indirect_reference attribute exists (which means the objects was
        already identified in xref/xobjstm) if object has been already
        referenced do nothing.

        Args:
          clone:
          pdf_dest:

        Returns:
          The clone
           NZ	PreventGCr   )r   pdf	ExceptionAttributeErrorlen_objectsid_id_translatedidnum
get_objectAssertionErrorappendr   )r"   r0   r+   r,   indiobjr#   r#   r$   _reference_clonec   s6    



zPdfObject._reference_clonec                 C   s   | S )zResolve indirect references.r#   r!   r#   r#   r$   r:      s    zPdfObject.get_objectNstreamencryption_keyr   c                 C   s   t d S N)r.   r"   rB   rC   r#   r#   r$   write_to_stream   s    zPdfObject.write_to_stream)Fr#   )F)N)r'   
__module____qualname__hashlibsha1r   r   __annotations__r   bytesr%   r)   r   boolr	   r
   strintr0   r   r   r@   r:   r   rF   r#   r#   r#   r$   r   4   s4   
     -  r   c                   @   sr   e Zd Zdeeeeeee	f   d dddZ
deedeef dddd	Zeed d
ddZedddZdS )
NullObjectFr#   r*   c                 C   s   t d| t ||S )Clone object into pdf_dest.rP   )r   r@   rP   r/   r#   r#   r$   r0      s     zNullObject.cloneNrA   c                 C   s    |d k	rt dd |d d S )N/the encryption_key parameter of write_to_stream5.0.0   null)r   writerE   r#   r#   r$   rF      s     zNullObject.write_to_streamrB   r   c                 C   s    |  d}|dkrtdt S )N   rT   zCould not read Null object)readr   rP   )rB   Znulltxtr#   r#   r$   read_from_stream   s    
zNullObject.read_from_streamr   c                 C   s   dS )NrP   r#   r!   r#   r#   r$   __repr__   s    zNullObject.__repr__)Fr#   )N)r'   rG   rH   r   rM   r   r	   r
   rN   rO   r0   r   rL   rF   staticmethodrY   rZ   r#   r#   r#   r$   rP      s"       	rP   c                   @   s   e Zd ZeddddZdeeeee	e
ef   d ddd	Zeed
ddZe
dddZdee	de
ef ddddZeed dddZdS )BooleanObjectNvaluer   c                 C   s
   || _ d S rD   r^   )r"   r^   r#   r#   r$   __init__   s    zBooleanObject.__init__Fr#   r*   c                 C   s   t d| t| j||S )rQ   r\   )r   r@   r\   r^   r/   r#   r#   r$   r0      s    zBooleanObject.clone)_BooleanObject__or   c                 C   s2   t |tr| j|jkS t |tr*| j|kS dS d S )NF)
isinstancer\   r^   rM   )r"   ra   r#   r#   r$   __eq__   s
    


zBooleanObject.__eq__r   c                 C   s   | j r
dS dS )NTrueFalser_   r!   r#   r#   r$   rZ      s    zBooleanObject.__repr__rA   c                 C   s2   |d k	rt dd | jr$|d n
|d d S )NrR   rS      trues   false)r   r^   rU   rE   r#   r#   r$   rF      s     zBooleanObject.write_to_streamrV   c                 C   s@   |  d}|dkrtdS |dkr4|  d tdS tdd S )NrW   rf   Ts   falsr1   FzCould not read Boolean object)rX   r\   r   )rB   wordr#   r#   r$   rY      s    

zBooleanObject.read_from_stream)Fr#   )N)r'   rG   rH   r   r`   r   rM   r   r	   r
   rN   rO   r0   objectrc   rZ   r   rL   rF   r[   rY   r#   r#   r#   r$   r\      s&       r\   c                   @   s  e Zd ZeeeddddZd*eeee	e
eef   d ddd	Zed d
ddZed d
ddZed dddZed d
ddZeedddZe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#Zd+ee
deef dd$d%d&Zeeed d'd(d)ZdS ),r   N)r9   
generationr2   r   c                 C   s   || _ || _|| _d S rD   )r9   ri   r2   )r"   r9   ri   r2   r#   r#   r$   r`      s    zIndirectObject.__init__Fr#   r*   c                 C   s   | j |kr|s| S t| j |jkr2i |jt| j < | j|jt| j  kr||jt| j  | j }|r|dk	stt|jdk	st|j}t|j|j|j S n@|  }|dkrt	 }t
| tfst| |_|||||}|dk	st|jdk	st|jS )rQ   N)r2   r7   r8   r9   r:   r;   r   r   ri   rP   rb   Z_add_objectr0   )r"   r+   r,   r-   dupZidrefr?   r#   r#   r$   r0      s,    zIndirectObject.cloner   c                 C   s   | S rD   r#   r!   r#   r#   r$   r     s    z!IndirectObject.indirect_referencer   c                 C   s   | j | S rD   )r2   r:   r!   r#   r#   r$   r:     s    zIndirectObject.get_object)memor   c                 C   s   t | j| j| jS rD   )r   r9   ri   r2   )r"   rk   r#   r#   r$   __deepcopy__  s    zIndirectObject.__deepcopy__c                 C   s0   |   }t|tr,t|   d|  |S )Nz references an IndirectObject )r:   rb   r   r   rZ   )r"   or#   r#   r$   _get_object_with_check!  s    
z%IndirectObject._get_object_with_check)namer   c                 C   s:   zt |  |W S  tk
r4   td| dY nX d S )NzNo attribute z* found in IndirectObject or pointed object)getattrrn   r4   )r"   ro   r#   r#   r$   __getattr__*  s    
zIndirectObject.__getattr__)keyr   c                 C   s   |   | S rD   )rn   )r"   rr   r#   r#   r$   __getitem__3  s    zIndirectObject.__getitem__c                 C   s   |    S rD   )r:   __str__r!   r#   r#   r$   rt   7  s    zIndirectObject.__str__c                 C   s"   d| j d| jdt| j dS )NzIndirectObject(z, ))r9   ri   r7   r2   r!   r#   r#   r$   rZ   ;  s    zIndirectObject.__repr__)otherr   c                 C   s6   |d k	o4t |to4| j|jko4| j|jko4| j|jkS rD   )rb   r   r9   ri   r2   r"   rv   r#   r#   r$   rc   >  s    


zIndirectObject.__eq__c                 C   s   |  | S rD   )rc   rw   r#   r#   r$   __ne__G  s    zIndirectObject.__ne__rA   c                 C   s4   |d k	rt dd || j d| j d  d S )NrR   rS    z R)r   rU   r9   ri   r    rE   r#   r#   r$   rF   J  s     zIndirectObject.write_to_streamrB   r2   r   c                 C   s   d}|  d}|stt| r$q.||7 }qd}|  d}|sHtt| rX|sbq2qb||7 }q2t| }|dkrtdt|   tt	|t	||S )N    r1      Rz0Error reading indirect object reference at byte )
rX   r   r   isspacer   r   hextellr   rO   )rB   r2   r9   tokri   rr#   r#   r$   rY   S  s,    



zIndirectObject.read_from_stream)Fr#   )N)r'   rG   rH   rO   r   r`   r   rM   r   r	   r
   rN   r0   propertyr   r:   rl   rn   rq   rs   rt   rZ   rh   rc   rx   r   rL   rF   r[   rY   r#   r#   r#   r$   r      s8     $			  	r      c                   @   s   e Zd Zdeeef ee d dddZdeeee	eee
f   d dd	d
ZedddZedddZedddZdeedeef ddddZdS )FloatObject0.0N)r^   contextr   c              
   C   sh   zt t|}t | |W S  tk
rb } z*t| d| dt t | d W Y S d }~X Y nX d S )Nz : FloatObject (z) invalid; use 0.0 insteadg        )floatr   __new__r3   r   r'   )clsr^   r   er#   r#   r$   r   s  s     zFloatObject.__new__Fr#   r*   c                 C   s   t d| t| ||S )rQ   r   )r   r@   r   r/   r#   r#   r$   r0     s    zFloatObject.cloner   c                 C   sF   | dkrdS t ttt|  }| dtd| ddd}|S )Nr   r   .r1   f0)FLOAT_WRITE_PRECISIONrO   r   absmaxrstrip)r"   nbsr#   r#   r$   myrepr  s
    "zFloatObject.myreprc                 C   s   |   S rD   )r   r!   r#   r#   r$   rZ     s    zFloatObject.__repr__c                 C   s   t | S rD   )r   r!   r#   r#   r$   
as_numeric  s    zFloatObject.as_numericrA   c                 C   s*   |d k	rt dd ||  d d S NrR   rS   utf8)r   rU   r   r    rE   r#   r#   r$   rF     s     zFloatObject.write_to_stream)r   N)Fr#   )N)r'   rG   rH   r
   rN   r   r   r   rM   r	   rO   r0   r   rZ   r   r   r   rL   rF   r#   r#   r#   r$   r   r  s0      
     r   c                   @   s   e Zd ZedZed dddZdeee	e
eeef   d ddd	Zed
ddZdeedeef ddddZeeed dddZdS )NumberObjects	   [^+-.0-9]r]   c                 C   sJ   zt | t |W S  tk
rD   td| dt t | d Y S X d S )NzNumberObject(z) invalid; use 0 insteadr   )rO   r   
ValueErrorr   r'   )r   r^   r#   r#   r$   r     s
    zNumberObject.__new__Fr#   r*   c                 C   s   t d| t| ||S )rQ   r   )r   r@   r   r/   r#   r#   r$   r0     s    zNumberObject.cloner   c                 C   s   t t| dS )Nr   )rO   reprr    r!   r#   r#   r$   r     s    zNumberObject.as_numericNrA   c                 C   s*   |d k	rt dd |t| d d S r   )r   rU   r   r    rE   r#   r#   r$   rF     s     zNumberObject.write_to_stream)r   r   rV   c                 C   s*   t | tj}|ddkr"t|S t|S )N   .)r   r   NumberPatternfindr   )rB   numr#   r#   r$   rY     s    zNumberObject.read_from_stream)Fr#   )N)r'   rG   rH   recompiler   r   r   rM   r   r	   r
   rN   rO   r0   r   r   rL   rF   r[   rY   r#   r#   r#   r$   r     s&   

    	r   c                   @   sf   e Zd ZdZdeeeeee	e
f   d dddZeeddd	Zdeed
e	ef d
dddZd
S )ByteStringObjecta>  
    Represents a string object where the text encoding could not be determined.

    This occurs quite often, as the PDF spec doesn't provide an alternate way to
    represent strings -- for example, the encryption data stored in files (like
    /O) is clearly not text, but is still stored in a "String" object.
    Fr#   r*   c                 C   s   t d| tt| ||S )rQ   r   )r   r@   r   rL   r/   r#   r#   r$   r0     s    
  zByteStringObject.cloner   c                 C   s   | S )z7For compatibility with TextStringObject.original_bytes.r#   r!   r#   r#   r$   original_bytes  s    zByteStringObject.original_bytesNrA   c                 C   s:   |d k	rt dd |d |t|  |d d S )NrR   rS      <   >)r   rU   binasciihexlifyrE   r#   r#   r$   rF     s     
z ByteStringObject.write_to_stream)Fr#   )N)r'   rG   rH   __doc__r   rM   r   r	   r
   rN   rO   r0   r   rL   r   r   rF   r#   r#   r#   r$   r     s"       r   c                   @   s   e Zd ZdZdeeeeee	e
f   d dddZdZdZeeddd	Zedd
dZedddZdeede	ef ddddZdS )TextStringObjectz
    A string object that has been decoded into a real unicode string.

    If read from a PDF document, this string appeared to match the
    PDFDocEncoding, or contained a UTF-16BE BOM mark to cause UTF-16 decoding
    to occur.
    Fr#   r*   c                 C   s,   t | }| j|_| j|_td| |||S )rQ   r   )r   autodetect_pdfdocencodingautodetect_utf16r   r@   )r"   r+   r,   r-   r?   r#   r#   r$   r0     s     zTextStringObject.cloner   c                 C   s   |   S )a-  
        It is occasionally possible that a text string object gets created where
        a byte string object was expected due to the autodetection mechanism --
        if that occurs, this "original_bytes" property can be used to
        back-calculate what the original encoded bytes were.
        )get_original_bytesr!   r#   r#   r$   r     s    zTextStringObject.original_bytesc                 C   s0   | j rtj| d S | jr$t| S tdd S )Nutf-16bez#no information about original bytes)r   codecsBOM_UTF16_BEr    r   encode_pdfdocencodingr3   r!   r#   r#   r$   r     s
    z#TextStringObject.get_original_bytesc                 C   s6   zt | }W n$ tk
r0   tj| d }Y nX |S )Nr   )r   UnicodeEncodeErrorr   r   r    )r"   bytearrr#   r#   r$   get_encoded_bytes'  s
    z"TextStringObject.get_encoded_bytesNrA   c                 C   sv   |d k	rt dd |  }|d |D ]>}t| sT|dkrT|d|   q(|tt| q(|d d S )NrR   rS      (    z\%03o   ))r   r   rU   chrisalnumr    r   )r"   rB   rC   r   cr#   r#   r$   rF   1  s     
z TextStringObject.write_to_stream)Fr#   )N)r'   rG   rH   r   r   rM   r   r	   r
   rN   rO   r0   r   r   r   rL   r   r   r   r   rF   r#   r#   r#   r$   r     s*     	  r   c                   @   s   e Zd ZU edZdZddddddd	d
 edD Ze	e
eef  ed< d eeeeeeef   d dddZd!eedeef ddddZedddZeeedddZdZeeed dddZdS )"
NameObjects   \s+|[\(\)<>\[\]{}/%]   /s   #23s   #28s   #29s   #2Fs   #25)#(ru   /%c                 C   s"   i | ]}t |d |d qS )r   02X)r   r    ).0r>   r#   r#   r$   
<dictcomp>O  s      zNameObject.<dictcomp>!   renumber_tableFr#   r*   c                 C   s   t d| t| ||S )rQ   r   )r   r@   r   r/   r#   r#   r$   r0   R  s    zNameObject.cloneNrA   c                 C   s$   |d k	rt dd ||   d S )NrR   rS   )r   rU   renumberrE   r#   r#   r$   rF   ^  s     zNameObject.write_to_streamr   c              	   C   s   | d  d}|dkr(td|  dd | dd  D ]h}|dkrf| dD ]}|d	|d
  7 }qJq4z|| j| 7 }W q4 tk
r   || d7 }Y q4X q4|S )Nr   utf-8r   z<Incorrect first char in NameObject, should start with '/': (ru   z6.0.0r1   ~r   r   )r    r   r   KeyError)r"   outr   xr#   r#   r$   r   g  s    
zNameObject.renumber)sinr   c                 C   s   |  dd}|dkr|zH| d | t| |d |d   | |d d   } |  d|d }W q tk
rx   |d }Y qX q| S )N   #r   r1      )r   r   r   )r   r>   r#   r#   r$   unnumbery  s    4zNameObject.unnumber)r   gbklatin1rz   c              
   C   s   |  d}|tjkrtd|t| tj7 }zZt|}tjD ]4}z||}t|W   W S  t	k
rp   Y q>X q>t
d|dddW nf tt
fk
r } zD|jstd|dt t|d W Y S td|d	|W 5 d }~X Y nX d S )
Nr1   zname read error r   zCode Not Foundz!Illegal character in NameObject (z-), you may need to adjust NameObject.CHARSETScharmapz.). You may need to adjust NameObject.CHARSETS.)rX   r   surfixr   r   delimiter_patternr   CHARSETSdecoder3   UnicodeDecodeErrorr   strictr   r'   )rB   r2   ro   encretr   r#   r#   r$   rY     s2    






zNameObject.read_from_stream)Fr#   )N)r'   rG   rH   r   r   r   r   ranger   r   r   rN   rL   rK   r   rM   r   r	   r
   rO   r0   r   rF   r   r[   r   r   rY   r#   r#   r#   r$   r   F  s<   

    	r   )unicode_stringr   c              
   C   sV   t  }| D ]B}z|ttt| 7 }W q
 tk
rJ   td|dddY q
X q
t|S )NZpdfdocencodingr   z#does not exist in translation table)	bytearrayr   r   r   r   r   rL   )r   retvalr   r#   r#   r$   r     s        r   )2r   r   rI   r   r   mathr   typingr   r   r   r   r   r	   r
   r   _codecsr   Z
_protocolsr   r   _utilsr   r   r   r   r   r   r   errorsr   r   r   
__author____author_email__r   rP   r\   r   r   r   r   rO   r   rL   r   rN   r   r   r   r#   r#   r#   r$   <module>   s0   ($	f 3 2*(Pb