o
    
zi                     @   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m	Z	 d dl
mZmZmZmZ d dl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  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ eAeBZCG dd de)ZDG dd deEZFG dd de"ZGG dd de"ZHG dd de"ZIG dd de"ZJG dd deJZKG dd  d eLZMG d!d" d"eLZNG d#d$ d$eJZOe8d%ZPe8d&ZQe8d'ZRG d(d) d)ZSG d*d+ d+eSZTG d,d- d-eTZUG d.d/ d/eSZVG d0d1 d1ZWG d2d3 d3eWZXG d4d5 d5eXZYG d6d7 d7ZZG d8d9 d9e Z[dS ):    N)CallableIterableIteratorKeysViewSequence)md5sha256sha384sha512)AnyClassVarcast)default_backend)Cipher
algorithmsmodes)settings)Arcfour)safe_int)
NumberTree)PDFExceptionPDFKeyErrorPDFObjectNotFoundPDFTypeError)	PDFParserPDFStreamParserPDFSyntaxError)	DecipherCallable	PDFStreamdecipher_all
dict_value	int_value
list_value	str_valuestream_value
uint_value)PSEOF)KWDLITliteral_name)choplistdecode_textformat_int_alphaformat_int_romannunpack	unpad_aesc                   @      e Zd ZdS )PDFNoValidXRefN__name__
__module____qualname__ r6   r6   S/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/pdfminer/pdfdocument.pyr1   4       r1   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r3   r4   r5   __doc__r6   r6   r6   r7   r:   8       r:   c                   @   r0   )PDFNoOutlinesNr2   r6   r6   r6   r7   r>   ?   r8   r>   c                   @   r0   )PDFNoPageLabelsNr2   r6   r6   r6   r7   r?   C   r8   r?   c                   @   r0   )PDFDestinationNotFoundNr2   r6   r6   r6   r7   r@   G   r8   r@   c                   @   r0   )PDFEncryptionErrorNr2   r6   r6   r6   r7   rA   K   r8   rA   c                   @   r0   )PDFPasswordIncorrectNr2   r6   r6   r6   r7   rB   O   r8   rB   c                   @   r9   )PDFEncryptionWarningzyLegacy warning for failed decryption.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr;   r6   r6   r6   r7   rC   S   r=   rC   c                   @   r9   )"PDFTextExtractionNotAllowedWarningzLegacy warning for PDF that does not allow extraction.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr;   r6   r6   r6   r7   rD   Z   r=   rD   c                   @   r0   )PDFTextExtractionNotAllowedNr2   r6   r6   r6   r7   rE   a   r8   rE   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dB eef fdd	Zd
eddfddZdS )PDFBaseXRefreturnc                 C      t NNotImplementedErrorselfr6   r6   r7   get_trailerl      zPDFBaseXRef.get_trailerc                 C   s   g S rL   r6   rO   r6   r6   r7   
get_objidso   rR   zPDFBaseXRef.get_objidsobjidNc                 C   s   t |rL   )r   rP   rT   r6   r6   r7   get_posu   s   zPDFBaseXRef.get_posparserc                 C   rK   rL   rM   )rP   rW   r6   r6   r7   loadx   rR   zPDFBaseXRef.load)r3   r4   r5   dictstrr   rQ   r   intrS   tuplerV   r   rX   r6   r6   r6   r7   rI   k   s
     rI   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dB eef fddZdS )PDFXRefrJ   Nc                 C   s   i | _ i | _d S rL   )offsetstrailerrO   r6   r6   r7   __init__}   s   
