o
    f                     @   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   M/home/ubuntu/webapp/venv/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   ObjStm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 r[   r9   r^   r9   r9   r:   
get_objids~   r`   zPDFBaseXRef.get_objidsobjidc                 C   s   t |r[   )KeyErrorrQ   rb   r9   r9   r:   get_pos   s   zPDFBaseXRef.get_posparserNc                 C   rZ   r[   r\   )rQ   rf   r9   r9   r:   load   r`   zPDFBaseXRef.load)r6   r7   r8   r   strr   r_   r	   intra   r   r   re   r   rg   r9   r9   r9   r:   rY   z   s
     rY   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 r[   )offsetstrailerr^   r9   r9   r:   rP      s   
zPDFXRef.__init__c                 C      d| j   S )Nz<PDFXRef: offsets=%r>rk   keysr^   r9   r9   r:   __repr__      zPDFXRef.__repr__rf   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mapri   
ValueErrorrangerk   logdebugload_trailer)rQ   rf   poslinef	error_msgstartnobjsrb   _pos_bgenno_buse_br9   r9   r:   rg      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 )Nrr   r   zUnexpected EOF - file corruptedr   z
trailer=%r)	nexttokenr-   rh   
nextobjectr*   popr4   rl   updater(   r   r   )rQ   rf   r   kwddicxr9   r9   r:   r      s   
zPDFXRef.load_trailerc                 C      | j S r[   rl   r^   r9   r9   r:   r_         zPDFXRef.get_trailerc                 C   s
   | j  S r[   rn   r^   r9   r9   r:   ra         
zPDFXRef.get_objidsrb   c                 C   s   z| j | W S  ty    w r[   )rk   rc   rd   r9   r9   r:   re      s
   zPDFXRef.get_posrK   N)r6   r7   r8   rP   rh   rp   r   rg   r   r   r   r_   r   ri   ra   r   r   re   r9   r9   r9   r:   rj      s    
($rj   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   rm   )Nz<PDFXRefFallback: offsets=%r>rn   r^   r9   r9   r:   rp      rq   zPDFXRefFallback.__repr__z^(\d+)\s+(\d+)\s+obj\brf   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   rr   trailer: %rzlatin-1r   NN is not defined: %rrt   )rz   rw   r*   ry   r   r   r   rl   decode
PDFOBJ_CUEmatchgroupsri   rk   r   
isinstancer!   getLITERAL_OBJSTMr)   rc   r   STRICTr   r   get_dataappendr   minr|   r   )rQ   rf   r   
line_bytesr   mobjid_sgenno_srb   gennor   objstreamnparser1objsindexobjid1r9   r9   r:   rg      s\   





zPDFXRefFallback.load)
r6   r7   r8   rh   rp   recompiler   r   rg   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 r[   )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:   rp     r   zPDFXRefStream.__repr__rf   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   rt   zInvalid index numberWz&xref stream: objid=%s, fields=%d,%d,%dz, )r   r   r   r!   r   LITERAL_XREFr4   r|   r   r   extendr   r
   r   ri   r.   r   r   r   r   r   r   attrsrl   r   r   joinr~   repr)	rQ   rf   r   rb   r   r   r   sizeindex_arrayr9   r9   r:   rg     s0   $"
zPDFXRefStream.loadc                 C   r   r[   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   rt   )r   r   r   r   r0   r   )rQ   r   r   ioffsetentf1r9   r9   r:   ra   1  s   

zPDFXRefStream.get_objidsrb   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   rt   )r   rc   r   r   r   r   r   r0   )
rQ   rb   r   r   r   r   r   r   f2f3r9   r9   r:   re   =  s(   
"


zPDFXRefStream.get_posr   )r6   r7   r8   rP   rh   rp   r   rg   r   r   r_   r
   ri   ra   r   r   re   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)rt   ru   .supported_revisions docidparampasswordrK   Nc                 C   s   || _ || _|| _|   d S r[   )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U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 r[   )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  rq   z'PDFStandardSecurityHandler.is_printablec                 C   r   )N   r   r^   r9   r9   r:   is_modifiable  rq   z(PDFStandardSecurityHandler.is_modifiablec                 C   r   )N   r   r^   r9   r9   r:   is_extractable  rq   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 )Nrt   r   r          c                 3       | ]
}t | A fV  qd S r[   bytes.0cr   r9   r:   	<genexpr>      z7PDFStandardSecurityHandler.compute_u.<locals>.<genexpr>)r   r   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      ru   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   password_bytesr   r9   r9   r:   r     s
   


