U
    <gx                     @   s  d dl Z 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	 d dl
mZmZmZmZmZmZmZmZ ejdd dkrd dl
mZ nd dl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  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e0e'Z1G dd de2e'Z3G d d! d!e2e'Z4e2e0d"d#d$Z5eeede(e*f  d%d&d'Z6dS )(    N)	unhexlify)log10)iter_unpack)AnyCallableClassVarDictOptionalSequenceUnioncast   )   
   )	TypeGuard_pdfdoc_encoding_rev)PdfObjectProtocolPdfWriterProtocol)
StreamTypedeprecate_no_replacementlogger_warningread_non_whitespaceread_until_regex)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edd
dZed 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   t | jj ddS )q
        Used to detect modified object.

        Returns:
            Hash considering type and value.

        z& does not implement .hash_bin() so farNNotImplementedError	__class____name__self r*   7/tmp/pip-unpacked-wheel-wu2fni14/pypdf/generic/_base.pyhash_bin>   s    zPdfObject.hash_binc                 C   s
   |    S N)encoder(   r*   r*   r+   hash_value_dataJ   s    zPdfObject.hash_value_datac                 C   s$   | j j d| |     S )N:)r&   r'   r   r/   	hexdigestr.   r(   r*   r*   r+   
hash_valueM   s    zPdfObject.hash_valuepdf_destr"   c                 C   s
   |  |S )a/  
        Clone object into pdf_dest (PdfWriterProtocol which is an interface for PdfWriter)
        without ensuring links. This is used in clone_document_from_root with incremental = True.

        Args:
          pdf_dest: Target to clone to.

        Returns:
          The cloned PdfObject

        )cloner)   r4   r*   r*   r+   	replicateS   s    zPdfObject.replicateFr*   r4   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 farNr$   r)   r4   r9   r:   r*   r*   r+   r5   d   s    zPdfObject.clone)r5   r4   r9   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 |jr|dk	r|j|jkr|jt|jkr|j}nt|jd }|dk	r6t	|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	st|S ||j
t	|j |j< z||j|d < W n, tk
rt   |j| t|j}Y nX t|d||_ |S )aX  
        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

        N   Z	PreventGCr   )r    pdf	ExceptionAttributeErrorincrementalZ_readeridnumlen_objectsid_id_translated
get_objectAssertionError
IndexErrorappendr   )r)   r5   r4   r9   indiobjr*   r*   r+   _reference_clone   sP    




zPdfObject._reference_clonec                 C   s   | S )zResolve indirect references.r*   r(   r*   r*   r+   rF      s    zPdfObject.get_objectNstreamencryption_keyr"   c                 C   s   t d S r-   )r%   r)   rO   rP   r*   r*   r+   write_to_stream   s    zPdfObject.write_to_stream)Fr*   )F)N)r'   
__module____qualname__hashlibsha1r   r   __annotations__r	   intr,   bytesr/   r2   r   r7   boolr
   r   strr5   r   r   rM   rF   r   rR   r*   r*   r*   r+   r   9   s<   
      :  r   c                   @   s   e Z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d dddZedddZd	S )