zPDFXRef.__init__c                 C      d| j  dS )Nz<PDFXRef: offsets=>r^   keysrO   r6   r6   r7   __repr__      zPDFXRef.__repr__rW   c                 C   s  	 z|  \}}| }|sW q W n ty" } ztd|d }~ww |dr.|| n|d}t|dkrEd|d|}t|z	tt	|\}}W n t
yg } zd|d|}t||d }~ww t||| D ]b}	z|  \}
}| }W n ty } ztd|d }~ww |d}t|d	krd
|d|}t||\}}}|dkrqot|}t|}|d ur|d urd ||f| j|	< qotd|	|| qoqtd| j | | d S )NTz Unexpected EOF - file corrupted?   trailer       zTrailer not found: z: line=zInvalid line:    zInvalid XRef format: z, line=   nzcNot adding object %s to xref because position %r or generation number %r cannot be parsed as an intzxref objects: %r)nextlinestripr&   r1   
startswithseeksplitlenmapr[   
ValueErrorranger   r^   logwarningdebugload_trailer)rP   rW   poslineerrf	error_msgstartnobjsrT   _pos_bgenno_buse_bpos_igenno_ir6   r6   r7   rX      sj   







/zPDFXRef.loadc                 C   s   z|  \}}|tdu sJ t|| \}}W n ty5   |d}|s-tdd |d \}}Y nw | jt	| t
d| j d S )Nrg      zUnexpected EOF - file corruptedr   z
trailer=%r)	nexttokenr'   rZ   
nextobjectr&   popr1   r_   updater    ru   rw   )rP   rW   r   kwddicxr6   r6   r7   rx      s   

zPDFXRef.load_trailerc                 C      | j S rL   r_   rO   r6   r6   r7   rQ         zPDFXRef.get_trailerc                 C   s
   | j  S rL   rc   rO   r6   r6   r7   rS         
zPDFXRef.get_objidsrT   c                 C   s
   | j | S rL   )r^   rU   r6   r6   r7   rV      r   zPDFXRef.get_posrJ   N)r3   r4   r5   r`   rZ   re   r   rX   rx   rY   r   rQ   r   r[   rS   r\   rV   r6   r6   r6   r7   r]   |   s    
3$r]   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 )	PDFXRefFallbackrJ   c                 C   ra   )Nz<PDFXRefFallback: offsets=rb   rc   rO   r6   r6   r7   re      rf   zPDFXRefFallback.__repr__z^(\d+)\s+(\d+)\s+obj\brW   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 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   rg   trailer: %rzlatin-1TypeNN is not defined: ri   )ro   rl   r&   rn   rx   ru   rw   r_   decode
PDFOBJ_CUEmatchgroupsr[   r^   r   
isinstancer   getLITERAL_OBJSTMr$   KeyErrorr   STRICTr   r   get_dataappendr   minrq   rt   )rP   rW   ry   
line_bytesrz   mobjid_sgenno_srT   gennor   objstreamnparser1objsindexobjid1r6   r6   r7   rX      s\   





zPDFXRefFallback.load)
r3   r4   r5   rZ   re   recompiler   r   rX   r6   r6   r6   r7   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dB eef fddZdS )PDFXRefStreamrJ   Nc                 C   s(   d | _ d | _d | _d | _d | _g | _d S rL   )dataentlenfl1fl2fl3rangesrO   r6   r6   r7   r`     s   
zPDFXRefStream.__init__c                 C   s   d| j dS )Nz<PDFXRefStream: ranges=rb   )r   rO   r6   r6   r7   re   
     zPDFXRefStream.__repr__rW   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   ri   zInvalid index numberWz&xref stream: objid=%s, fields=%d,%d,%dz, )r   r   r   r   r   LITERAL_XREFr1   rq   r   r   extendr   r   r\   r[   r*   r   r   r   r   r   r   attrsr_   ru   rw   joinrr   repr)	rP   rW   r   _objid_genno_kwdr   sizeindex_arrayr6   r6   r7   rX     s.   $"
zPDFXRefStream.loadc                 C   r   rL   r   rO   r6   r6   r7   rQ   &  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   ri   )r   rt   r   r   r.   r   )rP   r~   r   ioffsetentf1r6   r6   r7   rS   )  s   

