
    i?1i                     B   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j~                  e@      ZA G d de$      ZB G d deC      ZD G d de)      ZE G d de)      ZF G d de)      ZG G d de)      ZH G d deH      ZI G d deJ      ZK G d deJ      ZL G d  d!eH      ZM G d" d#eM      ZN e7d$      ZO e7d%      ZP e7d&      ZQ G d' d(      ZR G d) d*eR      ZS G d+ d,eS      ZT G d- d.eR      ZU G d/ d0      ZV G d1 d2eV      ZW G d3 d4eW      ZX G d5 d6      ZY G d7 d8e"      ZZy)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y)PDFNoValidXRefN__name__
__module____qualname__     ^/home/www/therecruiter.miabetepe.com/venv/lib/python3.12/site-packages/pdfminer/pdfdocument.pyr5   r5   1       r;   r5   c                       e Zd ZdZy)PDFNoValidXRefWarningztLegacy warning for missing xref.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr7   r8   r9   __doc__r:   r;   r<   r?   r?   5       
 	r;   r?   c                       e Zd Zy)PDFNoOutlinesNr6   r:   r;   r<   rD   rD   >   r=   r;   rD   c                       e Zd Zy)PDFNoPageLabelsNr6   r:   r;   r<   rF   rF   B   r=   r;   rF   c                       e Zd Zy)PDFDestinationNotFoundNr6   r:   r;   r<   rH   rH   F   r=   r;   rH   c                       e Zd Zy)PDFEncryptionErrorNr6   r:   r;   r<   rJ   rJ   J   r=   r;   rJ   c                       e Zd Zy)PDFPasswordIncorrectNr6   r:   r;   r<   rL   rL   N   r=   r;   rL   c                       e Zd ZdZy)PDFEncryptionWarningzyLegacy warning for failed decryption.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr@   r:   r;   r<   rN   rN   R   rB   r;   rN   c                       e Zd ZdZy)"PDFTextExtractionNotAllowedWarningzLegacy warning for PDF that does not allow extraction.

    Not used anymore because warnings.warn is replaced by logger.Logger.warn.
    Nr@   r:   r;   r<   rP   rP   [   rB   r;   rP   c                       e Zd Zy)PDFTextExtractionNotAllowedNr6   r:   r;   r<   rR   rR   d   r=   r;   rR   c                   (     e Zd Zdeddf fdZ xZS ) PDFTextExtractionNotAllowedErrorargsreturnNc                 D    ddl m}  |dt               t        |   |  y )Nr   )warnzhPDFTextExtractionNotAllowedError will be removed in the future. Use PDFTextExtractionNotAllowed instead.)warningsrX   DeprecationWarningsuper__init__)selfrU   rX   	__class__s      r<   r\   z)PDFTextExtractionNotAllowedError.__init__i   s%    !7	

 	$r;   )r7   r8   r9   objectr\   __classcell__r^   s   @r<   rT   rT   h   s     f      r;   rT   ObjStmXRefCatalogc                   f    e Zd Zdeeef   fdZdee   fdZ	dede
ee   eef   fdZdeddfdZy)	PDFBaseXRefrV   c                     t         NNotImplementedErrorr]   s    r<   get_trailerzPDFBaseXRef.get_trailer{       !!r;   c                     g S rh   r:   rk   s    r<   
get_objidszPDFBaseXRef.get_objids~   s    	r;   objidc                     t        |      rh   )KeyErrorr]   rp   s     r<   get_poszPDFBaseXRef.get_pos   s    uor;   parserNc                     t         rh   ri   )r]   ru   s     r<   loadzPDFBaseXRef.load   rm   r;   )r7   r8   r9   r	   strr   rl   r
   intro   r   r   rt   r   rw   r:   r;   r<   rf   rf   z   s\    "T#s(^ "HSM S U8C=#s+B%C "9 " "r;   rf   c                       e Zd ZddZdefdZdeddfdZdeddfdZde	ee
f   fdZdee   fd	Zd
edeee   eef   fdZy)PDFXRefrV   Nc                      i | _         i | _        y rh   )offsetstrailerrk   s    r<   r\   zPDFXRef.__init__   s    BD')r;   c                 <    d| j                   j                         z  S )Nz<PDFXRef: offsets=%r>r}   keysrk   s    r<   __repr__zPDFXRef.__repr__   s    &$,,*;*;*=>>r;   ru   c                    	 	 |j                         \  }}|j                         }|s(	 |j	                  d      r|j                  |       n|j                  d      }t        |      dk7  rdj                  ||      }t        |      	 t        t        |      \  }}t        |||z         D ]  }	 |j                         \  }	}|j                         }|j                  d      }t        |      dk7  rdj                  ||      }t        |      |\  }
}}|d	k7  rod t        |
      t        |      f| j                  |<    At        j                  d
| j                         | j!                  |       y # t        $ r t        d      w xY w# t        $ r dj                  ||      }t        |      w xY w# t        $ r t        d      w xY w)Nz 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+   r5   
startswithseeksplitlenformatmapry   
ValueErrorranger}   logdebugload_trailer)r]   ru   poslinef	error_msgstartnobjsrp   _pos_bgenno_buse_bs                r<   rw   zPDFXRef.load   s   I$oo/dzz|  z*C 

