o
    ۩Zh                     @   s  d dl Z d dlZd dlZd dlZd dlmZmZ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mZmZmZmZ d dlmZ d dlmZmZ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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> e?e@ZAG dd de$ZBG dd deCZDG dd de)ZEG dd de)ZFG dd de)ZGG dd de)ZHG dd deHZIG dd deJZKG dd deJZLG d d! d!eHZMG d"d# d#eMZNe7d$ZOe7d%ZPe7d&ZQG d'd( d(ZRG d)d* d*eRZSG d+d, d,eSZTG d-d. d.eRZUG d/d0 d0ZVG d1d2 d2eVZWG d3d4 d4eWZXG d5d6 d6ZYG d7d8 d8e"ZZdS )9    N)sha256md5sha384sha512)AnyCallableDictIterableIteratorKeysViewListOptionalSequenceTupleTypeUnioncast)default_backend)Cipher
algorithmsmodes   )settings)Arcfour)
NumberTree)PDFSyntaxError	PDFParserPDFStreamParser)DecipherCallablePDFExceptionPDFTypeError	PDFStreamPDFObjectNotFounddecipher_all	int_value	str_value
list_value
uint_value
dict_valuestream_value)PSEOFliteral_nameLITKWD)choplistdecode_textnunpackformat_int_romanformat_int_alphac                   @      e Zd ZdS )PDFNoValidXRefN__name__
__module____qualname__ r9   r9   K/var/www/html/lang_env/lib/python3.10/site-packages/pdfminer/pdfdocument.pyr4   1       r4   c                   @      e Zd ZdZdS )PDFNoValidXRefWarningztLegacy warning for missing xref.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr6   r7   r8   __doc__r9   r9   r9   r:   r=   5       r=   c                   @   r3   )PDFNoOutlinesNr5   r9   r9   r9   r:   rA   >   r;   rA   c                   @   r3   )PDFNoPageLabelsNr5   r9   r9   r9   r:   rB   B   r;   rB   c                   @   r3   )PDFDestinationNotFoundNr5   r9   r9   r9   r:   rC   F   r;   rC   c                   @   r3   )PDFEncryptionErrorNr5   r9   r9   r9   r:   rD   J   r;   rD   c                   @   r3   )PDFPasswordIncorrectNr5   r9   r9   r9   r:   rE   N   r;   rE   c                   @   r<   )PDFEncryptionWarningzyLegacy warning for failed decryption.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr>   r9   r9   r9   r:   rF   R   r@   rF   c                   @   r<   )"PDFTextExtractionNotAllowedWarningzLegacy warning for PDF that does not allow extraction.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr>   r9   r9   r9   r:   rG   [   r@   rG   c                   @   r3   )PDFTextExtractionNotAllowedNr5   r9   r9   r9   r:   rH   d   r;   rH   c                       s&   e Zd Zdeddf fddZ  ZS ) PDFTextExtractionNotAllowedErrorargsreturnNc                    s&   ddl m} |dt t j|  d S )Nr   )warnzhPDFTextExtractionNotAllowedError will be removed in the future. Use PDFTextExtractionNotAllowed instead.)warningsrL   DeprecationWarningsuper__init__)selfrJ   rL   	__class__r9   r:   rP   i   s   z)PDFTextExtractionNotAllowedError.__init__)r6   r7   r8   objectrP   __classcell__r9   r9   rR   r:   rI   h   s    rI   ZObjStmZXRefCatalogc                   @   sf   e Zd Zdeeef fddZdee fddZ	dede
ee eef fddZd	edd
fddZd
S )PDFBaseXRefrK   c                 C      t NNotImplementedErrorrQ   r9   r9   r:   get_trailer{      zPDFBaseXRef.get_trailerc                 C   s   g S rY   r9   r\   r9   r9   r:   
get_objids~   r^   zPDFBaseXRef.get_objidsobjidc                 C   s   t |rY   )KeyErrorrQ   r`   r9   r9   r:   get_pos   s   zPDFBaseXRef.get_posparserNc                 C   rX   rY   rZ   )rQ   rd   r9   r9   r:   load   r^   zPDFBaseXRef.load)r6   r7   r8   r   strr   r]   r	   intr_   r   r   rc   r   re   r9   r9   r9   r:   rW   z   s
     rW   c                   @   s   e Zd ZdddZdefddZdeddfdd	Zdeddfd
dZde	ee
f fddZdee fddZdedeee eef fddZdS )PDFXRefrK   Nc                 C   s   i | _ i | _d S rY   )offsetstrailerr\   r9   r9   r:   rP      s   
zPDFXRef.__init__c                 C      d| j   S )Nz<PDFXRef: offsets=%r>ri   keysr\   r9   r9   r:   __repr__      zPDFXRef.__repr__rd   c              	   C   sh  	 z|  \}}| }|sW q W n ty   tdw |dr(|| n~|d}t|dkr=d||}t|z	t	t
|\}}W n tyW   d||}t|w t||| D ]E}z|  \}	}| }W n tyx   tdw |d}t|dkrd	||}t||\}
}}|d
krq_d t
|
t
|f| j|< q_qtd| j | | d S )NTz Unexpected EOF - file corrupted?   trailer       z"Trailer not found: {!r}: line={!r}zInvalid line: {!r}: line={!r}   z$Invalid XRef format: {!r}, line={!r}   nzxref objects: %r)nextlinestripr*   r4   
startswithseeksplitlenformatmaprg   
ValueErrorrangeri   logdebugload_trailer)rQ   rd   poslinef	error_msgstartnobjsr`   _Zpos_bZgenno_bZuse_br9   r9   r:   re      sV   