z'PDFStandardSecurityHandler.authenticatec                 C   s   |  |}| |r|S d S r[   )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 )Nrt   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   ru   r  r  r   rt      r   c                 3   r   r[   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   user_passwordr  r9   r   r:   r    s    




z6PDFStandardSecurityHandler.authenticate_owner_passwordrb   r   r   r   c                 C   s   |  |||S r[   )decrypt_rc4)rQ   rb   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  ru   rt   r   )	r   r  r  r   r   r   r|   r   r  )rQ   rb   r   r   r   r   r9   r9   r:   r    s
   .z&PDFStandardSecurityHandler.decrypt_rc4r   r   r[   )r6   r7   r8   r   r   r   ri   __annotations__r   r   r   rh   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   CFStmFStrFEncryptMetadataTz"Unsupported crypt filter: param=%rCFMz%Unknown crypt filter method: param=%rIdentityz Undefined crypt filter: param=%r)rO   r   r   r(   r   r   cfr+   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 )NV2AESV2)r  decrypt_aes128rQ   r&  r9   r9   r:   r$     s
   z$PDFStandardSecurityHandlerV4.get_cfmrb   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   Metadata)r	  r   r+   r!  r"  )rQ   rb   r   r   r   r&  tr9   r9   r:   r    s   
z$PDFStandardSecurityHandlerV4.decryptc                 C   s   |S r[   r9   )rQ   rb   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  ru   rt   s   sAlTr   backend)r   r  r  r   r   r   r|   r   r   AESr   CBCr   	decryptorr   )	rQ   rb   r   r   r   r   initialization_vector
ciphertextcipherr9   r9   r:   r)    s&   z+PDFStandardSecurityHandlerV4.decrypt_aes128r   )NN)r6   r7   r8   r   r   ri   r  r   rh   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   OE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 )N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   r0  r   r1  r   r:  r@  r?  rA  r;  )rQ   r   
password_br   r4  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 )Nr6  r   r   )saslprepzutf-8   )r   	_saslpreprG  r  )rQ   r   rG  r9   r9   r:   rD  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   rJ  rK  r9   r9   r:   rE  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   rJ  rK  r   r9   r9   r:   rL  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_3r|   )rQ   r   rJ  rK  initial_hashr  hashesround_nolast_byte_valk1e	next_hashr9   r9   r:   rM  x  s    


 	z)PDFStandardSecurityHandlerV5._r6_passwordinput_bytesc                 C   s   t dd | D d S )Nc                 s   s    | ]}|d  V  qdS )ru   Nr9   )r   br9   r9   r:   r     s    z<PDFStandardSecurityHandlerV5._bytes_mod_3.<locals>.<genexpr>ru   )sum)rY  r9   r9   r:   rQ    s   z)PDFStandardSecurityHandlerV5._bytes_mod_3r   rO  r   c                 C   s0   t t|t|}| }|||  S r[   )r   r   r/  r   r0  	encryptorr   finalize)rQ   r   rO  r   r4  r\  r9   r9   r:   rP    s   z-PDFStandardSecurityHandlerV5._aes_cbc_encryptrb   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   r0  r   r1  r   )rQ   rb   r   r   r2  r3  r4  r9   r9   r:   rC    s   
z+PDFStandardSecurityHandlerV5.decrypt_aes256r   r[   )r6   r7   r8   r   r   rh   r   r   ri   r   r$  r   rD  rE  rL  rM  staticmethodrQ  rP  rC  rU   r9   r9   rR   r:   r5  /  sP    $