zPDFXRefStream.get_objidsrT   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   ri   )r   r   r   r   r   r   r   r.   )
rP   rT   r   r~   r   r   r   r   f2f3r6   r6   r7   rV   4  s(   
"


zPDFXRefStream.get_posr   )r3   r4   r5   r`   rZ   re   r   rX   rY   r   rQ   r   r[   rS   r\   rV   r6   r6   r6   r7   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	d
B fddZde	d	e	d
B fd d!Zde	d	efd"d#Zde	d	e	d
B fd$d%Z	
d0d&ed'ed(e	d)e
eef d
B 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)ri   rj   .supported_revisions docidparampasswordrJ   Nc                 C   s   || _ || _|| _|   d S rL   )r   r   r   init)rP   r   r   r   r6   r6   r7   r`   U  s   z#PDFStandardSecurityHandler.__init__c                 C   s4   |    | j| jvrd| j}t||   d S )NzUnsupported revision: param=)init_paramsrr   r   rA   init_key)rP   r}   r6   r6   r7   r   `  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lengthrO   r6   r6   r7   r   g  s   z&PDFStandardSecurityHandler.init_paramsc                 C   s    |  | j| _| jd u rtd S rL   )authenticater   keyrB   rO   r6   r6   r7   r   o  s   
z#PDFStandardSecurityHandler.init_keyc                 C      t | jd@ S )N   boolr   rO   r6   r6   r7   is_printablet  r   z'PDFStandardSecurityHandler.is_printablec                 C   r   )N   r   rO   r6   r6   r7   is_modifiablew  r   z(PDFStandardSecurityHandler.is_modifiablec                 C   r   )N   r   rO   r6   r6   r7   is_extractablez  r   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 )Nri   r   r          c                 3       | ]
}t | A fV  qd S rL   bytes.0cr   r6   r7   	<genexpr>      z7PDFStandardSecurityHandler.compute_u.<locals>.<genexpr>)r   r   encryptPASSWORD_PADDINGr   r   r   digestrt   r   iter)rP   r   hashresultkr6   r   r7   	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      rj   r   2   )r   r   r   r   structpackr   r   r   r   PDFStandardSecurityHandlerV4encrypt_metadatar   r   rt   )rP   r   r   r   r   r   r6   r6   r7   compute_encryption_key  s    




z1PDFStandardSecurityHandler.compute_encryption_keyc                 C   s*   | d}| |}|d u r| |}|S )Nlatin1)encodeauthenticate_user_passwordauthenticate_owner_password)rP   r   password_bytesr   r6   r6   r7   r     s
   


z'PDFStandardSecurityHandler.authenticatec                 C   s   |  |}| |r|S d S rL   )r	  verify_encryption_key)rP   r   r   r6   r6   r7   r    s   

z5PDFStandardSecurityHandler.authenticate_user_passwordc                 C   s8   |  |}| jdkr|| jkS |d d | jd d kS )Nri   r   )r  r   r   )rP   r   r   r6   r6   r7   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   rj   r  r  r   ri      r   c                 3   r   rL   r   r   r   r6   r7   r     r   zIPDFStandardSecurityHandler.authenticate_owner_password.<locals>.<genexpr>)r   r   r   rt   r   r   r   decryptr   r   r   r  )rP   r   r   r   r   r   user_passwordr   r6   r   r7   r    s    