$zPDFXRef.loadc                 C   s   z|  \}}|tdu sJ t|| \}}W n ty4   |d}|s,td|d \}}Y nw | jt	| t
d| j d S )Nrp   r   zUnexpected EOF - file corruptedr   z
trailer=%r)	nexttokenr-   rf   
nextobjectr*   popr4   rj   updater(   r   r   )rQ   rd   r   kwdZdicxr9   r9   r:   r      s   
zPDFXRef.load_trailerc                 C      | j S rY   rj   r\   r9   r9   r:   r]         zPDFXRef.get_trailerc                 C   s
   | j  S rY   rl   r\   r9   r9   r:   r_         
zPDFXRef.get_objidsr`   c                 C   s   z| j | W S  ty    w rY   )ri   ra   rb   r9   r9   r:   rc      s
   zPDFXRef.get_posrK   N)r6   r7   r8   rP   rf   rn   r   re   r   r   r   r]   r   rg   r_   r   r   rc   r9   r9   r9   r:   rh      s    
($rh   c                   @   s6   e Zd ZdefddZedZdeddfddZ	dS )	PDFXRefFallbackrK   c                 C   rk   )Nz<PDFXRefFallback: offsets=%r>rl   r\   r9   r9   r:   rn      ro   zPDFXRefFallback.__repr__z^(\d+)\s+(\d+)\s+obj\brd   Nc                 C   s  | d 	 z| \}}W n
 ty   Y d S w |dr1| | | | td| j d S |d}| j	
|}|s?q| \}}t|}t|}	d ||	f| j|< | | | \}
}t|tr|dtu rt|}z|d }W n ty   tjrtd| d}Y nw t| }g }z	 | \}
}|tt| q ty   Y nw t|t|d	 }t|D ]}||d	  }||df| j|< qq)
Nr   r   rp   trailer: %rzlatin-1r   NN is not defined: %rrr   )rx   ru   r*   rw   r   r   r   rj   decode
PDFOBJ_CUEmatchgroupsrg   ri   r   
isinstancer!   getLITERAL_OBJSTMr)   ra   r   STRICTr   r   get_dataappendr   minrz   r~   )rQ   rd   r   Z
line_bytesr   mZobjid_sZgenno_sr`   gennor   objstreamnZparser1objsindexobjid1r9   r9   r:   re      s\   





