U
    c]                     @   sf  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 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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'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ListOptionalTupleUnioncast   )_pdfdoc_encoding_rev)PdfObjectProtocolPdfWriterProtocol)	
StreamTypeb_deprecation_with_replacementhex_str	hexencode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df ee df d dddZeeedddZed  dddZed  dddZ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-u_n6aelj/pypdf/generic/_base.pyhash_value_data;   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$   .Npdf_destforce_duplicateignore_fieldsr    c                 C   s   t ddS )a  
        clone object into pdf_dest (PdfWriterProtocol which is an interface for PdfWriter)
        force_duplicate: in standard if the object has been already cloned and reference,
            the copy is returned; when force_duplicate == True,
            a new copy is always performed
        ignore_fields : list/tuple of Fields names (for dictionaries that will
            be ignored during cloning (apply also to childs duplication)
        in standard, clone function call _reference_clone (see _reference)

        Args:
          pdf_dest:
          force_duplicate:  (Default value = False)
          ignore_fields:

        Returns:
          The cloned PdfObject
        zclone PdfObjectN)	Exceptionr#   r,   r-   r.   r$   r$   r%   cloneG   s    zPdfObject.clone)r1   r,   r    c                 C   s   z|j j|kr|W S W n tk
r*   Y nX t| dr| j }t|jd }|dk	rt|j|jkrri |jt|j< |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
        r      Nr   )r   pdfr/   hasattrlen_objectsid_id_translatedidnum
get_objectAssertionErrorappendr   )r#   r1   r,   indiobjr$   r$   r%   _reference_clone`   s*    

zPdfObject._reference_clonec                 C   s   | S )zResolve indirect references.r$   r"   r$   r$   r%   r:      s    zPdfObject.get_objectc                 C   s   t ddd |  S )N	getObjectr:   3.0.0)r   r:   r"   r$   r$   r%   rA      s    zPdfObject.getObjectstreamencryption_keyr    c                 C   s   t d S N)NotImplementedErrorr#   rD   rE   r$   r$   r%   write_to_stream   s    zPdfObject.write_to_stream)Fr$   )r(   
__module____qualname__hashlibsha1r   r   __annotations__r   bytesr&   r*   r   boolr	   r   strr   r1   r   r   r@   r:   rA   r   rI   r$   r$   r$   r%   r   6   s,   
   & r   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eef ddd	d
Zee
d dddZe
edeef ddddZedddZee
d dddZdS )
NullObjectFr$   .Nr+   c                 C   s   t d| t |S )Clone object into pdf_dest.rR   )r
   r@   rR   r0   r$   r$   r%   r1      s    zNullObject.clonerC   c                 C   s   | d d S )N   null)writerH   r$   r$   r%   rI      s    zNullObject.write_to_streamrD   r    c                 C   s    |  d}|dkrtdt S )N   rT   zCould not read Null object)readr   rR   )rD   Znulltxtr$   r$   r%   read_from_stream   s    
zNullObject.read_from_streamc                 C   s   t ddd | || d S NwriteToStreamrI   rB   r   rI   rH   r$   r$   r%   r[      s    zNullObject.writeToStreamr   c                 C   s   dS )NrR   r$   r"   r$   r$   r%   __repr__   s    zNullObject.__repr__c                 C   s   t ddd t| S NreadFromStreamrY   rB   )r   rR   rY   rD   r$   r$   r%   r_      s    zNullObject.readFromStream)Fr$   )r(   rJ   rK   r   rP   r	   r   rQ   r   r1   r   rO   rI   staticmethodrY   r[   r]   r_   r$   r$   r$   r%   rR      s*     
  rR   c                   @   s   e Zd Zeddd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	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ed dddZeed dddZdS )BooleanObjectNvaluer    c                 C   s
   || _ d S rF   rd   )r#   rd   r$   r$   r%   __init__   s    zBooleanObject.__init__Fr$   .r+   c                 C   s   t d| t| j|S )rS   rb   )r
   r@   rb   rd   r0   r$   r$   r%   r1      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)
isinstancerb   rd   rP   )r#   rg   r$   r$   r%   __eq__   s
    


zBooleanObject.__eq__r   c                 C   s   | j r
dS dS )NTrueFalsere   r"   r$   r$   r%   r]      s    zBooleanObject.__repr__rC   c                 C   s    | j r|d n
|d d S )N   trues   false)rd   rU   rH   r$   r$   r%   rI      s    zBooleanObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[      s    zBooleanObject.writeToStreamrV   c                 C   s@   |  d}|dkrtdS |dkr4|  d tdS tdd S )NrW   rl   Ts   falsr2   FzCould not read Boolean object)rX   rb   r   )rD   wordr$   r$   r%   rY      s    

