U
    
3g]                     @   sd  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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j'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/e-e+dddZ0dS )     N)	unhexlify)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#   8/tmp/pip-unpacked-wheel-ifm06wwb/PyPDF2/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)
        zclone PdfObjectN)	Exceptionr"   r+   r,   r-   r#   r#   r$   cloneG   s    zPdfObject.clone)r0   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 )z
        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
        r      Nr   )r   pdfr.   hasattrlen_objectsid_id_translatedidnum
get_objectAssertionErrorappendr   )r"   r0   r+   indiobjr#   r#   r$   _reference_cloneV   s*    	

zPdfObject._reference_clonec                 C   s   | S )zResolve indirect references.r#   r!   r#   r#   r$   r9   u   s    zPdfObject.get_objectc                 C   s   t ddd |  S )N	getObjectr9   3.0.0)r   r9   r!   r#   r#   r$   r@   y   s    zPdfObject.getObjectstreamencryption_keyr   c                 C   s   t d S N)NotImplementedErrorr"   rC   rD   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   r0   r   r   r?   r9   r@   r   rH   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_destrQ   )r	   r?   rQ   r/   r#   r#   r$   r0      s    zNullObject.clonerB   c                 C   s   | d d S )N   null)writerG   r#   r#   r$   rH      s    zNullObject.write_to_streamrC   r   c                 C   s    |  d}|dkrtdt S )N   rS   zCould not read Null object)readr   rQ   )rC   Znulltxtr#   r#   r$   read_from_stream   s    
zNullObject.read_from_streamc                 C   s   t ddd | || d S NwriteToStreamrH   rA   r   rH   rG   r#   r#   r$   rZ      s    zNullObject.writeToStreamr   c                 C   s   dS )NrQ   r#   r!   r#   r#   r$   __repr__   s    zNullObject.__repr__c                 C   s   t ddd t| S NreadFromStreamrX   rA   )r   rQ   rX   rC   r#   r#   r$   r^      s    zNullObject.readFromStream)Fr#   )r'   rI   rJ   r   rO   r   r   rP   r   r0   r   rN   rH   staticmethodrX   rZ   r\   r^   r#   r#   r#   r$   rQ      s*     
  rQ   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 rE   rc   )r"   rc   r#   r#   r$   __init__   s    zBooleanObject.__init__Fr#   .r*   c                 C   s   t d| t| j|S )rR   ra   )r	   r?   ra   rc   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)
isinstancera   rc   rO   )r"   rf   r#   r#   r$   __eq__   s
    


zBooleanObject.__eq__r   c                 C   s   | j r
dS dS )NTrueFalserd   r!   r#   r#   r$   r\      s    zBooleanObject.__repr__rB   c                 C   s    | j r|d n
|d d S )N   trues   false)rc   rT   rG   r#   r#   r$   rH      s    zBooleanObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ      s    zBooleanObject.writeToStreamrU   c                 C   s@   |  d}|dkrtdS |dkr4|  d tdS tdd S )NrV   rk   Ts   falsr1   FzCould not read Boolean object)rW   ra   r   )rC   wordr#   r#   r$   rX      s    

zBooleanObject.read_from_streamc                 C   s   t ddd t| S r]   )r   ra   rX   r_   r#   r#   r$   r^      s    zBooleanObject.readFromStream)Fr#   )r'   rI   rJ   r   re   r   rO   r   r   rP   r   r0   objectrh   r\   r   rN   rH   rZ   r`   rX   r^   r#   r#   r#   r$   ra      s.      	 
ra   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)r8   
generationr2   r   c                 C   s   || _ || _|| _d S rE   )r8   rn   r2   )r"   r8   rn   r2   r#   r#   r$   re      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 )rR   N)r2   r6   r7   r8   r9   r:   r0   r   )r"   r+   r,   r-   dupr>   r#   r#   r$   r0      s    zIndirectObject.cloner   c                 C   s   | S rE   r#   r!   r#   r#   r$   r      s    z!IndirectObject.indirect_referencer   c                 C   s    | j | }|d krd S | S rE   )r2   r9   )r"   r>   r#   r#   r$   r9     s    zIndirectObject.get_objectc                 C   s"   d| j d| jdt| j dS )NzIndirectObject(z, ))r8   rn   r6   r2   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 rE   )rg   r   r8   rn   r2   r"   rq   r#   r#   r$   rh     s    


zIndirectObject.__eq__c                 C   s   |  | S rE   )rh   rr   r#   r#   r$   __ne__  s    zIndirectObject.__ne__rB   c                 C   s"   | t| j d| j d d S )N z R)rT   r   r8   rn   rG   r#   r#   r$   rH     s    zIndirectObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ     s    zIndirectObject.writeToStreamrC   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 )
rW   r   r   isspacer   r   r   tellr   int)rC   r2   r8   tokrn   rr#   r#   r$   rX   "  s,    