zPDFXRefFallback.load)
r6   r7   r8   rf   rn   recompiler   r   re   r9   r9   r9   r:   r      s    
r   c                   @   s~   e Zd ZdddZdefddZdeddfdd	Zdeee	f fd
dZ
dee fddZdedeee eef fddZdS )PDFXRefStreamrK   Nc                 C   s(   d | _ d | _d | _d | _d | _g | _d S rY   )dataentlenfl1fl2fl3rangesr\   r9   r9   r:   rP   	  s   
zPDFXRefStream.__init__c                 C   s
   d| j  S )Nz<PDFXRefStream: ranges=%r>)r   r\   r9   r9   r:   rn     r   zPDFXRefStream.__repr__rd   c           	      C   s*  |  \}}|  \}}|  \}}| \}}t|tr$|dtur(td|d }|dd|f}t|d dkr@td| j	
tttttf  td| |d \| _| _| _| jd urk| jd urk| jd usmJ | | _| j| j | j | _|j| _td	d
tt| j	| j| j| j d S )Nr   zInvalid PDF stream spec.SizeIndexr   rr   zInvalid index numberWz&xref stream: objid=%s, fields=%d,%d,%dz, )r   r   r   r!   r   LITERAL_XREFr4   rz   r   r   extendr   r
   r   rg   r.   r   r   r   r   r   r   attrsrj   r   r   joinr|   repr)	rQ   rd   r   r`   r   r   r   sizeZindex_arrayr9   r9   r:   re     s0   $"
zPDFXRefStream.loadc                 C   r   rY   r   r\   r9   r9   r:   r]   .  r   zPDFXRefStream.get_trailerc                 c   s    | j D ]?\}}t|D ]6}| jd usJ | jd usJ | j| }| j||| j  }t|d | j d}|dks=|dkrB|| V  qqd S )Nr   rr   )r   r~   r   r   r0   r   )rQ   r   r   ioffsetentf1r9   r9   r:   r_   1  s   

zPDFXRefStream.get_objidsr`   c           
      C   s  d}| j D ]\}}||kr||| k r||| 7 } n	||7 }qt|| jd us+J | jd us2J | jd urA| jd urA| jd usCJ | j| }| j||| j  }t|d | j d}t|| j| j| j  }t|| j| j d  }	|dkr~d ||	fS |dkr||	dfS t|)Nr   r   rr   )r   ra   r   r   r   r   r   r0   )
rQ   r`   r   r   r   r   r   r   f2Zf3r9   r9   r:   rc   =  s(   
"


zPDFXRefStream.get_posr   )r6   r7   r8   rP   rf   rn   r   re   r   r   r]   r
   rg   r_   r   r   rc   r9   r9   r9   r:   r     s    
$r   c                   @   sX  e Zd ZU dZdZeedf ed< 	d.dee	 de
eef ded	d
fddZd/ddZd/ddZd/ddZd	efddZd	efddZd	efddZde	d	e	fddZde	d	e	fddZded	ee	 fddZde	d	ee	 fd d!Zde	d	efd"d#Zde	d	ee	 fd$d%Z	
d0d&ed'ed(e	d)ee
eef  d	e	f
d*d+Zd&ed'ed(e	d	e	fd,d-Zd
S )1PDFStandardSecurityHandlers    (N^NuAd NV.. h>/dSiz)rr   rs   .supported_revisions docidparampasswordrK   Nc                 C   s   || _ || _|| _|   d S rY   )r   r   r   init)rQ   r   r   r   r9   r9   r:   rP   `  s
   z#PDFStandardSecurityHandler.__init__c                 C   s2   |    | j| jvrd| j }t||   d S )NzUnsupported revision: param=%r)init_paramsrr   r   rD   init_key)rQ   r   r9   r9   r:   r   i  s   