z6PDFStandardSecurityHandler.authenticate_owner_passwordrT   r   r   r   c                 C   s   |  |||S rL   )decrypt_rc4)rP   rT   r   r   r   r6   r6   r7   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  rj   ri   r   )	r   r  r  r   r   r   rq   r   r  )rP   rT   r   r   r   r   r6   r6   r7   r    s
   .z&PDFStandardSecurityHandler.decrypt_rc4r   r   rL   )r3   r4   r5   r   r   r\   r[   __annotations__r   r   rY   rZ   r   r`   r   r   r   r   r   r   r   r  r	  r   r  r  r  r  r  r6   r6   r6   r7   r   O  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
ge
f dB fd	d
Z		ddedede
deeef dB dedB 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   rJ   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|< qC| j| jd
< | j	| jvrzd| j}t|d S )N   CFStmFStrFEncryptMetadataTz Unsupported crypt filter: param=CFMz#Unknown crypt filter method: param=IdentityzUndefined crypt filter: param=)superr   r   r    r   r   cfr)   stmfstrfr   r  rA   cfmitemsget_cfmdecrypt_identity)rP   r}   r   r   r|   	__class__r6   r7   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rP   r(  r6   r6   r7   r$    s
   z$PDFStandardSecurityHandlerV4.get_cfmrT   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"  )rP   rT   r   r   r   r(  tr6   r6   r7   r    s   
z$PDFStandardSecurityHandlerV4.decryptc                 C   s   |S rL   r6   )rP   rT   r   r   r6   r6   r7   r%    rR   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}| |}	t|	S )Nr  rj   ri   s   sAlTr   backend)r   r  r  r   r   r   rq   r   r   AESr   CBCr   	decryptorr   r/   )
rP   rT   r   r   r   r   initialization_vector
ciphertextcipher	plaintextr6   r6   r7   r+    s(   z+PDFStandardSecurityHandlerV4.decrypt_aes128r   )NN)r3   r4   r5   r   r\   r[   r  r   rZ   r   r   r$  rY   r   r  r%  r+  __classcell__r6   r6   r&  r7   r    s*   
 $
"r  c                	       s  e Zd ZdZd" fddZdedeeeegef dB fddZ	d	ededB fd
dZ
d	edefddZ	d#d	edededB defddZ	d#d	edededB defddZ	d#d	edededB 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     rJ   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   )r  r   r   r#   r   oeuer   o_hasho_validation_salt
o_key_saltr   u_hashu_validation_salt
u_key_saltrO   r&  r6   r7   r   '  s   
z(PDFStandardSecurityHandlerV5.init_paramsr(  c                 C   s   |dkr| j S d S )NAESV3)decrypt_aes256r,  r6   r6   r7   r$  3  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_hashrA  r   r@  rB  r   r   r1  r   r2  r   r3  r   r>  rD  rC  rE  r?  )rP   r   
password_br   r6  r6   r6   r7   r   9  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   pdfminer._saslpreprK  r  )rP   r   rK  r6   r6   r7   rH  O  s   
z0PDFStandardSecurityHandlerV5._normalize_passwordsaltvectorc                 C   s.   | j dkr| |||S | ||dd |S )z2Compute password hash depending on revision numberr  r   r   )r   _r5_password_r6_password)rP   r   rN  rO  r6   r6   r7   rI  Y  s   
z+PDFStandardSecurityHandlerV5._password_hashc                 C   s,   t |}|| |dur|| | S )z#Compute the password for revision 5N)r   r   r   )rP   r   rN  rO  r   r6   r6   r7   rP  d  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 )	z#Compute the password for revision 6Nr   @   r   r   r   )r   ivr   r   )r   r   r   r	   r
   _aes_cbc_encrypt_bytes_mod_3rq   )rP   r   rN  rO  initial_hashr   hashesround_nolast_byte_valk1e	next_hashr6   r6   r7   rQ  q  s    


 	z)PDFStandardSecurityHandlerV5._r6_passwordinput_bytesc                 C   s   t dd | D d S )Nc                 s   s    | ]}|d  V  qdS )rj   Nr6   )r   br6   r6   r7   r     s    z<PDFStandardSecurityHandlerV5._bytes_mod_3.<locals>.<genexpr>rj   )sum)r]  r6   r6   r7   rU    s   z)PDFStandardSecurityHandlerV5._bytes_mod_3r   rS  r   c                 C   s0   t t|t|}| }|||  S rL   )r   r   r1  r   r2  	encryptorr   finalize)rP   r   rS  r   r6  r`  r6   r6   r7   rT    s   z-PDFStandardSecurityHandlerV5._aes_cbc_encryptrT   r   c                 C   sZ   |d d }|dd  }| j d usJ tt| j t|t d}| |}t	|S )Nr   r/  )