4 A1v{@GGPTU	$Y//0!$S! ueem4 GM & 1IQ::<D JJt$q6Q; F M M!I )33*+'D='+SZW&FU#G) H 			$dll3&!?  I$%GHHI  0;BB64P	$Y//0  M()KLLMs#   %E5 
F 0#F75F
'F47Gc                 ~   	 |j                         \  }}|t        d      u sJ t        |             |j                         \  }}| j                  j                  t        |             t        j                  d| j                         y # t        $ r) |j                  d      }|st        d      |d   \  }}Y vw xY w)Nr   r   zUnexpected EOF - file corruptedr   z
trailer=%r)	nexttokenr.   rx   
nextobjectr+   popr5   r~   updater)   r   r   )r]   ru   r   kwddicxs         r<   r   zPDFXRef.load_trailer   s    	'')HQ#j/)33s83)((*HQ 	JsO,		,-  	

1A$%FGGtHQ		s   AB
 
/B<;B<c                     | j                   S rh   r~   rk   s    r<   rl   zPDFXRef.get_trailer       ||r;   c                 6    | j                   j                         S rh   r   rk   s    r<   ro   zPDFXRef.get_objids   s    ||  ""r;   rp   c                 >    	 | j                   |   S # t        $ r  w xY wrh   )r}   rr   rs   s     r<   rt   zPDFXRef.get_pos   s(    	<<&& 		s    rV   N)r7   r8   r9   r\   rx   r   r   rw   r   r	   r   rl   r   ry   ro   r   r   rt   r:   r;   r<   r{   r{      s    *?# ?&"9 &" &"P.9 . .T#s(^ #HSM #S U8C=#s+B%C r;   r{   c                   L    e Zd ZdefdZ ej                  d      ZdeddfdZ	y)PDFXRefFallbackrV   c                 <    d| j                   j                         z  S )Nz<PDFXRefFallback: offsets=%r>r   rk   s    r<   r   zPDFXRefFallback.__repr__   s    .$,,2C2C2EFFr;   z^(\d+)\s+(\d+)\s+obj\bru   Nc                 F   |j                  d       	 	 |j                         \  }}|j                  d      rC|j                  |       | j	                  |       t
        j                  d| j                         y |j                  d      }| j                  j                  |      }|s|j                         \  }}t        |      }t        |      }	d ||	f| j                  |<   |j                  |       |j                         \  }
}t        |t               rx|j#                  d      t$        u rat'        |      }	 |d   }t1        |j3                               }g }	 	 |j                         \  }
}|j5                  t7        t        |             3# t        $ r Y y w xY w# t(        $ r# t*        j,                  rt/        d|z        d}Y w xY w# t        $ r Y nw xY wt9        |t;        |      dz        }t=        |      D ]  }||dz     }||df| j                  |<    )	Nr   r   trailer: %rzlatin-1r   NN is not defined: %rr   )r   r   r+   r   r   r   r   r~   decode
PDFOBJ_CUEmatchgroupsry   r}   r   
isinstancer"   getLITERAL_OBJSTMr*   rr   r   STRICTr   r   get_dataappendr   minr   r   )r]   ru   r   
line_bytesr   mobjid_sgenno_srp   gennor   objstreamnparser1objsindexobjid1s                     r<   rw   zPDFXRefFallback.load   s   A$*OO$5!j $$Z0C !!&)		-6$$Y/D%%d+A!"WgLELE#'e"4DLLKK((*HQ#y)cggfo.O%c*sA
 *&//*;<"$#*#5#5#7CDcN3 A   ,   ,-Cf-LMMA  3t9>*"1X =E!%!)_F,15!+<DLL(=s5   F <F" 4G 	FF")GG	GG)
r7   r8   r9   rx   r   recompiler   r   rw   r:   r;   r<   r   r      s6    G# G 56J*=9 *= *=r;   r   c                   z    e Zd ZddZdefdZdeddfdZdeee	f   fdZ
dee   fdZd	edeee   eef   fd
Zy)PDFXRefStreamrV   Nc                 X    d | _         d | _        d | _        d | _        d | _        g | _        y rh   )dataentlenfl1fl2fl3rangesrk   s    r<   r\   zPDFXRefStream.__init__	  s,    %)	%)"&"&"&-/r;   c                      d| j                   z  S )Nz<PDFXRefStream: ranges=%r>)r   rk   s    r<   r   zPDFXRefStream.__repr__  s    +t{{;;r;   ru   c           	         |j                         \  }}|j                         \  }}|j                         \  }}|j                         \  }}t        |t              r|j	                  d      t
        urt        d      |d   }|j	                  dd|f      }t        |      dz  dk7  rt        d      | j                  j                  t        t        t        t        t        f      t        d|                   |d   \  | _        | _        | _        | j                   | j"                  | j$                  J |j'                         | _        | j                   | j"                  z   | j$                  z   | _        |j,                  | _        t0        j3                  d	d
