
    :Qg|                     V   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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZA  ej                  eC      ZD G d de$      ZE G d deF      ZG G d de2      ZH G d de2      ZI G d de2      ZJ G d de2      ZK G d deK      ZL G d deM      ZN G d  d!eM      ZO G d" d#eK      ZP G d$ d%eP      ZQ e8d&      ZR e8d'      ZS e8d(      ZT G d) d*      ZU G d+ d,eU      ZV G d- d.eV      ZW G d/ d0eU      ZX G d1 d2      ZY G d3 d4eY      ZZ G d5 d6eZ      Z[ G d7 d8      Z\ G d9 d:e"      Z]y);    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	PDFStreamdecipher_all	int_value	str_value
list_value
uint_value
dict_valuestream_value)PDFExceptionPDFTypeErrorPDFObjectNotFoundPDFKeyError)literal_nameLITKWD)PSEOF)choplistdecode_textnunpackformat_int_romanformat_int_alphac                       e Zd Zy)PDFNoValidXRefN__name__
__module____qualname__     Q/var/www/html/answerous/venv/lib/python3.12/site-packages/pdfminer/pdfdocument.pyr6   r6   0       r<   r6   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r8   r9   r:   __doc__r;   r<   r=   r@   r@   4       
 	r<   r@   c                       e Zd Zy)PDFNoOutlinesNr7   r;   r<   r=   rE   rE   =   r>   r<   rE   c                       e Zd Zy)PDFNoPageLabelsNr7   r;   r<   r=   rG   rG   A   r>   r<   rG   c                       e Zd Zy)PDFDestinationNotFoundNr7   r;   r<   r=   rI   rI   E   r>   r<   rI   c                       e Zd Zy)PDFEncryptionErrorNr7   r;   r<   r=   rK   rK   I   r>   r<   rK   c                       e Zd Zy)PDFPasswordIncorrectNr7   r;   r<   r=   rM   rM   M   r>   r<   rM   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.
    NrA   r;   r<   r=   rO   rO   Q   rC   r<   rO   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.
    NrA   r;   r<   r=   rQ   rQ   Z   rC   r<   rQ   c                       e Zd Zy)PDFTextExtractionNotAllowedNr7   r;   r<   r=   rS   rS   c   r>   r<   rS   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.)warningsrY   DeprecationWarningsuper__init__)selfrV   rY   	__class__s      r=   r]   z)PDFTextExtractionNotAllowedError.__init__h   s%    !7	

 	$r<   )r8   r9   r:   objectr]   __classcell__r_   s   @r=   rU   rU   g   s     f      r<   rU   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)	PDFBaseXRefrW   c                     t         NNotImplementedErrorr^   s    r=   get_trailerzPDFBaseXRef.get_trailerz       !!r<   c                     g S ri   r;   rl   s    r=   
get_objidszPDFBaseXRef.get_objids}   s    	r<   objidc                     t        |      ri   )r+   r^   rq   s     r=   get_poszPDFBaseXRef.get_pos   s    %  r<   parserNc                     t         ri   rj   )r^   ru   s     r=   loadzPDFBaseXRef.load   rn   r<   )r8   r9   r:   r	   strr   rm   r
   intrp   r   r   rt   r   rw   r;   r<   r=   rg   rg   y   s\    "T#s(^ "HSM !S !U8C=#s+B%C !"9 " "r<   rg   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)PDFXRefrW   Nc                      i | _         i | _        y ri   )offsetstrailerrl   s    r=   r]   zPDFXRef.__init__   s    BD')r<   c                 <    d| j                   j                         z  S )Nz<PDFXRef: offsets=%r>r}   keysrl   s    r=   __repr__zPDFXRef.__repr__   s    &$,,*;*;*=>>r<   ru   c                 v   	 	 |j                         \  }}|j                         }|s(	 |j	                  d      r|j                  |       n|j                  d      }t        |      dk7  rd|d|}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                  |<    7t        j                  d| j                         | j!                  |       y # t        $ r t        d      w xY w# t        $ r d|d|}t        |      w xY w# t        $ r t        d      w xY w)Nz Unexpected EOF - file corrupted?   trailer       zTrailer not found: z: line=zInvalid line:    z$Invalid XRef format: {!r}, line={!r}   nzxref objects: %r)nextlinestripr/   r6   
startswithseeksplitlenmapry   
ValueErrorrangeformatr}   logdebugload_trailer)r^   ru   poslinef	error_msgstartnobjsrq   _pos_bgenno_buse_bs                r=   rw   zPDFXRef.load   s   I$oo/dzz|  z*C 