zPDFStandardSecurityHandler.initc                 C   sn   t | jdd| _t | jd | _t| jd d| _t| jd | _t| jd | _	t | jdd	| _
d S )
NVr   RP    OUZLength(   )r$   r   r   vr   r'   pr%   oulengthr\   r9   r9   r:   r   q  s   z&PDFStandardSecurityHandler.init_paramsc                 C   s    |  | j| _| jd u rtd S rY   )authenticater   keyrE   r\   r9   r9   r:   r   z  s   
z#PDFStandardSecurityHandler.init_keyc                 C      t | jd@ S )N   boolr   r\   r9   r9   r:   is_printable  ro   z'PDFStandardSecurityHandler.is_printablec                 C   r   )N   r   r\   r9   r9   r:   is_modifiable  ro   z(PDFStandardSecurityHandler.is_modifiablec                 C   r   )N   r   r\   r9   r9   r:   is_extractable  ro   z)PDFStandardSecurityHandler.is_extractabler   c                    s   | j dkrt|| jS t| j}|| jd  t|| }tddD ] d	 fddt
|D }t||}q(||7 }|S )Nrr   r   r          c                 3       | ]
}t | A fV  qd S rY   bytes.0cr   r9   r:   	<genexpr>      z7PDFStandardSecurityHandler.compute_u.<locals>.<genexpr>)r   r   ZencryptPASSWORD_PADDINGr   r   r   digestr~   r   iter)rQ   r   hashresultkr9   r   r:   	compute_u  s   

z$PDFStandardSecurityHandler.compute_uc                 C   s   || j  d d }t|}|| j |td| j || jd  | jdkr5t	t
| js5|d | }d}| jdkrV| jd }td	D ]}t|d |  }qI|d | S )
Nr   <Lr   r   s      rs   r   2   )r   r   r   r   structpackr   r   r   r   PDFStandardSecurityHandlerV4encrypt_metadatar   r   r~   )rQ   r   r   r   r   r   r9   r9   r:   compute_encryption_key  s   



z1PDFStandardSecurityHandler.compute_encryption_keyc                 C   s*   | d}| |}|d u r| |}|S )Nlatin1)encodeauthenticate_user_passwordauthenticate_owner_password)rQ   r   Zpassword_bytesr   r9   r9   r:   r     s
   


z'PDFStandardSecurityHandler.authenticatec                 C   s   |  |}| |r|S d S rY   )r   verify_encryption_key)rQ   r   r   r9   r9   r:   r     s   

z5PDFStandardSecurityHandler.authenticate_user_passwordc                 C   s8   |  |}| jdkr|| jkS |d d | jd d kS )Nrr   r   )r   r   r   )rQ   r   r   r9   r9   r:   r    s   


z0PDFStandardSecurityHandler.verify_encryption_keyc                    s   || j  d d }t|}| jdkrtdD ]}t| }qd}| jdkr+| jd }| d | }| jdkrAt|| j}n!| j}tdddD ] d		 fd
dt
|D }t||}qJ| |S )Nr   rs   r   r   r   rr      r   c                 3   r   rY   r   r   r   r9   r:   r     r   zIPDFStandardSecurityHandler.authenticate_owner_password.<locals>.<genexpr>)r   r   r   r~   r   r   r   decryptr   r   r   r   )rQ   r   r   r   r   r   Zuser_passwordr   r9   r   r:   r     s    




z6PDFStandardSecurityHandler.authenticate_owner_passwordr`   r   r   r   c                 C   s   |  |||S rY   )decrypt_rc4)rQ   r`   r   r   r   r9   r9   r:   r    s   z"PDFStandardSecurityHandler.decryptc                 C   sl   | j d usJ | j td|d d  td|d d  }t|}| d tt|d }t||S )Nr   rs   rr   r   )	r   r   r   r   r   r   rz   r   r  )rQ   r`   r   r   r   r   r9   r9   r:   r    s
   .z&PDFStandardSecurityHandler.decrypt_rc4r   r   rY   )r6   r7   r8   r   r   r   rg   __annotations__r   r   r   rf   r   rP   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r9   r9   r9   r:   r   X  sN   
 


	

	
	r   c                       s   e Zd ZU dZeedf ed< d fddZdede	e
eeegef  fd	d
Z		ddededede	eeef  de	e defddZdedededefddZdedededefddZ  ZS )r   )r   .r   rK   Nc                    s   t    d| _t| jd| _t| jd | _t| jd | _	t
| jdd| _| j| j	kr:d| j }t|i | _| j D ]\}}| t|d }|d u r\d	| j }t||| j|< qB| j| jd
< | j	| jvrwd| j }t|d S )N   ZCFZStmFZStrFZEncryptMetadataTz"Unsupported crypt filter: param=%rZCFMz%Unknown crypt filter method: param=%rZIdentityz Undefined crypt filter: param=%r)rO   r   r   r(   r   r   cfr+   Zstmfstrfr   r   rD   cfmitemsget_cfmdecrypt_identity)rQ   r   r   r   r   rR   r9   r:   r     s*   