j5                  t7        t8        | j                              | j                   | j"                  | j$                         y )Nr   zInvalid PDF stream spec.SizeIndexr   r   zInvalid index numberWz&xref stream: objid=%s, fields=%d,%d,%dz, )r   r   r   r"   r   LITERAL_XREFr5   r   r   r   extendr   r   r   ry   r/   r   r   r   r   r   r   attrsr~   r   r   joinr   repr)	r]   ru   r   rp   r   r   r   sizeindex_arrays	            r<   rw   zPDFXRefStream.load  s   %%'
E%%'
E##%C'')F&),

60B,0V !;<<f~jj1d)4{a1$ !7884sCx 98A{;STU)/&48TXxx#(<AUUUOO%	hh)DHH4||		4IIc$,-HHHHHH	
 	r;   c                     | j                   S rh   r   rk   s    r<   rl   zPDFXRefStream.get_trailer.  r   r;   c              #   8  K   | j                   D ]  \  }}t        |      D ]t  }| j                  J | j                  J | j                  |z  }| j                  ||| j                  z    }t	        |d | j
                   d      }|dk(  s|dk(  sn||z    v  y w)Nr   r   )r   r   r   r   r1   r   )r]   r   r   ioffsetentf1s          r<   ro   zPDFXRefStream.get_objids1  s     "kk 	$NUE5\ ${{...yy,,,qii$++)=>S488_a07bAg!)O$	$ 	s   BBBrp   c                 n   d}| j                   D ]!  \  }}||k  r|||z   k  r
|||z
  z  } n||z  }# t        |      | j                  J | j                  J | j                  | j
                  | j                  J | j                  |z  }| j                  ||| j                  z    }t        |d | j                   d      }t        || j                  | j                  | j
                  z          }t        || j                  | j
                  z   d        }	|dk(  rd ||	fS |dk(  r||	dfS t        |      )Nr   r   r   )r   rr   r   r   r   r   r   r1   )
r]   rp   r   r   r   r   r   r   f2f3s
             r<   rt   zPDFXRefStream.get_pos=  sH   "kk 	"NUE~%%%-"7&	" 5/!{{&&&yy$$$xx#(<AUUUu$ii$++!56S488_a(SDHHtxx$789SDHH,./07"b>!1WA; 5/!r;   r   )r7   r8   r9   r\   rx   r   r   rw   r	   r   rl   r   ry   ro   r   r   rt   r:   r;   r<   r   r     sm    0<# <9  4T#s(^ 
HSM 
"S "U8C=#s+B%C "r;   r   c                   L   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
ZddZddZddZdefdZdefdZdefdZde	de	fdZde	de	fdZdedee	   fdZde	dee	   fdZde	defdZde	dee	   fdZ	 d dedede	dee
eef      de	f
dZdedede	de	fdZy	)!PDFStandardSecurityHandlers    (N^NuAd NV.. h>/dSiz)r   r   .supported_revisionsdocidparampasswordrV   Nc                 N    || _         || _        || _        | j                          y rh   )r   r   r   init)r]   r   r   r   s       r<   r\   z#PDFStandardSecurityHandler.__init__`  s%     

 		r;   c                     | j                          | j                  | j                  vrd| j                  z  }t	        |      | j                          y )NzUnsupported revision: param=%r)init_paramsrr   r   rJ   init_key)r]   r   s     r<   r   zPDFStandardSecurityHandler.initi  sE    6611184::EI$Y//r;   c                    t        | j                  j                  dd            | _        t        | j                  d         | _        t        | j                  d   d      | _        t        | j                  d         | _        t        | j                  d         | _	        t        | j                  j                  dd	            | _
        y )
NVr   RP    OULength(   )r%   r   r   vr   r(   pr&   oulengthrk   s    r<   r   z&PDFStandardSecurityHandler.init_paramsq  s    4::>>#q124::c?+DJJsOR04::c?+4::c?+

x <=r;   c                 h    | j                  | j                        | _        | j                  t        y rh   )authenticater   keyrL   rk   s    r<   r   z#PDFStandardSecurityHandler.init_keyz  s+    $$T]]388&&r;   c                 2    t        | j                  dz        S )N   boolr  rk   s    r<   is_printablez'PDFStandardSecurityHandler.is_printable      DFFQJr;   c                 2    t        | j                  dz        S )N   r  rk   s    r<   is_modifiablez(PDFStandardSecurityHandler.is_modifiable  r  r;   c                 2    t        | j                  dz        S )N   r  rk   s    r<   is_extractablez)PDFStandardSecurityHandler.is_extractable  s    DFFRK  r;   r  c                    | j                   dk(  r$t        |      j                  | j                        S t	        | j                        }|j                  | j                  d          t        |      j                  |j                               }t        dd      D ]?  dj                  fdt        |      D              }t        |      j                  |      }A ||z  }|S )Nr   r   r      r;   c              3   <   K   | ]  }t        |z  f        y wrh   bytes.0cr   s     r<   	<genexpr>z7PDFStandardSecurityHandler.compute_u.<locals>.<genexpr>       @UAE8_@   )r   r   encryptPASSWORD_PADDINGr   r   r   digestr   r   iter)r]   r  hashresultkr   s        @r<   	compute_uz$PDFStandardSecurityHandler.compute_u  s    66Q;3<''(=(=>> t,,-DKK