zIndirectObject.read_from_streamc                 C   s   t ddd t| |S r]   )r   r   rX   rC   r2   r#   r#   r$   r^   =  s    zIndirectObject.readFromStream)Fr#   )r'   rI   rJ   rz   r   re   r   rO   r   r   rP   r   r0   propertyr   r   r9   r\   rh   rs   r   rN   rH   rZ   r`   rX   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edeef ddddZeedeef ddddZdS )FloatObject0N)rc   contextr   c                 C   sP   zt j| t||W S  tk
rJ   td| dt t j| d Y S X d S )NzFloatObject (z) invalid; use 0.0 insteadz0.0)decimalDecimal__new__r   r.   r   r'   )clsrc   r   r#   r#   r$   r   F  s
    zFloatObject.__new__Fr#   .r*   c                 C   s   t d| t| |S )rR   r   )r	   r?   r   r/   r#   r#   r$   r0   Q  s    zFloatObject.cloner   c                 C   s2   | |   kr t| tdS | ddS d S )Nr1   fr   )to_integralrP   quantizer   r   rstripr!   r#   r#   r$   r\   Z  s    zFloatObject.__repr__c                 C   s   t t| dS Nutf8)floatreprr    r!   r#   r#   r$   
as_numericc  s    zFloatObject.as_numericrB   c                 C   s   | t| d d S r   rT   r   r    rG   r#   r#   r$   rH   f  s    zFloatObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ   k  s    zFloatObject.writeToStream)r   N)Fr#   )r'   rI   rJ   r   rP   r   r   r   rO   r   r   r0   r\   r   r   r   rN   rH   rZ   r#   r#   r#   r$   r   E  s2      
   		  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]rb   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   )rz   r   
ValueErrorr   r'   )r   rc   r#   r#   r$   r   u  s
    zNumberObject.__new__Fr#   .Nr*   c                 C   s   t d| t| |S )rR   r   )r	   r?   r   r/   r#   r#   r$   r0   |  s    zNumberObject.cloner   c                 C   s   t t| dS r   )rz   r   r    r!   r#   r#   r$   r     s    zNumberObject.as_numericrB   c                 C   s   | t| d d S r   r   rG   r#   r#   r$   rH     s    zNumberObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ     s    zNumberObject.writeToStream)r   r   rU   c                 C   s*   t | tj}|ddkr"t|S t|S )N   .)r   r   NumberPatternfindr   )rC   numr#   r#   r$   rX     s    zNumberObject.read_from_streamc                 C   s   t ddd t| S r]   )r   r   rX   r_   r#   r#   r$   r^     s    zNumberObject.readFromStream)Fr#   )r'   rI   rJ   recompiler   r   r   rO   r   r   rP   r   r0   rz   r   r   rN   rH   rZ   r`   rX   r^   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 )rR   r   )r	   r?   r   rN   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_bytesrB   c                 C   sD   | }|rddl m} |||}|d |t| |d d S )Nr
   RC4_encrypt   <   >)	_securityr   rT   r   )r"   rC   rD   bytearrr   r#   r#   r$   rH     s    

z ByteStringObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ     s    zByteStringObject.writeToStream)Fr#   )r'   rI   rJ   __doc__r   rO   r   r   rP   r   r0   r~   rN   r   r   rH   rZ   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
    Represents 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 )rR   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_pdfdocencodingr.   r!   r#   r#   r$   r     s
    z#TextStringObject.get_original_bytesrB   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   rH   rT   chrisalnumr   )r"   rC   rD   r   r   r>   cr#   r#   r$   rH     s    

z TextStringObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ     s    zTextStringObject.writeToStream)Fr#   )r'   rI   rJ   r   r   rO   r   r   rP   r   r0   r   r   r~   rN   r   r   r   rH   rZ   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)#(rp   /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 )rR   r   )r	   r?   r   r/   r#   r#   r$   r0   +  s    zNameObject.clonerB   c                 C   s   | |   d S rE   )rT   renumberrG   r#   r#   r$   rH   4  s    zNameObject.write_to_streamc                 C   s   t ddd | || d S rY   r[   rG   r#   r#   r$   rZ   9  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:(rp   r1   ~r   r   )r    r   r'   renumber_tableKeyError)r"   outr   xr#   r#   r$   r   ?  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$   unnumberN  s    4zNameObject.unnumberru   c              
   C   s   |  d}|tjkrtd|t| tjdd7 }zXt|}dD ]4}z||}t|W   W S  tk
rr   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 )Nr1   zname read errorT)Z
ignore_eof)r   gbk r   zCode Not Foundz"Illegal character in Name Object (rp   charmap)rW   r   surfixr   r   delimiter_patternr   decoder.   UnicodeDecodeErrorr   strictr   r   r'   )rC   r2   nameencreter#   r#   r$   rX   [  s2    



 zNameObject.read_from_streamc                 C   s   t ddd t| |S r]   )r   r   rX   r}   r#   r#   r$   r^   w  s    zNameObject.readFromStream)Fr#   )r'   rI   rJ   r   r   r   r   ranger   r   rO   r   r   rP   r   r0   r   rN   rH   rZ   r   r`   r   rX   r^   r#   r#   r#   r$   r      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 )Nrv   Zpdfdocencodingr   z#does not exist in translation table)r   r   r   r   r   )r   retvalr   r#   r#   r$   r     s        r   )1r   r   rK   r   binasciir   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   rQ   ra   r   r   r   rz   r   rN   r   rP   r   r   r   r#   r#   r#   r$   <module>   s*   $,M%9d-0,R_