4 A1v{1&74(K	$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,VJgdXF	$Y//0  M()KLLMs#   %E+  F &#F#+F F #F8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/   popr6   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 ri   r~   rl   s    r=   rm   zPDFXRef.get_trailer       ||r<   c                 6    | j                   j                         S ri   r   rl   s    r=   rp   zPDFXRef.get_objids   s    ||  ""r<   rq   c                      | j                   |   S ri   )r}   rs   s     r=   rt   zPDFXRef.get_pos   s    ||E""r<   rW   N)r8   r9   r:   r]   rx   r   r   rw   r   r	   r   rm   r   ry   rp   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)PDFXRefFallbackrW   c                 <    d| j                   j                         z  S )Nz<PDFXRefFallback: offsets=%r>r   rl   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'   KeyErrorr   STRICTr   r   get_dataappendr   minr   r   )r^   ru   r   
line_bytesr   mobjid_sgenno_srq   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)
r8   r9   r:   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)PDFXRefStreamrW   Nc                 X    d | _         d | _        d | _        d | _        d | _        g | _        y ri   )dataentlenfl1fl2fl3rangesrl   s    r=   r]   zPDFXRefStream.__init__  s,    %)	%)"&"&"&-/r<   c                      d| j                   z  S )Nz<PDFXRefStream: ranges=%r>)r   rl   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_XREFr6   r   r   r   extendr   r   r   ry   r0   r   r   r   r   r   r   attrsr~   r   r   joinr   repr)	r^   ru   r   rq   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 ri   r   rl   s    r=   rm   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   r2   r   )r^   r   r   ioffsetentf1s          r=   rp   zPDFXRefStream.get_objids-  s     "kk 	$NUE5\ ${{...yy,,,qii$++)=>S488_a07bAg!)O$	$ 	s   BBBrq   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   r+   r   r   r   r   r   r2   )
r^   rq   r   r   r   r   r   r   f2f3s
             r=   rt   zPDFXRefStream.get_pos9  sJ   "kk 	%NUE~%%%-"7&	% e$${{&&&yy$$$xx#(<AUUUu$ii$++!56S488_a(SDHHtxx$789SDHH,./07"b>!1WA; e$$r<   r   )r8   r9   r:   r]   rx   r   r   rw   r	   r   rm   r   ry   rp   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passwordrW   Nc                 N    || _         || _        || _        | j                          y ri   )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   rK   init_key)r^   r   s     r=   r   zPDFStandardSecurityHandler.inite  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lengthrl   s    r=   r   z&PDFStandardSecurityHandler.init_paramsm  s    4::>>#q124::c?+DJJsOR04::c?+4::c?+

x <=r<   c                 h    | j                  | j                        | _        | j                  t        y ri   )authenticater   keyrM   rl   s    r=   r   z#PDFStandardSecurityHandler.init_keyv  s+    $$T]]388&&r<   c                 2    t        | j                  dz        S )N   boolr  rl   s    r=   is_printablez'PDFStandardSecurityHandler.is_printable|      DFFQJr<   c                 2    t        | j                  dz        S )N   r  rl   s    r=   is_modifiablez(PDFStandardSecurityHandler.is_modifiable  r  r<   c                 2    t        | j                  dz        S )N   r  rl   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ri   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 ri   )r1  verify_encryption_key)r^   r   r	  s      r=   r5  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=   r9  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ri   r  r  s     r=   r  zIPDFStandardSecurityHandler.authenticate_owner_password.<locals>.<genexpr>  r  r   )r"  r   r   r   r#  r  r   decryptr  r   r$  r5  )	r^   r   r%  r   r   r	  user_passwordr'  r   s	           @r=   r6  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<   rq   r   r   r   c                 (    | j                  |||      S ri   )decrypt_rc4)r^   rq   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^   rq   r   r   r	  r%  s         r=   rB  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   ri   )r8   r9   r:   r"  r   r   ry   __annotations__r   r  r	   rx   r   r]   r   r   r   r  r  r  r  r(  r1  r   r  r5  r9  r6  r?  rB  r;   r<   r=   r   r   T  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   rW   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  r0  rK   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)rB  decrypt_aes128r^   rW  s     r=   rU  z$PDFStandardSecurityHandlerV4.get_cfm  s+    4<###W_&&&r<   rq   r   r   r   c                     | j                   s%|#|j                  d      }|t        |      dk(  r|S || j                  } | j                  |   |||      S )Nr   Metadata)r0  r   r,   rR  rS  )r^   rq   r   r   r   rW  ts          r=   r?  z$PDFStandardSecurityHandlerV4.decrypt  s\     $$):		&!A}aJ!><99Dtxx~eUD11r<   c                     |S ri   r;   )r^   rq   r   r   s       r=   rV  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^   rq   r   r   r	  r%  initialization_vector
ciphertextciphers	            r=   r[  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)r8   r9   r:   r   r   ry   rF  r   rx   r   r   r  rU  r	   r   r?  rV  r[  ra   rb   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+     rW   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_params/  s    DJJt,-DJJt,-ffSbk!%2&&+ffSbk!%2&&+r<   rW  c                 &    |dk(  r| j                   S y )NAESV3)decrypt_aes256r\  s     r=   rU  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                   rb  )_normalize_password_password_hashrt  r  rs  ru  r   r   rd  r   re  r   rf  r   rq  rw  rv  rx  rr  )r^   r   
password_br%  ri  s        r=   r  z)PDFStandardSecurityHandlerV5.authenticateB  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 )Nrl  r<   r   )saslprepzutf-8   )r   	_saslprepr  r4  )r^   r   r  s      r=   r}  z0PDFStandardSecurityHandlerV5._normalize_passwordT  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_hash^  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_passwordh  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_passwordt  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 ri   )r   r   rd  r   re  	encryptorr   finalize)r^   r	  r  r   ri  r  s         r=   r  z-PDFStandardSecurityHandlerV5._aes_cbc_encrypt  sL    
s+UYYr];$$&	%	(:(:(<<<r<   rq   r   c                     |d d }|dd  }| j                   J t        t        j                  | j                         t	        j
                  |      t                     }|j                         j                  |      S )Nr  rb  )	r	  r   r   rd  r   re  r   rf  r   )r^   rq   r   r   rg  rh  ri  s          r=   r{  z+PDFStandardSecurityHandlerV5.decrypt_aes256  sr     $Sb	"#Y
xx###NN488$II+,#%

 !((44r<   r   ri   )r8   r9   r:   r   r   rx   r   r   ry   r  rU  r  r}  r~  r  r  staticmethodr  r  r{  ra   rb   s   @r=   rk  rk  +  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<   rk  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fallbackrW   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_fromr6   r  r   rw   r   rm   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   rK   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   rq   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)rq   r  _get_objectsr  
IndexErrorr   )r^   r   r   rq   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   r   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                 n   | 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|d|      |t        d      k7  rt        d|z        | j                   j                         \  }}|S )Nr   zobjid mismatch: =r  zInvalid object spec: offset=%r)	r  r   r   KEYWORD_OBJr   r   r   r.   r   )	r^   r   rq   r   r   r   r   r   r   s	            r=   _getobj_parsezPDFDocument._getobj_parse,  s!   ||'''#ll,,.F\\++-
E<<))+C U?AT---<<113C T--- 1v{2U? #3F:Qui!HII#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   r   r'   getobjr  r  r  r!   r   r    	set_objidr/   r   r*   r  )r^   rq   r   r   r  strmidr   r   s           r=   r  zPDFDocument.getobjH  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levelrW   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&   r1   r#   r   )r  r  titledestactionsesearchs         r=   r  z(PDFDocument.get_outlines.<locals>.searcht  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  rE   r`   ry   r   r  OutlineType)r^   r  s    @r=   get_outlineszPDFDocument.get_outlinesp  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)   r   rG   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drW   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   r0   r&   r+   )
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 ! sCj))r<   )r&   r  r)   r   r+   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' 	*sCj))	*s   A A1rW  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  r   r  rI   r&   )r^   rW  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   r6   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/   r6   r   r   r   ry   r   rw   KEYWORD_XREFr   r{   r   rm   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*)rE  TTrD  )'r8   r9   r:   rB   r   r/  rk  r  r	   ry   r   rF  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  rg   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.
    rW   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   r1   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 stylerE  Dr   r   r  azUnknown page label style: %r)r-   rx   r3   upperr4   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)r8   r9   r:   rB   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   rE  r   arcfourr   data_structuresr   	pdfparserr   r   r   pdftypesr   r    r!   r"   r#   r$   r%   r&   r'   pdfexceptionsr(   r)   r*   r+   psparserr,   r-   r.   psexceptionsr/   utilsr0   r1   r2   r3   r4   	getLoggerr8   r   r6   SyntaxWarningr@   rE   rG   rI   rK   rM   UserWarningrO   rQ   rS   rU   r   r   r  rg   r{   r   r   r   r/  rk  r  r  r;   r<   r=   <module>r*     s     	  / /     9 L L   ' A A
 
 
 V U , ,  U Ug!	^ 		M 		L 		l 		\ 		 		- 		; 		 		"4 		 'B 	  X6{i." ""D#k D#N0=g 0=fM%K M%`J* J*ZG5#= G5Tt5#? t5nR Rj
7 7r<   