1&S\))$++-8F1b\ 4HH@d3i@@ ++F34 fFMr;   c                 B   || j                   z   d d }t        |      }|j                  | j                         |j                  t	        j
                  d| j                               |j                  | j                  d          | j                  dk\  r+t        t        |       j                  s|j                  d       |j                         }d}| j                  dk\  r;| j                  dz  }t        d	      D ]  }t        |d |       j                         }  |d | S )
Nr   <Lr   r
  s      r   r  2   )r!  r   r   r  structpackr  r   r   r   PDFStandardSecurityHandlerV4encrypt_metadatar"  r  r   )r]   r   r$  r%  r   r   s         r<   compute_encryption_keyz1PDFStandardSecurityHandler.compute_encryption_key  s    t444cr:8}DFFFKKdff-.DJJqM"66Q;4d;LL/066Q;q A2Y 2VBQZ//12bqzr;   c                 p    |j                  d      }| j                  |      }|| j                  |      }|S )Nlatin1)encodeauthenticate_user_passwordauthenticate_owner_password)r]   r   password_bytesr  s       r<   r  z'PDFStandardSecurityHandler.authenticate  s:    !2--n=;22>BC
r;   c                 L    | j                  |      }| j                  |      r|S y rh   )r0  verify_encryption_key)r]   r   r  s      r<   r4  z5PDFStandardSecurityHandler.authenticate_user_password  s(    ))(3%%c*Jr;   c                     | j                  |      }| j                  dk(  r|| j                  k(  S |d d | j                  d d k(  S )Nr   r  )r'  r   r  )r]   r  r  s      r<   r8  z0PDFStandardSecurityHandler.verify_encryption_key  sD    NN366Q;;"v$$r;   c                 T   || j                   z   d d }t        |      }| j                  dk\  r)t        d      D ]  }t        |j	                               } d}| j                  dk\  r| j
                  dz  }|j	                         d | }| j                  dk(  r%t        |      j                  | j                        }n[| j                  }t        ddd      D ]?  d	j                  fd
t        |      D              }t        |      j                  |      }A | j                  |      S )Nr   r   r+  r*  r  r      r;   c              3   <   K   | ]  }t        |z  f        y wrh   r  r  s     r<   r  zIPDFStandardSecurityHandler.authenticate_owner_password.<locals>.<genexpr>  r  r  )r!  r   r   r   r"  r  r   decryptr  r   r#  r4  )	r]   r   r$  r   r   r  user_passwordr&  r   s	           @r<   r5  z6PDFStandardSecurityHandler.authenticate_owner_password  s   t444cr:8}66Q;2Y *4;;=)*66Q;q AkkmBQ66Q;#CL008M FFM2r2& BHH@d3i@@ '
 2 2= AB ..}==r;   rp   r   r   r   c                 (    | j                  |||      S rh   )decrypt_rc4)r]   rp   r   r   r   s        r<   r>  z"PDFStandardSecurityHandler.decrypt  s     ud33r;   c                 4   | j                   J | j                   t        j                  d|      d d z   t        j                  d|      d d z   }t        |      }|j	                         d t        t        |      d       }t        |      j                  |      S )Nr)  r   r   r  )	r  r,  r-  r   r"  r   r   r   r>  )r]   rp   r   r   r  r$  s         r<   rA  z&PDFStandardSecurityHandler.decrypt_rc4  s    xx###hhT51"155D%8PQSRS8TT3xkkm/c#c(B/0s|##D))r;    r   rh   )r7   r8   r9   r!  r   r   ry   __annotations__r   r  r	   rx   r   r\   r   r   r   r  r  r  r  r'  r0  r   r  r4  r8  r5  r>  rA  r:   r;   r<   r   r   X  sr   	1  ,2sCx1 NPe_-1#s(^GJ	 d   t  ! !U u u  &S Xe_ 5 Xe_ % %4 %>E >huo >2 +/44 4 	4
 S#X'4 
4* *S * *% *r;   r   c                        e Zd ZU dZeedf   ed<   d fdZdede	e
eeegef      fdZ	 	 dded	ed
ede	eeef      de	e   defdZded	ed
edefdZded	ed
edefdZ xZS )r.  )r
  .r   rV   c                 (   t         |           d| _        t        | j                  j                  d            | _        t        | j                  d         | _        t        | j                  d         | _	        t        | j                  j                  dd            | _        | j                  | j                  k7  rd| j                  z  }t        |      i | _        | j                  j                         D ]M  \  }}| j                  t        |d               }|d	| j                  z  }t        |      || j                  |<   O | j                   | j                  d