z(PDFStandardSecurityHandlerV4.init_paramsnamec                 C   s    |dkr| j S |dkr| jS d S )NZV2ZAESV2)r  decrypt_aes128rQ   r  r9   r9   r:   r     s
   z$PDFStandardSecurityHandlerV4.get_cfmr`   r   r   r   c                 C   sP   | j s|d ur|d}|d urt|dkr|S |d u r| j}| j| |||S )Nr   ZMetadata)r   r   r+   r
  r  )rQ   r`   r   r   r   r  tr9   r9   r:   r    s   
z$PDFStandardSecurityHandlerV4.decryptc                 C   s   |S rY   r9   )rQ   r`   r   r   r9   r9   r:   r    r^   z-PDFStandardSecurityHandlerV4.decrypt_identityc           	      C   s   | j d usJ | j td|d d  td|d d  d }t|}| d tt|d }|d d }|dd  }tt	|t
|t d}| |S )Nr   rs   rr   s   sAlTr   backend)r   r   r   r   r   r   rz   r   r   AESr   CBCr   	decryptorr   )	rQ   r`   r   r   r   r   initialization_vector
ciphertextcipherr9   r9   r:   r    s&   z+PDFStandardSecurityHandlerV4.decrypt_aes128r   )NN)r6   r7   r8   r   r   rg   r  r   rf   r   r   r   r  r   r   r  r  r  rU   r9   r9   rR   r:   r     s*   
 $
"r   c                	       s  e Zd ZdZd" fddZdedeeeee	ge	f  fddZ
d	edee	 fd
dZd	ede	fddZ	d#d	e	de	dee	 de	fddZ	d#d	e	de	dee	 de	fddZ	d#d	e	de	dee	 de	fddZede	defddZde	de	de	de	fddZdedede	de	fd d!Z  ZS )$PDFStandardSecurityHandlerV5)r      rK   Nc                    s   t    d| _t| jd | _t| jd | _| jd d | _| jdd | _	| jdd  | _
| jd d | _| jdd | _| jdd  | _d S )N   ZOEZUEr   r   )rO   r   r   r%   r   oeuer   o_hasho_validation_salt
o_key_saltr   u_hashu_validation_salt
u_key_saltr\   rR   r9   r:   r   3  s   
z(PDFStandardSecurityHandlerV5.init_paramsr  c                 C   s   |dkr| j S d S )NZAESV3)decrypt_aes256r  r9   r9   r:   r  @  s   z$PDFStandardSecurityHandlerV5.get_cfmr   c                 C   s   |  |}| || j| j}|| jkr2| || j| j}tt|t	
dt d}| | jS | || j}|| jkr[| || j}tt|t	
dt d}| | jS d S )Ns                   r  )_normalize_password_password_hashr!  r   r   r"  r   r   r  r   r  r   r  r   r  r$  r#  r%  r  )rQ   r   Z
password_br   r  r9   r9   r:   r   F  s    


z)PDFStandardSecurityHandlerV5.authenticatec                 C   s8   | j dkr|s	dS ddlm} ||}|dd d S )Nr  r   r   )saslprepzutf-8   )r   Z	_saslprepr)  r   )rQ   r   r)  r9   r9   r:   r'  X  s   
z0PDFStandardSecurityHandlerV5._normalize_passwordsaltvectorc                 C   s.   | j dkr| |||S | ||dd |S )zD
        Compute password hash depending on revision number
        r   r   r   )r   _r5_password_r6_password)rQ   r   r+  r,  r9   r9   r:   r(  b  s   
z+PDFStandardSecurityHandlerV5._password_hashc                 C   s,   t |}|| |dur|| | S )z5
        Compute the password for revision 5
        N)r   r   r   )rQ   r   r+  r,  r   r9   r9   r:   r-  l  s
   