NullObjectFr*   r8   c                 C   s   t d| t ||S )Clone object into pdf_dest.r\   )r   rM   r\   r;   r*   r*   r+   r5      s     zNullObject.cloner!   c                 C   s   t | jfS r#   hashr&   r(   r*   r*   r+   r,      s    zNullObject.hash_binNrN   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   writerQ   r*   r*   r+   rR      s     zNullObject.write_to_streamrO   r"   c                 C   s    |  d}|dkrtdt S )N   rc   zCould not read Null object)readr   r\   )rO   Znulltxtr*   r*   r+   read_from_stream   s    
zNullObject.read_from_streamc                 C   s   dS )Nr\   r*   r(   r*   r*   r+   __repr__   s    zNullObject.__repr__)Fr*   )N)r'   rS   rT   r   rZ   r	   r
   r   r[   rX   r5   r,   r   rY   rR   staticmethodrh   ri   r*   r*   r*   r+   r\      s$       	r\   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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 r-   rm   )r)   rm   r*   r*   r+   __init__   s    zBooleanObject.__init__Fr*   r8   c                 C   s   t d| t| j||S )r]   rk   )r   rM   rk   rm   r;   r*   r*   r+   r5      s    zBooleanObject.cloner!   c                 C   s   t | j| jfS r^   )r`   r&   rm   r(   r*   r*   r+   r,     s    zBooleanObject.hash_bin)or"   c                C   s2   t |tr| j|jkS t |tr*| j|kS dS d S )NF)
isinstancerk   rm   rZ   r)   rp   r*   r*   r+   __eq__  s
    


zBooleanObject.__eq__c                 C   s   | j r
dS dS )NTrueFalsern   r(   r*   r*   r+   ri     s    zBooleanObject.__repr__rN   c                 C   s2   |d k	rt dd | jr$|d n
|d d S )Nra   rb      trues   false)r   rm   rd   rQ   r*   r*   r+   rR     s     zBooleanObject.write_to_streamre   c                 C   s@   |  d}|dkrtdS |dkr4|  d tdS tdd S )Nrf   rv   Ts   falsr<   FzCould not read Boolean object)rg   rk   r   )rO   wordr*   r*   r+   rh   "  s    

zBooleanObject.read_from_stream)Fr*   )N)r'   rS   rT   r   ro   r   rZ   r	   r
   r   r[   rX   r5   r,   objectrs   ri   r   rY   rR   rj   rh   r*   r*   r*   r+   rk      s(     
  rk   c                   @   st  e Zd ZeeeddddZedddZeddd	Zed
dddZ	d7e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e
dd"d#Ze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/d0Zd8eedee f dd1d2d3Z!e"eed d4d5d6Z#dS )9r   N)rA   
generationr=   r"   c                 C   s   || _ || _|| _d S r-   )rA   ry   r=   )r)   rA   ry   r=   r*   r*   r+   ro   /  s    zIndirectObject.__init__r!   c                 C   s   t | j| jt| jfS r-   )r`   rA   ry   rD   r=   r(   r*   r*   r+   __hash__4  s    zIndirectObject.__hash__c                 C   s   t | j| j| jt| jfS r^   )r`   r&   rA   ry   rD   r=   r(   r*   r*   r+   r,   7  s    zIndirectObject.hash_binr   r3   c                 C   s   t | j| j|S r-   )r   rA   ry   r6   r*   r*   r+   r7   A  s    zIndirectObject.replicateFr*   r8   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 )r]   N)r=   rD   rE   rA   rF   rG   r    r   ry   r\   rq   Z_add_objectr5   )r)   r4   r9   r:   dupZidrefrL   r*   r*   r+   r5   G  s,    zIndirectObject.clonec                 C   s   | S r-   r*   r(   r*   r*   r+   r    k  s    z!IndirectObject.indirect_referencec                 C   s   | j | S r-   )r=   rF   r(   r*   r*   r+   rF   o  s    zIndirectObject.get_object)memor"   c                 C   s   t | j| j| jS r-   )r   rA   ry   r=   )r)   r|   r*   r*   r+   __deepcopy__r  s    zIndirectObject.__deepcopy__c                 C   s0   |   }t|tr,t|   d|  |S )Nz references an IndirectObject )rF   rq   r   r   ri   rr   r*   r*   r+   _get_object_with_checku  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)getattrr~   r?   )r)   r   r*   r*   r+   __getattr__~  s    
zIndirectObject.__getattr__)keyr"   c                 C   s   |   | S r-   r~   r)   r   r*   r*   r+   __getitem__  s    zIndirectObject.__getitem__c                 C   s   ||   kS r-   r   r   r*   r*   r+   __contains__  s    zIndirectObject.__contains__c                 C   s   |    S r-   )rF   	__float__r(   r*   r*   r+   r     s    zIndirectObject.__float__c                 C   s   |    S r-   )rF   __int__r(   r*   r*   r+   r     s    zIndirectObject.__int__c                 C   s   |    S r-   )rF   __str__r(   r*   r*   r+   r     s    zIndirectObject.__str__c                 C   s"   d| j d| jdt| j dS )NzIndirectObject(z, ))rA   ry   rD   r=   r(   r*   r*   r+   ri     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 r-   )rq   r   rA   ry   r=   r)   r   r*   r*   r+   rs     s    


zIndirectObject.__eq__c                 C   s   |  | S r-   )rs   r   r*   r*   r+   __ne__  s    zIndirectObject.__ne__rN   c                 C   s4   |d k	rt dd || j d| j d  d S )Nra   rb    z R)r   rd   rA   ry   r.   rQ   r*   r*   r+   rR     s     zIndirectObject.write_to_streamrO   r=   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    r<      Rz0Error reading indirect object reference at byte )
rg   r   r   isspacer   r   hextellr   rX   )rO   r=   rA   tokry   rr*   r*   r+   rh     s,    



zIndirectObject.read_from_stream)Fr*   )N)$r'   rS   rT   rX   r   ro   rz   r,   r   r7   rZ   r	   r
   r   r[   r5   propertyr    rF   r}   r~   r   r   r   r   r   r   ri   rx   rs   r   r   rY   rR   rj   rh   r*   r*   r*   r+   r   .  sH   	  $			  	r      c                   @   s   e Zd Zd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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)rm   contextr"   c              
   C   sd   zt |}t | |W S  tk
r^ } 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        )float__new__r>   r   r'   )clsrm   r   er*   r*   r+   r     s     zFloatObject.__new__Fr*   r8   c                 C   s   t d| t| ||S )r]   r   )r   rM   r   r;   r*   r*   r+   r5     s    zFloatObject.cloner!   c                 C   s   t | j| jfS r^   r`   r&   
as_numericr(   r*   r*   r+   r,     s    zFloatObject.hash_binc                 C   sF   | dkrdS t ttt|  }| dtd| ddd}|S )Nr   r   .r<   f0)FLOAT_WRITE_PRECISIONrX   r   absmaxrstrip)r)   nbsr*   r*   r+   myrepr  s
    "zFloatObject.myreprc                 C   s   |   S r-   )r   r(   r*   r*   r+   ri     s    zFloatObject.__repr__c                 C   s   t | S r-   )r   r(   r*   r*   r+   r      s    zFloatObject.as_numericrN   c                 C   s*   |d k	rt dd ||  d d S Nra   rb   utf8)r   rd   r   r.   rQ   r*   r*   r+   rR     s     zFloatObject.write_to_stream)r   N)Fr*   )N)r'   rS   rT   r   r	   r   rZ   r
   r   r[   rX   r5   r,   r   ri   r   r   r   rY   rR   r*   r*   r*   r+   r     s2         
  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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]rl   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   )rX   r   