<   | j                  | j                  vrd| j                  z  }t        |      y )N   CFStmFStrFEncryptMetadataTz"Unsupported crypt filter: param=%rCFMz%Unknown crypt filter method: param=%rIdentityz Undefined crypt filter: param=%r)r[   r   r  r)   r   r   cfr,   stmfstrfr  r/  rJ   cfmitemsget_cfmdecrypt_identity)r]   r   r&  r  r   r^   s        r<   r   z(PDFStandardSecurityHandlerV4.init_params  sF   TZZ^^D12 F!34	 F!34	 $TZZ^^4Et%L M99		!<tzzII$Y//GGMMO 	DAq\!E(34AyCdjjP	(33DHHQK	  $4499DHH$:TZZGI$Y//r;   namec                 H    |dk(  r| j                   S |dk(  r| j                  S y )NV2AESV2)rA  decrypt_aes128r]   rV  s     r<   rT  z$PDFStandardSecurityHandlerV4.get_cfm   s+    4<###W_&&&r;   rp   r   r   r   c                     | j                   s%|#|j                  d      }|t        |      dk(  r|S || j                  } | j                  |   |||      S )Nr   Metadata)r/  r   r,   rQ  rR  )r]   rp   r   r   r   rV  ts          r<   r>  z$PDFStandardSecurityHandlerV4.decrypt  s\     $$):		&!A}aJ!><99Dtxx~eUD11r;   c                     |S rh   r:   )r]   rp   r   r   s       r<   rU  z-PDFStandardSecurityHandlerV4.decrypt_identity  s    r;   c                    | j                   J | j                   t        j                  d|      d d z   t        j                  d|      d d z   dz   }t        |      }|j	                         d t        t        |      d       }|d d }|dd  }t        t        j                  |      t        j                  |      t                     }|j                         j                  |      S )Nr)  r   r   s   sAlTr  backend)r  r,  r-  r   r"  r   r   r   r   AESr   CBCr   	decryptorr   )	r]   rp   r   r   r  r$  initialization_vector
ciphertextciphers	            r<   rZ  z+PDFStandardSecurityHandlerV4.decrypt_aes128  s    xx###HHkk$&r*+kk$&r*+  	 3xkkm/c#c(B/0 $Sb	"#Y
NN3II+,#%

 !((44r;   r   )NN)r7   r8   r9   r   r   ry   rE  r   rx   r   r   r  rT  r	   r   r>  rU  rZ  r`   ra   s   @r<   r.  r.    s    +/sCx/.C HXsC6G6N-O$P  +/"22 2 	2
 S#X'2 sm2 
2 c # U u 5C 5 55 5U 5r;   r.  c            	            e Zd ZdZd fdZdedeeeee	ge	f      fdZ
dedee	   fdZdede	fdZ	 dde	d	e	d
ee	   de	fdZ	 dde	d	e	d
ee	   de	fdZ	 dde	d	e	d
ee	   de	fdZede	defd       Zde	de	de	de	fdZdedede	de	fdZ xZS )PDFStandardSecurityHandlerV5)r*     rV   c                    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  | _        y )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_salt)r]   r^   s    r<   r   z(PDFStandardSecurityHandlerV5.init_params3  s    DJJt,-DJJt,-ffSbk!%2&&+ffSbk!%2&&+r;   rV  c                 &    |dk(  r| j                   S y )NAESV3)decrypt_aes256r[  s     r<   rT  z$PDFStandardSecurityHandlerV5.get_cfm@  s    7?&&&r;   r   c                    | j                  |      }| j                  || j                  | j                        }|| j                  k(  r| j                  || j
                  | j                        }t        t        j                  |      t        j                  d      t                     }|j                         j                  | j                        S | j                  || j                        }|| j                   k(  r| j                  || j"                        }t        t        j                  |      t        j                  d      t                     }|j                         j                  | j$                        S y )Ns                   ra  )_normalize_password_password_hashrs  r  rr  rt  r   r   rc  r   rd  r   re  r   rp  rv  ru  rw  rq  )r]   r   
password_br$  rh  s        r<   r  z)PDFStandardSecurityHandlerV5.authenticateF  s!   --h7
"":t/E/EtvvN4;;&&z4??DFFKDt$eii
&;_EVF ##%,,TWW55"":t/E/EF4;;&&z4??CDt$eii
&;_EVF ##%,,TWW55r;   c                 j    | j                   dk(  r|syddlm}  ||      }|j                  d      d d S )Nrk  r;   r   )saslprepzutf-8   )r   	_saslprepr  r3  )r]   r   r  s      r<   r|  z0PDFStandardSecurityHandlerV5._normalize_passwordX  s6    66Q;+)Hw'--r;   saltvectorc                 r    | j                   dk(  r| j                  |||      S | j                  ||dd |      S )zD
        Compute password hash depending on revision number
        r*  r   r  )r   _r5_password_r6_password)r]   r   r  r  s       r<   r}  z+PDFStandardSecurityHandlerV5._password_hashb  s?     66Q;$$XtV<<  4!9f==r;   c                     t        |      }|j                  |       ||j                  |       |j                         S )z5
        Compute the password for revision 5
        )r   r   r"  )r]   r   r  r  r$  s        r<   r  z)PDFStandardSecurityHandlerV5._r5_passwordl  s8     hDKK{{}r;   c                    t        |      }|j                  |       ||j                  |       |j                         }t         t        t        f}dx}}|dk  s||dz
  kD  r{||z   |xs dz   dz  }	| j                  |dd |dd |	      }
|| j                  |
dd          } ||
      j                         }|
t        |
      dz
     }|dz  }|dk  rr||dz
  kD  r{|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   )r]   r   r  r  initial_hashr&  hashesround_nolast_byte_valk1e	next_hashs               r<   r  z)PDFStandardSecurityHandlerV5._r6_passwordx  s
    h'D!'!&&)#$$=m}x"}<Q,&-C0B6B%%!CR&Qr"XB%GA t003B89I!##%Ac!fqjMMMH m}x"}< "vr;   input_bytesc                 ,    t        d | D              dz  S )Nc              3   &   K   | ]	  }|d z    yw)r   Nr:   )r  bs     r<   r  z<PDFStandardSecurityHandlerV5._bytes_mod_3.<locals>.<genexpr>  s     .Q1q5.s   r   )sum)r  s    r<   r  z)PDFStandardSecurityHandlerV5._bytes_mod_3  s     .+..22r;   r  r  r   c                     t        t        j                  |      t        j                  |            }|j                         }|j                  |      |j                         z   S rh   )r   r   rc  r   rd  	encryptorr   finalize)r]   r  r  r   rh  r  s         r<   r  z-PDFStandardSecurityHandlerV5._aes_cbc_encrypt  sL    
s+UYYr];$$&	%	(:(:(<<<r;   rp   r   c                     |d d }|dd  }| j                   J t        t        j                  | j                         t	        j
                  |      t                     }|j                         j                  |      S )Nr  ra  )	r  r   r   rc  r   rd  r   re  r   )r]   rp   r   r   rf  rg  rh  s          r<   rz  z+PDFStandardSecurityHandlerV5.decrypt_aes256  sr     $Sb	"#Y
xx###NN488$II+,#%

 !((44r;   r   rh   )r7   r8   r9   r   r   rx   r   r   ry   r  rT  r  r|  r}  r  r  staticmethodr  r  rz  r`   ra   s   @r<   rj  rj  /  sU    C HXsC6G6N-O$P S Xe_ $.C .E . GK>>%*>4<UO>	> GK