z)PDFStandardSecurityHandlerV5._r5_passwordc                 C   s   t |}|| |dur|| | }t ttf}d }}|dk s)||d krj|| |p/d d }	| j|dd |dd |	d}
|| |
dd  }||
 }|
t|
d  }|d7 }|dk s)||d ks)|dd S )	z5
        Compute the password for revision 6
        Nr   @   r   r   r   )r   ivr   r   )r   r   r   r   r   _aes_cbc_encrypt_bytes_mod_3rz   )rQ   r   r+  r,  Zinitial_hashr   hashesZround_noZlast_byte_valk1eZ	next_hashr9   r9   r:   r.  x  s    


 	z)PDFStandardSecurityHandlerV5._r6_passwordinput_bytesc                 C   s   t dd | D d S )Nc                 s   s    | ]}|d  V  qdS )rs   Nr9   )r   br9   r9   r:   r     s    z<PDFStandardSecurityHandlerV5._bytes_mod_3.<locals>.<genexpr>rs   )sum)r6  r9   r9   r:   r2    s   z)PDFStandardSecurityHandlerV5._bytes_mod_3r   r0  r   c                 C   s0   t t|t|}| }|||  S rY   )r   r   r  r   r  	encryptorr   finalize)rQ   r   r0  r   r  r9  r9   r9   r:   r1    s   z-PDFStandardSecurityHandlerV5._aes_cbc_encryptr`   r   c                 C   sR   |d d }|dd  }| j d usJ tt| j t|t d}| |S )Nr   r  )	r   r   r   r  r   r  r   r  r   )rQ   r`   r   r   r  r  r  r9   r9   r:   r&    s   
z+PDFStandardSecurityHandlerV5.decrypt_aes256r   rY   )r6   r7   r8   r   r   rf   r   r   rg   r   r  r   r'  r(  r-  r.  staticmethodr2  r1  r&  rU   r9   r9   rR   r:   r  /  sP    $


"r  c                   @   st  e Zd ZU dZeeeedZee	e
e f ed< 			d.dededed	ed
df
ddZedZd/ded
dfddZdede	de	d
efddZded
eee e	f fddZde	de	d
efddZde	d
efddZeeeeeef Zd
ee fddZd
ee fdd Zd!ed"e ee!f d
efd#d$Z"d%e ee!f d
efd&d'Z#ded
e	fd(d)Z$ded*e	d+ee% d
dfd,d-Z&dS )0PDFDocumentaP  PDFDocument object represents a PDF document.

    Since a PDF file can be very big, normally it is not loaded at
    once. So PDF document has to cooperate with a PDF parser in order to
    dynamically import the data as processing goes.

    Typical usage:
      doc = PDFDocument(parser, password)
      obj = doc.getobj(objid)

    )r   rr   r   r   security_handler_registryr   Trd   r   cachingfallbackrK   Nc           
      C   sj  || _ g | _g | _i | _d| _d| _d| _i | _i | _|| _| j	|  d | _
 | _| _z| |}| ||| j W n tyX   |rVd|_t }|| | j| Y nw | jD ]C}| }|seq\d|v rd|v rtt|d }	nd}	|	t|d f| _| | d|v r| jt|d  d|v rt|d | _ nq\td| jd	turtjrtd
dS )z1Set the document to use a given PDFParser object.NTZEncryptID)r   r   ZInfoZRootz(No /Root object! - Is this really a PDF?r   zCatalog not found!)r>  xrefsinfocatalog
encryptiondecipher_parser_cached_objs_parsed_objsset_documentr   r   r   	find_xrefread_xref_fromr4   r?  r   re   r   r]   r&   r(   _initialize_passwordr   r   LITERAL_CATALOGr   r   )
rQ   rd   r   r>  r?  r   Znewxrefxrefrj   Zid_valuer9   r9   r:   rP     sX   



zPDFDocument.__init__   objc                 C   s   | j d usJ | j \}}t|ddkrtd| t|dd}| j|}|d u r3td| ||||}|j| _| | _|	 | _	|
 | _