"r5  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   rt   r   r  security_handler_registryr   Trf   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.NTEncryptID)r   r   InfoRootz(No /Root object! - Is this really a PDF?r   zCatalog not found!)ra  xrefsinfocatalog
encryptiondecipher_parser_cached_objs_parsed_objsset_documentr   r   r   	find_xrefread_xref_fromr4   rb  r   rg   r   r_   r&   r(   _initialize_passwordr   r   LITERAL_CATALOGr   r   )
rQ   rf   r   ra  rb  r   newxrefxrefrl   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FilterStandardzUnknown filter: param=%rr   r   zUnknown algorithm: param=%rF)rj  r+   r   rD   r$   r`  r  rk  r   r   r   rl  rb  )rQ   r   r   r   r   factoryhandlerr9   r9   r:   rr    s    



z PDFDocument._initialize_passwordr   r   rb   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 )Nrt   zindex too big: %r)rb   rn  _get_objectsra  
IndexErrorr   )rQ   r   r   rb   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   ri   rc   r   r   ro  r   r   r*   )rQ   r   r   rf   r   r   r   r9   r9   r:   r|    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 )Nrt   zobjid mismatch: {!r}={!r}rw  zInvalid object spec: offset=%r)
rl  rz   r   KEYWORD_OBJr   r|   r   r}   r-   r   )	rQ   r   rb   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)rg  r   r   r   rm  re   rc   r)   getobjr~  r  rk  r#   r   r!   	set_objidr*   r   r"   ra  )rQ   rb   r   r   ru  strmidr   r   r9   r9   r:   r  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 )N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 )	NTitleADestSEFirstLastr   Next)r(   r/   r%   r   )r  r  titledestactionsesearchr9   r:   r  x  s   


z(PDFDocument.get_outlines.<locals>.searchr   )ri  rA   rT   ri   r
   r_  OutlineTyper^   r9   r  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)ri  r  r    rc   rB   labels)rQ   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)NLimitsr  rt   Kids)r&   dictr   r
   r   r   rh   r   r   r.   r(   rc   )r  rV  k2r   namesr   r   r  r   lookupr9   r:   r    s"   "z'PDFDocument.lookup_name.<locals>.lookup)r(   ri  r    rc   r   rh   r   )rQ   r  r   r  d0r9   r  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 )NDests)r  rc   ri  rC   r(   )rQ   r&  r   r  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)revreadlinesrx   r   r   r4   ri   )rQ   rf   prevr   r9   r9   r:   rp    s   zPDFDocument.find_xrefr   rg  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.r  z"read_xref_from: start=%d, token=%rr   XRefStmPrevN)rz   resetr   r*   r4   r   r   r   ri   r   rg   KEYWORD_XREFrw   rj   r   r_   r$   rq  )rQ   rf   r   rg  r   tokenru  rl   r9   r9   r:   rq    s6   





zPDFDocument.read_xref_from)r   TTr  )'r6   r7   r8   r?   r   r  r5  r`  r   ri   r   r  r   rh   r   rP   r-   r  rr  r!   rT   r~  r   r   r|  r  r  r   r  r
   r  r  r   r   r  r  rp  rY   rq  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 )
r  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   St)valuesr|   r   r   r   insert	enumerater(   r   r/   r%   r$   	itertoolscountr   _format_page_label)rQ   r   nextr   label_dict_unchecked
label_dictstyleprefixfirst_valuer  endr   range_lengthvaluelabelr9   r9   r:   r    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,   rh   r1   upperr2   r   warning)r  r  r  r9   r9   r:   r     s*   
zPageLabels._format_page_labelN)r6   r7   r8   r?   propertyr
   rh   r  r^  ri   r   r  r9   r9   r9   r:   r    s    r  )[r  loggingr   r  hashlibr   r   r   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   r   r   r   r   arcfourr   data_structuresr   	pdfparserr   r   r   pdftypesr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   psparserr*   r+   r,   r-   utilsr.   r/   r0   r1   r2   	getLoggerr6   r   r4   SyntaxWarningr=   rA   rB   rC   rD   rE   UserWarningrF   rG   rH   rI   r   r   rs  rY   rj   r   r   r   r  r5  r_  r  r9   r9   r9   r:   <module>   sT    <8
			J3P Jw  W