%*
4<UO
	
 GK%*4<UO	0 3% 3C 3 3=E =u =E =e =
	5C 	5 	55 	5U 	5r;   rj  c                   z   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
Z ed      Zd!dedd	fdZdede	de	defdZdedeee   e	f   fdZde	de	defdZde	defdZeeeeeef   Zdee   fdZdee   fdZdede ee!f   defdZ"de ee!f   defdZ#dede	fdZ$dede	dee%   dd	fdZ&y	)"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   r   r
  r*  security_handler_registryru   r   cachingfallbackrV   Nc                    || _         g | _        g | _        i | _        d| _        d| _        d| _        i | _        i | _        || _        | j                  j                  |        dx| _
        x| _        | _        	 | j                  |      }| j                  ||| j                         | j                  D ]  }|j)                         }|sd|v r;d|v rt+        |d         }	nd}	|	t-        |d         f| _        | j/                  |       d|v r'| j                  j'                  t-        |d                d|v st-        |d         | _         n t1        d      | j                  j3                  d	      t4        urt6        j8                  rt1        d
      y# t        $ rC |r=d|_        t#               }|j%                  |       | j                  j'                  |       Y :w xY w)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!)r  xrefsinfocatalog
encryptiondecipher_parser_cached_objs_parsed_objsset_documentr  r  r  	find_xrefread_xref_fromr5   r  r   rw   r   rl   r'   r)   _initialize_passwordr   r   LITERAL_CATALOGr   r   )
r]   ru   r   r  r  r   newxrefxrefr~   id_values
             r<   r\   zPDFDocument.__init__  s    (*
	')5948;=AC!!$'GKKKD.1D	+..(CTZZ8 JJ 	MD&&(GG#7?)'$-8H
  *H#+Z	8J-K"L))(3 		  GFO!<= )'&/:)	M, !!KLL<<F#?:$%9::C  	+"&)+V$

!!'*	+s   8.F AG! G!   objc                    | j                   J | j                   \  }}t        |j                  d            dk7  rt        d|z        t	        |j                  dd            }| j
                  j                  |      }|t        d|z         ||||      }|j                  | _        |j                         | _        |j                         | _	        |j                         | _
        | j                  J d| j                  _        y )NFilterStandardzUnknown filter: param=%rr   r   zUnknown algorithm: param=%rF)r  r,   r   rJ   r%   r  r>  r  r  r  r  r  r  )r]   r   r   r   r  factoryhandlers          r<   r  z PDFDocument._initialize_password  s    ***		(+,
:$%?%%GHHeiiQ'(0044Q7?$%BU%JKK%1#002$224%446||''' %r;   r   r   rp   c                 T   |j                   | j                  v r| j                  |j                      \  }}nI| j                  |      \  }}| j                  r)|j                   J ||f| j                  |j                   <   |dz  |z   }	 ||   }|S # t        $ r t        d|z        w xY w)Nr   zindex too big: %r)rp   r  _get_objectsr  
IndexErrorr   )r]   r   r   rp   r   r   r   r   s           r<   _getobj_objstmzPDFDocument._getobj_objstm  s    <<4,,,))&,,7IT1))&1IT1||||///37)!!&,,/EEM	>q'C 
  	> !4u!<==	>s   B B'c                    |j                  d      t        urt        j                  rt	        d|z        	 t        t        |d         }t        |j                               }|j                  |        g }	 	 |j                         \  }}|j                  |       %# t        $ r# t        j                  rt	        d|z        d}Y ~w xY w# t        $ r Y ||fS w xY w)Nr   zNot a stream object: %rr   r   r   )r   r   r   r   r   r   ry   rr   r   r   r  r   r   r+   )r]   r   r   ru   r   r   r   s          r<   r  zPDFDocument._get_objects  s    ::f^3$%>%GHH	S&+&A
 !!23D!	!,,.CC    	$%;f%DEEA	  	ay	s#   B 7&C )C	C		CCr   c                    | j                   J | j                   j                  |       | j                   j                         \  }}| j                   j                         \  }}| j                   j                         \  }}||k7  r`g }|| j                  ur=| j                   j                         \  }}|j	                  |       || j                  ur=t        |      dk\  r|d   }||k7  rt        dj                  ||            |t        d      k7  rt        d|z        | j                   j                         \  }}|S )Nr   zobjid mismatch: {!r}={!r}r  zInvalid object spec: offset=%r)