zBooleanObject.read_from_streamc                 C   s   t ddd t| S r^   )r   rb   rY   r`   r$   r$   r%   r_      s    zBooleanObject.readFromStream)Fr$   )r(   rJ   rK   r   rf   r   rP   r	   r   rQ   r   r1   objectri   r]   r   rO   rI   r[   ra   rY   r_   r$   r$   r$   r%   rb      s.      	 
rb   c                   @   s  e Zd ZeeeddddZd"eeee	e
df ee
 df d dd	d
Zed dddZed dddZe
dddZee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eed dddZeeed dd d!ZdS )#r   N)r9   
generationr3   r    c                 C   s   || _ || _|| _d S rF   )r9   ro   r3   )r#   r9   ro   r3   r$   r$   r%   rf      s    zIndirectObject.__init__Fr$   .r+   c                 C   s   | j |kr|s| S t| j |jkr2i |jt| j < |sj| j|jt| j  krj||jt| j  | j }n"|  }|dk	s~t||||}|dk	st|jdk	st|jS )rS   N)r3   r7   r8   r9   r:   r;   r1   r   )r#   r,   r-   r.   dupr?   r$   r$   r%   r1      s    zIndirectObject.cloner   c                 C   s   | S rF   r$   r"   r$   r$   r%   r     s    z!IndirectObject.indirect_referencer   c                 C   s    | j | }|d krd S | S rF   )r3   r:   )r#   r?   r$   r$   r%   r:     s    zIndirectObject.get_objectc                 C   s"   d| j d| jdt| j dS )NzIndirectObject(z, ))r9   ro   r7   r3   r"   r$   r$   r%   r]     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 rF   )rh   r   r9   ro   r3   r#   rr   r$   r$   r%   ri     s    


zIndirectObject.__eq__c                 C   s   |  | S rF   )ri   rs   r$   r$   r%   __ne__%  s    zIndirectObject.__ne__rC   c                 C   s"   | t| j d| j d d S )N z R)rU   r   r9   ro   rH   r$   r$   r%   rI   (  s    zIndirectObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[   -  s    zIndirectObject.writeToStreamrD   r3   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    r2      Rz0Error reading indirect object reference at byte )
rX   r   r   isspacer   r   r   tellr   int)rD   r3   r9   tokro   rr$   r$   r%   rY   3  s,    



zIndirectObject.read_from_streamc                 C   s   t ddd t| |S r^   )r   r   rY   rD   r3   r$   r$   r%   r_   N  s    zIndirectObject.readFromStream)Fr$   )r(   rJ   rK   r{   r   rf   r   rP   r	   r   rQ   r   r1   propertyr   r   r:   r]   ri   rt   r   rO   rI   r[   ra   rY   r_   r$   r$   r$   r%   r      s<     	   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df e
e df d d	d
dZedddZedddZ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dS )FloatObject0.0N)rd   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__r/   r   r(   )clsrd   r   er$   r$   r%   r   W  s     zFloatObject.__new__Fr$   .r+   c                 C   s   t d| t| |S )rS   r   )r
   r@   r   r0   r$   r$   r%   r1   e  s    zFloatObject.cloner   c                 C   sF   | dkrdS t tt| }| dtdd|  ddd}|S )Nr   r   .r2      f0)r{   r   absmaxrstrip)r#   nbsr$   r$   r%   myreprn  s
    &zFloatObject.myreprc                 C   s   |   S rF   )r   r"   r$   r$   r%   r]   u  s    zFloatObject.__repr__c                 C   s   t | S rF   )r   r"   r$   r$   r%   
as_numericx  s    zFloatObject.as_numericrC   c                 C   s   | |  d d S Nutf8)rU   r   r!   rH   r$   r$   r%   rI   {  s    zFloatObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[     s    zFloatObject.writeToStream)r   N)Fr$   )r(   rJ   rK   r	   rQ   r   r   r   rP   r   r   r1   r   r]   r   r   r   rO   rI   r[   r$   r$   r$   r%   r   V  s4      
   	  r   c                   @   s   e Zd ZedZed dddZdeee	e
edf ee df d d	d
dZ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ee	d dddZeee	d dddZdS )NumberObjects	   [^+-.0-9]rc   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   )r{   r   
ValueErrorr   r(   )r   rd   r$   r$   r%   r     s
    zNumberObject.__new__Fr$   .Nr+   c                 C   s   t d| t| |S )rS   r   )r
   r@   r   r0   r$   r$   r%   r1     s    zNumberObject.cloner   c                 C   s   t t| dS r   )r{   reprr!   r"   r$   r$   r%   r     s    zNumberObject.as_numericrC   c                 C   s   | t| d d S r   )rU   r   r!   rH   r$   r$   r%   rI     s    zNumberObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[     s    zNumberObject.writeToStream)r   r   rV   c                 C   s*   t | tj}|ddkr"t|S t|S )N   .)r   r   NumberPatternfindr   )rD   numr$   r$   r%   rY     s    zNumberObject.read_from_streamc                 C   s   t ddd t| S r^   )r   r   rY   r`   r$   r$   r%   r_     s    zNumberObject.readFromStream)Fr$   )r(   rJ   rK   recompiler   r   r   rP   r	   r   rQ   r   r1   r{   r   r   rO   rI   r[   ra   rY   r_   r$   r$   r$   r%   r     s2   

  	  r   c                   @   s   e Zd 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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$   .Nr+   c                 C   s   t d| tt| |S )rS   r   )r
   r@   r   rO   r0   r$   r$   r%   r1     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_bytesrC   c                 C   sD   | }|rddl m} |||}|d |t| |d d S )Nr   RC4_encrypt   <   >)	_securityr   rU   r   )r#   rD   rE   bytearrr   r$   r$   r%   rI     s    

z ByteStringObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[     s    zByteStringObject.writeToStream)Fr$   )r(   rJ   rK   __doc__r   rP   r	   r   rQ   r   r1   r   rO   r   r   rI   r[   r$   r$   r$   r%   r     s&       r   c                   @   s   e Zd ZdZdeeeeedf e	e df d dddZ
dZdZeed	d
dZ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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$   .Nr+   c                 C   s*   t | }| j|_| j|_td| ||S )rS   r   )r   autodetect_pdfdocencodingautodetect_utf16r
   r@   )r#   r,   r-   r.   r?   r$   r$   r%   r1     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_pdfdocencodingr/   r"   r$   r$   r%   r     s
    z#TextStringObject.get_original_bytesrC   c                 C   s   zt | }W n$ tk
r0   tj| d }Y nX |rbddlm} |||}t|}||d  nX|	d |D ]>}t
| s|dkr|	td|  qp|	tt
| qp|	d d S )Nr   r   r      (    z\%03o   ))r   UnicodeEncodeErrorr   r   r!   r   r   r   rI   rU   chrisalnumr   )r#   rD   rE   r   r   r?   cr$   r$   r%   rI     s    

z TextStringObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[   .  s    zTextStringObject.writeToStream)Fr$   )r(   rJ   rK   r   r   rP   r	   r   rQ   r   r1   r   r   r   rO   r   r   r   rI   r[   r$   r$   r$   r%   r     s,       r   c                   @   s   e Zd ZedZdZddddddd	 ed
D Zd"e	e
eeedf ee df d 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ddZeeedddZeee	d dddZeee	d dd d!ZdS )#
NameObjects   \s+|[\(\)<>\[\]{}/%]   /s   #23s   #28s   #29s   #2F)#(rq   /c                 C   s"   i | ]}t |d |d qS )r   02X)r   r!   ).0r>   r$   r$   r%   
<dictcomp>=  s      zNameObject.<dictcomp>!   Fr$   .Nr+   c                 C   s   t d| t| |S )rS   r   )r
   r@   r   r0   r$   r$   r%   r1   @  s    zNameObject.clonerC   c                 C   s   | |   d S rF   )rU   renumberrH   r$   r$   r%   rI   I  s    zNameObject.write_to_streamc                 C   s   t ddd | || d S rZ   r\   rH   r$   r$   r%   r[   N  s    zNameObject.writeToStreamr   c              	   C   s   | d  d}|dkr(td|  dt | 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:(rq   r2   ~r   r   )r!   r   r(   renumber_tableKeyError)r#   outr   xr$   r$   r%   r   T  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   r2      )r   r   r   )r   r>   r$   r$   r%   unnumberc  s    4zNameObject.unnumberrv   c              
   C   s   |  d}|tjkrtd|t| tj7 }zXt|}dD ]4}z||}t|W   W S  tk
rn   Y q<X q<t	d|dddW nn t
t	fk
r } zL|jstdt| dt t|d	 W Y S tdt| d|W 5 d }~X Y nX d S )
Nr2   zname read error)r   gbk r   zCode Not Foundz"Illegal character in Name Object (rq   charmap)rX   r   surfixr   r   delimiter_patternr   decoder/   UnicodeDecodeErrorr   strictr   r   r(   )rD   r3   nameencretr   r$   r$   r%   rY   p  s2    



 zNameObject.read_from_streamc                 C   s   t ddd t| |S r^   )r   r   rY   r~   r$   r$   r%   r_     s    zNameObject.readFromStream)Fr$   )r(   rJ   rK   r   r   r   r   ranger   r   rP   r	   r   rQ   r   r1   r   rO   rI   r[   r   ra   r   rY   r_   r$   r$   r$   r%   r   5  sF   
  
   r   )unicode_stringr    c              
   C   sP   d}| D ]B}z|t tt| 7 }W q tk
rH   td|dddY qX q|S )Nrw   Zpdfdocencodingr   z#does not exist in translation table)r   r   r   r   r   )r   retvalr   r$   r$   r%   r     s        r   )2r   rL   r   binasciir   mathr   typingr   r   r   r   r   r	   r
   _codecsr   Z
_protocolsr   r   _utilsr   r   r   r   r   r   r   r   r   errorsr   r   r   
__author____author_email__r   rR   rb   r   r   r   r{   r   rO   r   rQ   r   r   r   r$   r$   r$   r%   <module>   s*   $,^%9d10-Q_