| jd usSJ d| j_d S )NFilterZStandardzUnknown filter: param=%rr   r   zUnknown algorithm: param=%rF)rD  r+   r   rD   r$   r=  r  rE  r   r   r   rF  r?  )rQ   r   r   r   r   factoryhandlerr9   r9   r:   rL    s    



z PDFDocument._initialize_passwordr   r   r`   c                 C   s   |j | jv r| j|j  \}}n| |\}}| jr(|j d us J ||f| j|j < |d | }z|| }W |S  tyB   td| w )Nrr   zindex too big: %r)r`   rH  _get_objectsr>  
IndexErrorr   )rQ   r   r   r`   r   r   r   r   r9   r9   r:   _getobj_objstm  s   
zPDFDocument._getobj_objstmc                 C   s   | dturtjrtd| z	tt|d }W n ty-   tjr)td| d}Y nw t|	 }|
|  g }z	 | \}}|| q= tyT   Y ||fS w )Nr   zNot a stream object: %rr   r   r   )r   r   r   r   r   r   rg   ra   r   r   rI  r   r   r*   )rQ   r   r   rd   r   r   r   r9   r9   r:   rS    s,   

zPDFDocument._get_objectsr   c           	      C   s   | j d usJ | j | | j  \}}| j  \}}| j  \}}||krHg }|| jur>| j  \}}|| || jus-t|dkrH|d }||krTtd|||tdkr`td| | j 	 \}}|S )Nrr   zobjid mismatch: {!r}={!r}rO  zInvalid object spec: offset=%r)
rF  rx   r   KEYWORD_OBJr   rz   r   r{   r-   r   )	rQ   r   r`   r   r   r   r   r   r   r9   r9   r:   _getobj_parse0  s&   


zPDFDocument._getobj_parsec              
   C   s  | j stdtd| || jv r| j| \}}|S | j D ]S}z
||\}}}W n	 ty3   Y qw z2|durHt| |}| 	|||}n| 
||}| jrYt| j|||}t|trd||| W  n ttfyq   Y qw t|td|| | jr||f| j|< |S )zGet object from PDF

        :raises PDFException if PDFDocument is not initialized
        :raises PDFObjectNotFound if objid does not exist in PDF
        zPDFDocument is not initializedzgetobj: objid=%rNzregister: objid=%r: %r)rA  r   r   r   rG  rc   ra   r)   getobjrU  rX  rE  r#   r   r!   Z	set_objidr*   r   r"   r>  )rQ   r`   r   r   rN  Zstrmidr   r   r9   r9   r:   rY  L  s<   


zPDFDocument.getobjc                    s>   d| j vrtdtdtdttj f fdd  | j d dS )NZOutlinesentrylevelrK   c                 3   s    t | } d| v r0d| v sd| v r0tt| d }| d}| d}| d}|||||fV  d| v rDd| v rD | d |d E d H  d| v rR | d |E d H  d S )	NZTitleAZDestZSEZFirstZLastr   ZNext)r(   r/   r%   r   )rZ  r[  titledestactionsesearchr9   r:   rb  x  s   


z(PDFDocument.get_outlines.<locals>.searchr   )rC  rA   rT   rg   r
   r<  OutlineTyper\   r9   ra  r:   get_outlinest  s   
 zPDFDocument.get_outlinesc              	   C   s<   | j dusJ zt| j d }W |jS  ttfy   tw )z
        Generate page label strings for the PDF document.

        If the document includes page labels, generates strings, one per page.
        If not, raises PDFNoPageLabels.

        The resulting iteration is unbounded.
        N
PageLabels)rC  re  r    ra   rB   labels)rQ   Zpage_labelsr9   r9   r:   get_page_labels  s   	zPDFDocument.get_page_labelscatr   c              	      sh   z	t | jd }W n ttfy   t fw t |  }dtttf dtf fdd|S )NNamesdrK   c                    s   d| v rt | d \}}|k s|k rd S d| v r8t | d }tttttttf tf  t	d|}| S d| v rQt | d D ]}t
|}|rP|  S qBt f)NZLimitsri  rr   ZKids)r&   dictr   r
   r   r   rf   r   r   r.   r(   ra   )rj  r4  Zk2r   namesr   r   rh  r   lookupr9   r:   rn    s"   "z'PDFDocument.lookup_name.<locals>.lookup)r(   rC  r    ra   r   rf   r   )rQ   rh  r   rl  d0r9   rm  r:   lookup_name  s   "zPDFDocument.lookup_namer  c                 C   s`   z	|  d|}W |S  ty/   d| jvrt|t| jd }||vr(t||| }Y |S w )NZDests)rp  ra   rC  rC   r(   )rQ   r  r   ro  r9   r9   r:   get_dest  s   	