r  r   r   KEYWORD_OBJr   r   r   r   r.   r   )	r]   r   rp   r   r   r   r   r   r   s	            r<   _getobj_parsezPDFDocument._getobj_parse0  s!   ||'''#ll,,.F\\++-
E<<))+C U?AT---<<113C T--- 1v{2U? !<!C!CFE!RSS#f+ !AC!GHH<<**,C
r;   c                    | j                   st        d      t        j                  d|       || j                  v r| j                  |   \  }}|S | j                   D ]  }	 |j                  |      \  }}}	 |.t        | j                  |            }| j                  |||      }n6| j                  ||      }| j                  rt        | j                  |||      }t        |t              r|j                  ||        n t%        |      t        j                  d||       | j&                  r||f| j                  |<   |S # t        $ r Y w xY w# t         t"        f$ r Y w xY w)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=%rzregister: objid=%r: %r)r  r    r   r   r  rt   rr   r*   getobjr  r  r  r$   r   r"   	set_objidr+   r   r#   r  )r]   rp   r   r   r  strmidr   r   s           r<   r  zPDFDocument.getobjL  sb    zz?@@		$e,D%%%,,U3LS%4 
1 

 /-1\\%-@*VUE)!-dkk&.A!B"11&%G"00>==".t}}eUC"PC!#y1eU3!/( (..II.s;||,/<!!%(
+    ~. s%    E6BE	EEE$#E$c                     d| j                   vrt        dt        dt        dt        t
        j                     ffd | j                   d   d      S )NOutlinesentrylevelrV   c              3   X  K   t        |       } d| v r[d| v sd| v rSt        t        | d               }| j                  d      }| j                  d      }| j                  d      }|||||f d| v rd| v r | d   |dz         E d {    d| v r | d   |      E d {    y 7 7 w)	NTitleADestSEFirstLastr   Next)r)   r0   r&   r   )r  r  titledestactionsesearchs         r<   r  z(PDFDocument.get_outlines.<locals>.searchx  s     u%E%%<6U?'	%.(ABE 99V,D"YYs^F4B %vr::%FeO!%.%!)<<<!%-777 =7s$   BB*B&	B* B(!B*(B*r   )r  rD   r_   ry   r   r  OutlineType)r]   r  s    @r<   get_outlineszPDFDocument.get_outlinest  sR    T\\)	& 	 	+:Q:Q1R 	 dll:.22r;   c                     | j                   J 	 t        | j                   d         }|j
                  S # t        t        f$ r t        w xY 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.
        
PageLabels)r  r  r!   rr   rF   labels)r]   page_labelss     r<   get_page_labelszPDFDocument.get_page_labels  sV     ||'''	"$T\\,%?@K !!! h' 	"!!	"s	   4 A
catr  c                     	 t        | j                  d         }t        |         }dt        t
        t        f   dt        ffd |      S # t        t        f$ r t        f      w xY w)NNamesdrV   c           	      p   d| v rt        | d         \  }}|k  s|k  ry d| v rWt        | d         }t        t        t        t        t
        t        t        f   t        f      t        d|                  }|   S d| v r*t        | d         D ]  } 	t        |            }|s|c S  t        f      )NLimitsr  r   Kids)r'   dictr   r   r   r   rx   r  r   r/   r)   rr   )
r  r  k2r   namesr  r  r  r  lookups
          r<   r  z'PDFDocument.lookup_name.<locals>.lookup  s    1}%ak2R8rCx!|!!G*-%c5j(93(>"?@(1dBST Sz!{#AfI. !Az!}-A ! C:&&r;   )r)   r  r!   rr   r	   rx   r   )r]   r  r  r  d0r  s    ``  @r<   lookup_namezPDFDocument.lookup_name  sw    	't||G45E c