ValueErrorr   r'   )r   rm   r*   r*   r+   r     s
    zNumberObject.__new__Fr*   r8   c                 C   s   t d| t| ||S )r]   r   )r   rM   r   r;   r*   r*   r+   r5     s    zNumberObject.cloner!   c                 C   s   t | j|  fS r^   r   r(   r*   r*   r+   r,   #  s    zNumberObject.hash_binc                 C   s   t t| dS )Nr   )rX   reprr.   r(   r*   r*   r+   r   -  s    zNumberObject.as_numericNrN   c                 C   s*   |d k	rt dd |t| d d S r   )r   rd   r   r.   rQ   r*   r*   r+   rR   0  s     zNumberObject.write_to_stream)r   r   re   c                 C   s$   t | tj}d|krt|S t|S )N   .)r   r   NumberPatternr   )rO   numr*   r*   r+   rh   9  s    zNumberObject.read_from_stream)Fr*   )N)r'   rS   rT   recompiler   r   r   rZ   r	   r
   r   r[   rX   r5   r,   r   r   rY   rR   rj   rh   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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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*   r8   c                 C   s   t d| tt| ||S )r]   r   )r   rM   r   rY   r;   r*   r*   r+   r5   J  s    
  zByteStringObject.cloner!   c                 C   s   t | jt| fS r^   )r`   r&   rY   r(   r*   r*   r+   r,   X  s    zByteStringObject.hash_binc                 C   s   | S )z7For compatibility with TextStringObject.original_bytes.r*   r(   r*   r*   r+   original_bytesb  s    zByteStringObject.original_bytesNrN   c                 C   s:   |d k	rt dd |d |t|  |d d S )Nra   rb      <   >)r   rd   binasciihexlifyrQ   r*   r*   r+   rR   g  s     
z ByteStringObject.write_to_streamc              	   C   sJ   dt tj}|D ]*}z| |W   S  tk
r:   Y qX qtdd S )Nutf-16zCannot decode ByteStringObject.)r   )list
NameObjectCHARSETSdecodeUnicodeDecodeErrorr   )r)   Zcharset_to_tryencr*   r*   r+   r   r  s    zByteStringObject.__str__)Fr*   )N)r'   rS   rT   __doc__r   rZ   r	   r
   r   r[   rX   r5   r,   r   rY   r   r   rR   r   r*   r*   r*   r+   r   A  s&     
  r   c                   @   s   e Zd ZU dZeed< eed< eed< dZee ed< 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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.
    autodetect_pdfdocencodingautodetect_utf16	utf16_bomN_original_bytesrl   c              
   C   s  d }t |tr|}|d}t| |}||_d|_d|_d|_|	dr|d k	sVt
zt| |d}W nV tk
r } z8t|d|jt t| |jd |j d}W 5 d }~X Y nX ||_d|_|d d |_n8zt| d|_W n$ tk
r   d|_tj|_Y nX |S )	NcharmapFr   )u   þÿu   ÿþr   z
initial string:Tr   )rq   rY   r   r[   r   r   r   r   r   
startswithrG   r   r   rx   r'   startencode_pdfdocencodingUnicodeEncodeErrorcodecsBOM_UTF16_BE)r   rm   orgrp   excr*   r*   r+   r     s:    


0
zTextStringObject.__new__Fr*   r8   c                 C   s<   t | }| j|_| j|_| j|_| j|_td| |||S )r]   r   )r   r   r   r   r   r   rM   )r)   r4   r9   r:   rL   r*   r*   r+   r5     s     zTextStringObject.cloner!   c                 C   s   t | j| jfS r^   )r`   r&   r   r(   r*   r*   r+   r,     s    zTextStringObject.hash_binc                 C   s   | j dk	r| j S |  S d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.
        N)r   get_original_bytesr(   r*   r*   r+   r     s    
zTextStringObject.original_bytesc                 C   sd   | j rJ| jtjkr"tj| d S | jtjkr>tj| d S | dS n| jrXt| S tdd S )Nutf-16leutf-16bez#no information about original bytes)	r   r   r   BOM_UTF16_LEr.   r   r   r   r>   r(   r*   r*   r+   r     s    z#TextStringObject.get_original_bytesc                 C   s   z4| j d k	r| j W S | jr*tdddddt| }W nZ tk
r   | jtjkrbtj| d }n(| jtjkrtj| d }n
| d}Y nX |S )N Zforcedr   r   )	r   r   r   r   r   r   r   r.   r   )r)   bytearrr*   r*   r+   get_encoded_bytes  s    
z"TextStringObject.get_encoded_bytesrN   c                 C   s~   |d k	rt dd |  }|d td|D ]@}tt|d }| sd|dkrd|dt|  q.|| q.|d d S )	Nra   rb      (cr       s   \%03o   ))r   r   rd   r   r   rY   isalnumord)r)   rO   rP   r   Zc_r   r*   r*   r+   rR     s     
z TextStringObject.write_to_stream)Fr*   )N)r'   rS   rT   r   rZ   rW   rY   r   r	   r   r   r
   r   r[   rX   r5   r,   r   r   r   r   r   rR   r*   r*   r*   r+   r   |  s2   
#  
  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e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 )$r   s   \s+|[\(\)<>\[\]{}/%]   /s   #23s   #28s   #29s   #2Fs   #25)#(r   /%c                 C   s"   i | ]}t |d |d qS )r   02X)chrr.   ).0rK   r*   r*   r+   