r   r   r   r1  r   r2  r   r3  r   r/   )rP   rT   r   r   r4  r5  r6  r7  r6   r6   r7   rG    s   
z+PDFStandardSecurityHandlerV5.decrypt_aes256r   rL   )r3   r4   r5   r   r   rZ   r   r[   r   r$  r   rH  rI  rP  rQ  staticmethodrU  rT  rG  r8  r6   r6   r&  r7   r9  $  sP    $


"r9  c                   @   sp  e Zd ZU dZeeeedZe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!B d
efd#d$Z"d%ee!B 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   ri   r   r  security_handler_registryr   TrW   r   cachingfallbackrJ   Nc           
      C   sl  || _ g | _g | _i | _d| _d| _d| _i | _i | _|| _| j	|  d | _
 | _| _z| |}| ||| j W n tyX   |rVd|_t }|| | j| Y nw | jD ]B}| }|seq\d|v rd|v rst|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 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!)re  xrefsinfocatalog
encryptiondecipher_parser_cached_objs_parsed_objsset_documentr   r   r   	find_xrefread_xref_fromr1   rf  r   rX   r   rQ   r"   r    _initialize_passwordr   r   LITERAL_CATALOGr   r   )
rP   rW   r   re  rf  ry   newxrefxrefr_   id_valuer6   r6   r7   r`     sR   



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 r5td|||||}|j| _| | _|	 | _	|
 | _
| jd usUJ d| j_d S )NFilterStandardzUnknown filter: param=r   r   zUnknown algorithm: param=F)rn  r)   r   rA   r!   rd  r  ro  r   r   r   rp  rf  )rP   r   r   r   r   factoryhandlerr6   r6   r7   rv    s   



z PDFDocument._initialize_passwordr   r   rT   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yI } ztd||d }~ww )Nri   zindex too big: )rT   rr  _get_objectsre  
IndexErrorr   )	rP   r   r   rT   r   r   r   r   r{   r6   r6   r7   _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y0   tjr,td|d d}Y nw t|	 }|
|  g }z	 | \}}|| q@ tyW   Y ||fS w )Nr   zNot a stream object: r   r   r   )r   r   r   r   r   r   r[   r   r   r   rs  r   r   r&   )rP   r   r   rW   r   r   r   r6   r6   r7   r    s*   

zPDFDocument._get_objectsry   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rVtd|d||tdkrctd|| j  \}}|S )Nri   zobjid mismatch: =r{  zInvalid object spec: offset=)	rp  ro   r   KEYWORD_OBJr   rq   r   r'   r   )	rP   ry   rT   r   r   r   r   r   r   r6   r6   r7   _getobj_parse$  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)rk  r   ru   rw   rq  rV   r   r$   getobjr  r  ro  r   r   r   	set_objidr&   r   r   re  )rP   rT   r   r   ry  strmidr   r   r6   r6   r7   r  @  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levelrJ   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 rT | d |E d H  d S d S )	NTitleADestSEFirstLastr   Next)r    r+   r#   r   )r  r  titledestactionsesearchr6   r7   r  n  s   


z(PDFDocument.get_outlines.<locals>.searchr   )rm  r>   objectr[   r   rc  OutlineTyperO   r6   r  r7   get_outlinesj  s   
 zPDFDocument.get_outlinesc              
   C   sH   | j dusJ zt| j d }W |jS  ttfy# } zt|d}~ww )zGenerate 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)rm  r  r   r   r?   labels)rP   page_labelsr{   r6   r6   r7   get_page_labels}  s   zPDFDocument.get_page_labelscatr   c              
      st   z	t | jd }W n ttfy } zt f|d }~ww t |  }dtttf dtf fdd|S )NNamesdrJ   c                    s   d| v rt | d \}}|k s|k rd S d| v r6t | d }ttttttB tf  td|}| S d| v rOt | d D ]}t	|}|rN|  S q@t
 f)NLimitsr  ri   Kids)r"   rY   r   r   r\   rZ   r   r   r*   r    r   )r  rZ  k2r   namesr   r   r  r   lookupr6   r7   r    s"   z'PDFDocument.lookup_name.<locals>.lookup)r    rm  r   r   r   rY   rZ   r   )rP   r  r   r  r{   d0r6   r  r7   lookup_name  s   "zPDFDocument.lookup_namer(  c                 C   sd   z	|  d|}W |S  ty1   d| jvrt|d t| jd }||vr*t|d || }Y |S w )NDests)r  r   rm  r@   r    )rP   r(  r   r  r6   r6   r7   get_dest  s   	



zPDFDocument.get_destc                 C   s   d}|  D ]C}| }td| |dkrEtd| | s'td|t|}|dks6td| |dkrAtd	||  S |rI|}qtd
)z0Internal function used to locate the first XRef.r   zfind_xref: %rs	   startxrefzxref found: pos=%rz!Invalid xref position, no digit: r   z!Invalid xref position, negative: l        z"Invalid xref position, too large: Unexpected EOF)revreadlinesrm   ru   rw   isdigitr1   r[   )rP   rW   prevrz   r~   r6   r6   r7   rt    s$   zPDFDocument.find_xrefr~   rk  c           	   
   C   s  | | |  z| \}}W n ty" } ztd|d}~ww td|| t|trA| | |  t	 }|
| n||ju rJ|  t }|
| || | }td| d|v rrt|d }| ||| d|v rt|d }| ||| dS dS )z$Reads XRefs from the given location.r  Nz"read_xref_from: start=%d, token=%rr   XRefStmPrev)ro   resetr   r&   r1   ru   rw   r   r[   r   rX   KEYWORD_XREFrl   r]   r   rQ   r!   ru  )	rP   rW   r~   rk  ry   tokenr{   ry  r_   r6   r6   r7   ru    s8   






zPDFDocument.read_xref_from)r   TTr  )'r3   r4   r5   r<   r   r  r9  rd  r   rY   r[   typer  r   rZ   r   r`   r'   r  rv  r   r  r  r\   listr  r  r  r   r  r   r  r  r   r  r  rt  rI   ru  r6   r6   r6   r7   rc    sT   
 