#	'd38n 	' 	'$ bz/ h' 	'C:&&	's   A A1rV  c                     	 | j                  d|      }|S # t        $ rI d| j                  vrt        |      t	        | j                  d         }||vrt        |      ||   }Y |S w xY w)NDests)r  rr   r  rH   r)   )r]   rV  r   r  s       r<   get_destzPDFDocument.get_dest  s{    
	""7D1C 
  	dll*,T22DLL12B2~,T22T(C
	s    AA('A(c                     d}|j                         D ]4  }|j                         }t        j                  d|       |dk(  r n|s3|}6 t	        d      t        j                  d|       |J t        |      S )z0Internal function used to locate the first XRef.Nzfind_xref: %rs	   startxrefUnexpected EOFzxref found: pos=%r)revreadlinesr   r   r   r5   ry   )r]   ru   prevr   s       r<   r  zPDFDocument.find_xref  s     '') 	3D::<DIIot,|#	3 !!122		&-4yr;   r   r  c                    |j                  |       |j                          	 |j                         \  }}t
        j                  d||       t        |t              r=|j                  |       |j                          t               }|j                  |       n9||j                  u r|j                          t               }|j                  |       |j                  |       |j                         }t
        j                  d|       d|v r!t!        |d         }| j#                  |||       d|v r!t!        |d         }| j#                  |||       y# t        $ r t	        d      w xY w)z$Reads XRefs from the given location.r  z"read_xref_from: start=%d, token=%rr   XRefStmPrevN)r   resetr   r+   r5   r   r   r   ry   r   rw   KEYWORD_XREFr   r{   r   rl   r%   r  )r]   ru   r   r  r   tokenr  r~   s           r<   r  zPDFDocument.read_xref_from  s9    	E	3!++-LS% 			6uEeS!KKLLN -DIIf+++!9DIIfT""$		-)GI./CU3WGFO,CU31  	3 !122	3s   E E*)rD  TTrC  )'r7   r8   r9   rA   r   r.  rj  r  r	   ry   r   rE  r   rx   r  r\   r.   r  r  r"   r_   r  r   r   r  r  r  r   r  r   r  r  r   r  r  r  r  rf   r  r:   r;   r<   r  r    s   
 &%''	NtC.H)I$IJ  :: : 	:
 : 
:x f+KS $ $Y s 3 6 9 tF|S7H1I * S V 8$C $F $L S#sC/0K3h{3 3*"# "$s sEz): s 8U3:. 3 	 c $  (+ 484E 	 r;   r  c                   J    e Zd ZdZedee   fd       Zede	de
defd       Zy)r  zWPageLabels from the document catalog.

    See Section 8.3.1 in the PDF Reference.
    rV   c           	   #   X  K   | j                   }t        |      dk(  s|d   d   dk7  r/t        j                  rt	        d      |j                  ddi f       t        |d      D ]  \  }\  }}t        |      }|j                  d      }t        t        |j                  dd                  }t        |j                  dd            }|t        |      k(  rt        j                  |      }	n||   \  }
}|
|z
  }t        |||z         }	|	D ]  }| j                  ||      }||z      y w)Nr   z"PageLabels is missing page index 0r   Sr   r;   St)valuesr   r   r   r   insert	enumerater)   r   r0   r&   r%   	itertoolscountr   _format_page_label)r]   r   nextr   label_dict_unchecked
label_dictstyleprefixfirst_valuer  endr   range_lengthvaluelabels                  r<   r  zPageLabels.labels  s*     v;!vay|q0$%IJJ a!R)5>vq5I 	%1T0E/#$89JNN3'E :>>#s+C!DEF#JNN4$;<Ks6{" )2(DQ"U{{K,,FG %//u=un$%	%s   D(D*r  r  c                 ~   |d}|S |t        d      u rt        |       }|S |t        d      u rt        |       j                         }|S |t        d      u rt        |       }|S |t        d      u rt	        |       j                         }|S |t        d      u rt	        |       }|S t
        j                  d|       d}|S )z+Format page label value in a specific stylerD  Dr   r   r  azUnknown page label style: %r)r-   rx   r2   upperr3   r   warning)r  r  r  s      r<   r  zPageLabels._format_page_label   s     =E  c#hJE  c#h$U+113E  c#h$U+E  c#h$U+113E  c#h$U+E  KK6>Er;   N)r7   r8   r9   rA   propertyr   rx   r  r  ry   r   r  r:   r;   r<   r  r    sO    
 % % %< # c c  r;   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   rD  r   arcfourr   data_structuresr   	pdfparserr   r   r   pdftypesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   psparserr+   r,   r-   r.   utilsr/   r0   r1   r2   r3   	getLoggerr7   r   r5   SyntaxWarningr?   rD   rF   rH   rJ   rL   UserWarningrN   rP   rR   rT   r   r   r  rf   r{   r   r   r   r.  rj  r  r  r:   r;   r<   <module>r&     s     	  / /     9 L L   ' A A    4 3 U Ug!	^ 		M 		L 		l 		\ 		 		- 		; 		 		"4 		 'B 	  X6{i." ""Gk GT0=g 0=fM"K M"`J* J*ZG5#= G5Tt5#? t5nR Rj
7 7r;   