zPDFDocument.get_destc                 C   sb   d}|  D ]}| }td| |dkr n	|r|}qtdtd| |dus-J t|S )z0Internal function used to locate the first XRef.Nzfind_xref: %rs	   startxrefUnexpected EOFzxref found: pos=%r)Zrevreadlinesrv   r   r   r4   rg   )rQ   rd   prevr   r9   r9   r:   rJ    s   zPDFDocument.find_xrefr   rA  c                 C   s   | | |  z| \}}W n ty   tdw td|| t|tr;| | |  t	 }|
| n||ju rD|  t }|
| || | }td| d|v rlt|d }| ||| d|v r}t|d }| ||| dS )z$Reads XRefs from the given location.rr  z"read_xref_from: start=%d, token=%rr   ZXRefStmZPrevN)rx   resetr   r*   r4   r   r   r   rg   r   re   ZKEYWORD_XREFru   rh   r   r]   r$   rK  )rQ   rd   r   rA  r   tokenrN  rj   r9   r9   r:   rK    s6   





zPDFDocument.read_xref_from)r   TTr  )'r6   r7   r8   r?   r   r   r  r=  r   rg   r   r  r   rf   r   rP   r-   rW  rL  r!   rT   rU  r   r   rS  rX  rY  r   rc  r
   rd  rg  r   r   rp  rq  rJ  rW   rK  r9   r9   r9   r:   r<    sT   
 

<&r<  c                   @   s@   e Zd ZdZedee fddZede	de
defddZd	S )
re  zWPageLabels from the document catalog.

    See Section 8.3.1 in the PDF Reference.
    rK   c                 c   s    | j }t|dks|d d dkr!tjrtd|ddi f t|dD ]N\}\}}t|}|d}t	t
|dd}t|dd}|t|krSt|}	n|| \}
}|
| }t||| }	|	D ]}| ||}|| V  qfq&d S )Nr   z"PageLabels is missing page index 0r   Sr   r   ZSt)valuesrz   r   r   r   insert	enumerater(   r   r/   r%   r$   	itertoolscountr~   _format_page_label)rQ   r   nextr   Zlabel_dict_uncheckedZ
label_dictstyleprefixZfirst_valuerw  endr   Zrange_lengthvaluelabelr9   r9   r:   rf    s*   
zPageLabels.labelsr  r~  c                 C   s   |du rd}|S |t du rt| }|S |t du r"t|  }|S |t du r.t| }|S |t du r<t|  }|S |t du rHt| }|S td| d}|S )	z+Format page label value in a specific styleNr   Dr   r   r\  azUnknown page label style: %r)r,   rf   r1   upperr2   r   warning)r  r~  r  r9   r9   r:   r|     s*   
zPageLabels._format_page_labelN)r6   r7   r8   r?   propertyr
   rf   rf  r;  rg   r   r|  r9   r9   r9   r:   re    s    re  )[rz  loggingr   r   hashlibr   r   r   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   Zcryptography.hazmat.backendsr   Z&cryptography.hazmat.primitives.ciphersr   r   r   r   r   Zarcfourr   Zdata_structuresr   Z	pdfparserr   r   r   Zpdftypesr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Zpsparserr*   r+   r,   r-   utilsr.   r/   r0   r1   r2   	getLoggerr6   r   r4   SyntaxWarningr=   rA   rB   rC   rD   rE   UserWarningrF   rG   rH   rI   r   r   rM  rW   rh   r   r   r   r   r  r<  re  r9   r9   r9   r:   <module>   sT    <8
			J3P Jw  W