7(rc  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.
    rJ   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)valuesrq   r   r   r   insert	enumerater    r   r+   r#   r!   	itertoolscountrt   _format_page_label)rP   r   nextr~   label_dict_unchecked
label_dictstyleprefixfirst_valuer  endr   range_lengthvaluelabelr6   r6   r7   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(   rZ   r-   upperr,   ru   rv   )r  r  r  r6   r6   r7   r  "  s*   
zPageLabels._format_page_labelN)r3   r4   r5   r<   propertyr   rZ   r  rb  r[   r   r  r6   r6   r6   r7   r    s    r  )\r  loggingr   r  collections.abcr   r   r   r   r   hashlibr   r   r	   r
   typingr   r   r   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   r   r   pdfminerr   pdfminer.arcfourr   pdfminer.castingr   pdfminer.data_structuresr   pdfminer.pdfexceptionsr   r   r   r   pdfminer.pdfparserr   r   r   pdfminer.pdftypesr   r   r   r    r!   r"   r#   r$   r%   pdfminer.psexceptionsr&   pdfminer.psparserr'   r(   r)   pdfminer.utilsr*   r+   r,   r-   r.   r/   	getLoggerr3   ru   r1   SyntaxWarningr:   r>   r?   r@   rA   rB   UserWarningrC   rD   rE   r   r   rw  rI   r]   r   r   r   r  r9  rc  r  r6   r6   r6   r7   <module>   sZ    , 
	R3N I}  ^