<dictcomp>  s      zNameObject.<dictcomp>!   renumber_tableFr*   r8   c                 C   s   t d| t| ||S )r]   r   )r   rM   r   r;   r*   r*   r+   r5     s    zNameObject.cloner!   c                 C   s   t | j| fS r^   r_   r(   r*   r*   r+   r,   $  s    zNameObject.hash_binNrN   c                 C   s$   |d k	rt dd ||   d S )Nra   rb   )r   rd   renumberrQ   r*   r*   r+   rR   .  s     zNameObject.write_to_streamc              	   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 '/': (r   z6.0.0r<   ~r   r   )r.   r   r   KeyError)r)   outr   xr*   r*   r+   r   7  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   r<   r   )findr   r   )r   rK   r*   r*   r+   unnumberI  s    4zNameObject.unnumber)r   gbklatin1r   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 )
Nr<   zName read errorr   r   zCode Not Foundz!Illegal character in NameObject (z-), you may need to adjust NameObject.CHARSETSr   z.). You may need to adjust NameObject.CHARSETS.)rg   r   surfixr   r   delimiter_patternr   r   r   r>   r   r   strictr   r'   )rO   r=   r   r   retr   r*   r*   r+   rh   X  s2    






zNameObject.read_from_stream)Fr*   )N)r'   rS   rT   r   r   r   r   ranger   r   r   r[   rY   rW   r   rZ   r	   r
   r   rX   r5   r,   r   rR   r   rj   r   r   rh   r*   r*   r*   r+   r     s>   

    	r   )unicode_stringr"   c              	   C   s>   zt dd | D W S  tk
r8   td| dddY nX d S )Nc                 S   s   g | ]}t | qS r*   r   )r   kr*   r*   r+   
<listcomp>z  s     z)encode_pdfdocencoding.<locals>.<listcomp>Zpdfdocencodingr   z#does not exist in translation table)rY   r   r   )r   r*   r*   r+   r   x  s    r   )r   r"   c                 C   s,   | dkp*t | to*|  dkp*t |  tS )z<
    Returns:
        True if x is None or NullObject.

    N)rq   r   rF   r\   )r   r*   r*   r+   is_null_or_none  s    
r   )7r   r   rU   r   sysr   mathr   structr   typingr   r   r   r   r	   r
   r   r   version_infor   Ztyping_extensions_codecsr   Z
_protocolsr   r   _utilsr   r   r   r   r   errorsr   r   r   
__author____author_email__r   r\   rk   r   r   r   r   rX   r   rY   r   r[   r   r   r   r   r*   r*   r*   r+   <module>   s@   ( *= !<4; l