
    ,hk                        d dl Z d dlZd dlZd dlZ	 d dlZ	 d dlmZ d dlm	Z	 d dl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z%  ejL                  e'      Z( G d de       Z) G d de      Z* G d d e      Z+ G d! d"e      Z, G d# d$e,      Z- G d% d&e,      Z. ed'      Z/ ed(      Z0 ed)      Z1 G d* d+e2      Z3 G d, d-e3      Z4 G d. d/e4      Z5 G d0 d1e3      Z6 G d2 d3e2      Z7 G d4 d5e7      Z8 G d6 d7e8      Z9 G d8 d9e2      Z:y# e$ r d dlZY \w xY w# e$ r dxZ	ZddlmZ Y _w xY w):    N)ARC4)AES)SHA256   )arcfour)PSEOF)literal_name)LIT)KWD)settings)PDFException)PDFTypeError)	PDFStream)PDFObjectNotFound)decipher_all)	int_value)	str_value)
list_value)
dict_value)stream_value)PDFSyntaxError)PDFStreamParser)choplist)nunpack)decode_textc                       e Zd Zy)PDFNoValidXRefN__name__
__module____qualname__     V/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/pdfminer/pdfdocument.pyr   r   ,       r#   r   c                       e Zd Zy)PDFNoOutlinesNr   r"   r#   r$   r'   r'   /   r%   r#   r'   c                       e Zd Zy)PDFDestinationNotFoundNr   r"   r#   r$   r)   r)   2   r%   r#   r)   c                       e Zd Zy)PDFEncryptionErrorNr   r"   r#   r$   r+   r+   5   r%   r#   r+   c                       e Zd Zy)PDFPasswordIncorrectNr   r"   r#   r$   r-   r-   8   r%   r#   r-   c                       e Zd Zy)PDFTextExtractionNotAllowedNr   r"   r#   r$   r/   r/   ;   r%   r#   r/   ObjStmXRefCatalogc                       e Zd Zd Zd Zd Zy)PDFBaseXRefc                     t         N)NotImplementedErrorselfs    r$   get_trailerzPDFBaseXRef.get_trailerH   s    !!r#   c                     g S r6   r"   r8   s    r$   
get_objidszPDFBaseXRef.get_objidsK   s    	r#   c                     t        |      r6   )KeyErrorr9   objids     r$   get_poszPDFBaseXRef.get_posQ   s    uor#   N)r   r    r!   r:   r<   rA   r"   r#   r$   r4   r4   F   s    "r#   r4   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	PDFXRefc                      i | _         i | _        y r6   )offsetstrailerr8   s    r$   __init__zPDFXRef.__init__Y   s    r#   c                 <    d| j                   j                         z  S )Nz<PDFXRef: offsets=%r>rE   keysr8   s    r$   __repr__zPDFXRef.__repr__^   s    &$,,*;*;*=>>r#   c                 
   	 	 |j                         \  }}|j                         s&	 |st        d|z        |j	                  d      r|j                  |       n)|j                         j                  d      }t        |      dk7  rt        d|d|      	 t        j                  rt        t        |      \  }}nt        t        |      \  }}t        |||z         D ]  }	 |j                         \  }}|j                         j                  d      }t        |      d	k7  rt        d
|d|      |\  }}	}
|
dk7  rad t        j                  rt        |      n
t        |      t        |	      f| j                  |<    t         j#                  d| j                         | j%                  |       y # t        $ r t        d      w xY w# t        $ r t        d|d|      w xY w# t        $ r t        d      w xY w)Nz Unexpected EOF - file corrupted?zPremature eof: %r   trailer       zTrailer not found: z: line=zInvalid line:    zInvalid XRef format: z, line=   nzxref objects: %r)nextlinestripr   r   
startswithseeksplitlensixPY2maplongint
ValueErrorrangerE   loginfoload_trailer)r9   parserposlinefstartnobjsr@   _gennouses              r$   loadzPDFXRef.loada   s   I$oo/dzz| $ $%86%ABBz*C 

""4(A1v{$QU%VWWS77%(q\NUE%(a[NUE ueEk2 ]M & 1IQ JJL&&t,q6Q;(vW[)\]]$%!eS$;'+#''T#Ys3xQTUZQ[&\U#]- D 	#T\\2&!?  I$%GHHI  S$FD%QRRS
  M()KLLMs#   #F7 7G %G-7GG*-H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)NrM   r   zUnexpected EOF - file corruptedr   z
trailer=%r)	nexttokenr   str
nextobjectr   popr   rF   updater   r_   debug)r9   rb   rh   kwddicxs         r$   ra   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 r6   rF   r8   s    r$   r:   zPDFXRef.get_trailer       ||r#   c                 @    t        j                  | j                        S r6   )rX   iterkeysrE   r8   s    r$   r<   zPDFXRef.get_objids   s    ||DLL))r#   c                 >    	 | j                   |   S # t        $ r  w xY wr6   )rE   r>   r?   s     r$   rA   zPDFXRef.get_pos   s(    	<<&& 		s    N)
r   r    r!   rG   rK   rk   ra   r:   r<   rA   r"   r#   r$   rC   rC   W   s&    
?%N*r#   rC   c                   <    e Zd Zd Z ej
                  d      Zd Zy)PDFXRefFallbackc                 <    d| j                   j                         z  S )Nz<PDFXRefFallback: offsets=%r>rI   r8   s    r$   rK   zPDFXRefFallback.__repr__   s    .$,,2C2C2EFFr#   z^(\d+)\s+(\d+)\s+obj\bc                 L   |j                  d       	 	 |j                         \  }}|j                  d      rD|j                  |       | j	                  |       t
        j                  d| j                         	 y t        j                  r|j                  d      }| j                  j                  |      }|s|j                         \  }}t        |      }t        |      }d ||f| j                  |<   |j                  |       |j!                         \  }}t#        |t$              rj|j'                  d      t(        u rSt+        |      }		 |	d   }
t5        |	j7                               }g }	 	 |j!                         \  }}|j9                  |       %# t        $ r Y y w xY w# t,        $ r# t.        j0                  rt3        d|	z        d}
Y ~w xY w# t        $ r Y nw xY wt;        |
t=        |      dz        }
t?        |
      D ]  }||dz     }||df| j                  |<    )	Nr   rM   trailer: %rzlatin-1TypeNN is not defined: %rrO   ) rU   rR   r   rT   ra   r_   r`   rF   rX   PY3decode
PDFOBJ_CUEmatchgroupsr\   rE   ro   
isinstancer   getLITERAL_OBJSTMr   r>   r   STRICTr   r   get_dataappendminrW   r^   )r9   rb   rc   rd   mr@   ri   rh   objstreamnparser1objsindexobjid1s                  r$   rk   zPDFXRefFallback.load   s   A$oo/d z*C !!&)5B 	A ww[[+%%d+AXXZNUEJEJE#'e"4DLLKK((*HQ#y)cggfo.O%c*sA
 *&//*;<#*#5#5#7CC( C   L 	O.   ,-Cf-LMMA  3t9a<("1X =E!%']F,15!+<DLL(=s5   F F% .&G 	F"!F"%)GG	G G N)r   r    r!   rK   recompiler   rk   r"   r#   r$   r}   r}      s     G 56J,r#   r}   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)PDFXRefStreamc                 X    d | _         d | _        d x| _        x| _        | _        g | _        y r6   )dataentlenfl1fl2fl3rangesr8   s    r$   rG   zPDFXRefStream.__init__   s/    	)---48dhr#   c                      d| j                   z  S )Nz<PDFXRefStream: ranges=%r>)r   r8   s    r$   rK   zPDFXRefStream.__repr__   s    +t{{;;r#   c           	      *   |j                         \  }}|j                         \  }}|j                         \  }}|j                         \  }}t        |t              r|d   t        urt        d      |d   }|j                  dd|f      }t        |      dz  dk7  rt        d      | j                  j                  t        d|             |d   \  | _        | _        | _        |j                         | _        | j                  | j                  z   | j                  z   | _        |j$                  | _        t(        j+                  d	d
j-                  t/        t0        | j                              | j                  | j                  | j                         y )Nr   zInvalid PDF stream spec.SizeIndexr   rO   zInvalid index numberWz&xref stream: objid=%s, fields=%d,%d,%dz, )rm   ro   r   r   LITERAL_XREFr   r   rW   r   r   extendr   r   r   r   r   r   r   attrsrF   r_   r`   joinrZ   repr)	r9   rb   rh   r@   ri   rs   r   sizeindex_arrays	            r$   rk   zPDFXRefStream.load   sI   %%'
E%%'
E##%C'')F&),vl0R !;<<f~jj1d)4{a1$ !7888A{34)/&48TXOO%	hhtxx'0||93tT[[12488TXX	/ 	r#   c                     | j                   S r6   rw   r8   s    r$   r:   zPDFXRefStream.get_trailer   rx   r#   c              #      K   | j                   D ]k  \  }}t        |      D ]X  }| j                  |z  }| j                  ||| j                  z    }t	        |d | j
                   d      }|dk(  s|dk(  sR||z    Z m y w)Nr   rO   )r   r^   r   r   r   r   )r9   rf   rg   ioffsetentf1s          r$   r<   zPDFXRefStream.get_objids  s     "kk 	"NUE5\ "qiivdkk'9:S$((^Q/7bAg'M"	" 	s   A/A>2A>c                    d}| j                   D ]!  \  }}||k  r|||z   k  r
|||z
  z  } n||z  }# t        |      | 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   rO   )r   r>   r   r   r   r   r   )
r9   r@   r   rf   rg   r   r   r   f2f3s
             r$   rA   zPDFXRefStream.get_pos  s   "kk 	"NUE~%%+"5&	" 5/!u$iivdkk12S$((^Q'S$((488"345S$((*+,-7"b>!1WA; 5/!r#   N)	r   r    r!   rG   rK   rk   r:   r<   rA   r"   r#   r$   r   r      s     <*"r#   r   c                   r    e Zd ZdZdZddZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZddZd Zy)PDFStandardSecurityHandlers    (N^NuAd NV.. h>/dSiz)rO   rP   c                 N    || _         || _        || _        | j                          y r6   )docidparampasswordinit)r9   r   r   r   s       r$   rG   z#PDFStandardSecurityHandler.__init__+  s#    

 		r#   c                     | j                          | j                  | j                  vrt        d| j                  z        | j                          y )NzUnsupported revision: param=%r)init_paramsrsupported_revisionsr+   r   init_keyr8   s    r$   r   zPDFStandardSecurityHandler.init2  sA    66111$%E

%RSSr#   c                    t        | j                  j                  dd            | _        t        | j                  d         | _        t        | j                  d         | _        t        | j                  d         | _        t        | j                  d         | _        t        | j                  j                  dd            | _	        y )	NVr   RPOULength(   )
r   r   r   vr   pr   oulengthr8   s    r$   r   z&PDFStandardSecurityHandler.init_params9  s    4::>>#q124::c?+4::c?+4::c?+4::c?+

x <=r#   c                 h    | j                  | j                        | _        | j                  t        y r6   )authenticater   keyr-   r8   s    r$   r   z#PDFStandardSecurityHandler.init_keyB  s+    $$T]]388&&r#   c                 2    t        | j                  dz        S )N   boolr   r8   s    r$   is_printablez'PDFStandardSecurityHandler.is_printableH      DFFQJr#   c                 2    t        | j                  dz        S )N   r   r8   s    r$   is_modifiablez(PDFStandardSecurityHandler.is_modifiableK  r   r#   c                 2    t        | j                  dz        S )N   r   r8   s    r$   is_extractablez)PDFStandardSecurityHandler.is_extractableN  s    DFFRK  r#   c                 .   | j                   dk(  r.t        j                  |      j                  | j                        S t        j
                  | j                        }|j                  | j                  d          t        j                  |      j                  |j                               }t        dd      D ]S  dj                  fdt        j                  |      D              }t        j                  |      j                  |      }U ||z  }|S )NrO   r   r      r#   c              3   N   K   | ]  }t        j                  |z          y wr6   rX   int2byte.0cr   s     r$   	<genexpr>z7PDFStandardSecurityHandler.compute_u.<locals>.<genexpr>[       MQS\\!a%0M   "%)r   r   newencryptPASSWORD_PADDINGmd5rq   r   digestr^   r   rX   	iterbytes)r9   r   hashresultkr   s        @r$   	compute_uz$PDFStandardSecurityHandler.compute_uQ  s    66Q;88C=(()>)>?? 774001DKK

1&XXc]**4;;=9F1b\ 5HHM#--:LMM!,,V45 fFMr#   c                 N   || j                   z   d d }t        j                  |      }|j                  | j                         |j                  t	        j
                  d| j                               |j                  | j                  d          | j                  dk\  r| j                  s|j                  d       |j                         }d}| j                  dk\  rE| j                  dz  }t        d	      D ](  }t        j                  |d |       j                         }* |d | S )
N    z<lr   r   s      rP   r   2   )r   r   rq   r   structpackr   r   r   encrypt_metadatar   r   r^   )r9   r   r   r   r   rh   s         r$   compute_encryption_keyz1PDFStandardSecurityHandler.compute_encryption_key`  s    t444cr:wwx DFFFKKdff-.DJJqM"66Q;((/066Q;q A2Y 6,3356bqzr#   c                 p    |j                  d      }| j                  |      }|| j                  |      }|S )Nlatin1)encodeauthenticate_user_passwordauthenticate_owner_passwordr9   r   r   s      r$   r   z'PDFStandardSecurityHandler.authenticater  s:    ??8,--h7;228<C
r#   c                 L    | j                  |      }| j                  |      r|S y r6   )r   verify_encryption_keyr  s      r$   r   z5PDFStandardSecurityHandler.authenticate_user_passwordy  s(    ))(3%%c*Jr#   c                     | j                  |      }| j                  dk(  r|| j                  k(  S |d d | j                  d d k(  S )NrO   r   )r   r   r   )r9   r   r   s      r$   r  z0PDFStandardSecurityHandler.verify_encryption_key  sD    NN366Q;;"v$$r#   c                    || j                   z   d d }t        j                  |      }| j                  dk\  r3t        d      D ]%  }t        j                  |j	                               }' d}| j                  dk\  r| j
                  dz  }|j	                         d | }| j                  dk(  r/t        j                  |      j                  | j                        }no| j                  }t        ddd      D ]S  d	j                  fd
t        j                  |      D              }t        j                  |      j                  |      }U | j                  |      S )Nr   rP   r   r   r   rO      r#   c              3   N   K   | ]  }t        j                  |z          y wr6   r   r   s     r$   r   zIPDFStandardSecurityHandler.authenticate_owner_password.<locals>.<genexpr>  r   r   )r   r   r   r^   r   r   r   r   decryptr   r   rX   r   r   )	r9   r   r   rh   r   r   user_passwordr   r   s	           @r$   r  z6PDFStandardSecurityHandler.authenticate_owner_password  s   t444cr:wwx 66Q;2Y .wwt{{}-.66Q;q AkkmBQ66Q; HHSM11$&&9M FFM2r2& CHHM#--:LMM $ 3 3M BC ..}==r#   Nc                 (    | j                  |||      S r6   )decrypt_rc4)r9   r@   ri   r   r   s        r$   r
  z"PDFStandardSecurityHandler.decrypt  s    ud33r#   c                 @   | j                   t        j                  d|      d d z   t        j                  d|      d d z   }t        j                  |      }|j	                         d t        t        |      d       }t        j                  |      j                  |      S )N<LrP   rO   r   )
r   r   r   r   r   r   rW   r   r   r
  r9   r@   ri   r   r   r   s         r$   r  z&PDFStandardSecurityHandler.decrypt_rc4  s    hhT51"155D%8PQSRS8TTwws|kkm.SS2./xx}$$T**r#    r6   )r   r    r!   r   r   rG   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r"   r#   r$   r   r   %  s\    A   !$%>(4+r#   r   c                   <     e Zd ZdZ fdZd ZddZd Zd Z xZ	S )PDFStandardSecurityHandlerV4)r   c                 $   t         t        |           d| _        t	        | j
                  j                  d            | _        t        | j
                  d         | _	        t        | j
                  d         | _
        t        | j
                  j                  dd            | _        | j                  | j                  k7  rt        d| j
                  z        i | _        | j                  j                         D ]K  \  }}| j!                  t        |d               }|t        d	| j
                  z        || j                  |<   M | j"                  | j                  d
<   | j                  | j                  vrt        d| j
                  z        y )N   CFStmFStrFEncryptMetadataTz"Unsupported crypt filter: param=%rCFMz%Unknown crypt filter method: param=%rIdentityz Undefined crypt filter: param=%r)superr  r   r   r   r   r   cfr	   stmfstrfr   r   r+   cfmitemsget_cfmdecrypt_identity)r9   r   r   re   	__class__s       r$   r   z(PDFStandardSecurityHandlerV4.init_params  s@   *D=?TZZ^^D12 F!34	 F!34	 $TZZ^^4Et%L M99		!$%IDJJ%VWWGGMMO 	DAq\!E(34Ay()PSWS]S])]^^DHHQK		
  $4499DHH$$%G$**%TUUr#   c                 H    |dk(  r| j                   S |dk(  r| j                  S y )NV2AESV2)r  decrypt_aes128r9   names     r$   r#  z$PDFStandardSecurityHandlerV4.get_cfm  s+    4<###W_&&&r#   c                     | j                   s%|#|j                  d      }|t        |      dk(  r|S || j                  } | j                  |   |||      S )Nr   Metadata)r   r   r	   r   r!  )r9   r@   ri   r   r   r+  ts          r$   r
  z$PDFStandardSecurityHandlerV4.decrypt  sZ    $$):		&!A}aJ!><99Dtxx~eUD11r#   c                     |S r6   r"   r9   r@   ri   r   s       r$   r$  z-PDFStandardSecurityHandlerV4.decrypt_identity  s    r#   c                 t   | j                   t        j                  d|      d d z   t        j                  d|      d d z   dz   }t        j                  |      }|j	                         d t        t        |      d       }t        j                  |t        j                  |d d       j                  |dd        S )Nr  rP   rO   s   sAlTr   modeIV)r   r   r   r   r   r   rW   r   r   MODE_CBCr
  r  s         r$   r)  z+PDFStandardSecurityHandlerV4.decrypt_aes128  s    hhT51"155D%8PQSRS8TTW^^wws|kkm.SS2./wws$s)<DDT"#YOOr#   )NN)
r   r    r!   r   r   r#  r
  r$  r)  __classcell__r%  s   @r$   r  r    s#    (2Pr#   r  c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )PDFStandardSecurityHandlerV5)r   c                    t         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  r9  r   r   r   r   oeuer   o_hasho_validation_salt
o_key_saltr   u_hashu_validation_salt
u_key_salt)r9   r%  s    r$   r   z(PDFStandardSecurityHandlerV5.init_params  s    *D=?DJJt,-DJJt,-ffSbk!%2&&+ffSbk!%2&&+r#   c                 &    |dk(  r| j                   S y )NAESV3)decrypt_aes256r*  s     r$   r#  z$PDFStandardSecurityHandlerV5.get_cfm  s    7?&&&r#   c                    |j                  d      d d }t        j                  |      }|j                  | j                         |j                  | j
                         |j                         | j                  k(  rt        j                  |      }|j                  | j                         |j                  | j
                         t        j                  |j                         t        j                  d      j                  | j                        S t        j                  |      }|j                  | j                         |j                         | j                  k(  r}t        j                  |      }|j                  | j                         t        j                  |j                         t        j                  d      j                  | j                         S y )Nzutf-8   s                   r2  )r   r   r   rq   rA  r   r   r@  rB  r   r5  r
  r>  rD  rC  rE  r?  )r9   r   r   s      r$   r   z)PDFStandardSecurityHandlerV5.authenticate  s8   ??7+DS1zz(#D**+DFF;;=DKK'::h'DKK(KK774;;=s||MUUVZV]V]^^zz(#D**+;;=DKK'::h'DKK(774;;=s||MUUVZV]V]^^r#   c                     t        j                  | j                  t         j                  |d d       j	                  |dd        S )Nr   r2  )r   r   r   r5  r
  r0  s       r$   rH  z+PDFStandardSecurityHandlerV5.decrypt_aes256  s4    wwtxxclltCRyAII$rs)TTr#   )	r   r    r!   r   r   r#  r   rH  r6  r7  s   @r$   r9  r9    s    $Ur#   r9  c                       e Zd ZdZeedZeeed<   ee	ed<   ddZ
 ed      ZddZd	 Zd
 Zd Zd Zd Zd Zd Zd Z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   rO   Nr   r   c                    || _         g | _        g | _        d| _        d| _        d| _        d| _        i | _        i | _        || _        | j                  j                  |        dx| _
        x| _        | _        	 | j                  |      }| j                  ||| j                         |r=d|_        t#               }|j%                  |       | j                  j'                  |       | j                  D ]  }|j)                         }|sd|v r2t+        |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        $ r Y 1w xY w)
z1Set the document to use a given PDFParser object.NTEncryptIDInfoRootz(No /Root object! - Is this really a PDF?r   zCatalog not found!)cachingxrefsr`   catalog
encryptiondecipher_parser_cached_objs_parsed_objsset_documentr   r   r   	find_xrefread_xref_fromr   fallbackr}   rk   r   r:   r   r   _initialize_passwordr   r   LITERAL_CATALOGr   r   )r9   rb   r   rS  r^  rc   xrefrF   s           r$   rG   zPDFDocument.__init__  s   
	!!$'GKKKD.1D	..(CTZZ8 "FO"$DIIfJJd#JJ 	MD&&(GG##-gdm#<#-gi.@#A#C))(3 		  GFO!<= )'&/:	M" !!KLL<<F#?:$%9::9  		s   8.G 	GG   objc                    | j                   \  }}t        |j                  d            dk7  rt        d|z        t	        |j                  dd            }| j
                  j                  |      }|t        d|z         ||||      }|j                  | _        |j                         | _        |j                         | _	        |j                         | _
        d| j                  _        y )NFilterStandardzUnknown filter: param=%rr   r   zUnknown algorithm: param=%rF)rV  r	   r   r+   r   security_handler_registryr
  rW  r   r   r   rX  r^  )r9   r   r   r   r   factoryhandlers          r$   r_  z PDFDocument._initialize_passwordS  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#   c                 8   |j                   | j                  v r| j                  |j                      \  }}n;| j                  |      \  }}| j                  r||f| j                  |j                   <   |dz  |z   }	 ||   }|S # t        $ r t        d|z        w xY w)NrO   zindex too big: %r)r@   rZ  _get_objectsrS  
IndexErrorr   )r9   r   r   r@   r   r   r   r   s           r$   _getobj_objstmzPDFDocument._getobj_objstmc  s    <<4,,,))&,,7IT1))&1IT1||37)!!&,,/aCI	>q'C 
  	> !4u!<==	>s   :B Bc                    |j                  d      t        urt        j                  rt	        d|z        	 |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>   r   r   r[  ro   r   r   )r9   r   r   rb   r   rh   r   s          r$   rj  zPDFDocument._get_objectsq  s    ::f^3$%>%GHH	sA
 !!23D!	!,,.CC    	$%;f%DEEA	  	ay	s#   B )&B> )B;:B;>	CCc                 D   | j                   j                  |       | j                   j                         \  }}| j                   j                         \  }}| j                   j                         \  }}||k7  rYg }|| j                  ur=| j                   j                         \  }}|j	                  |       || j                  ur=|r
|d   }|d   }||k7  rt        d|d|      |t        d      k7  rt        d|z        | j                   j                         \  }}|S )Nr  zobjid mismatch: =rb  zInvalid object spec: offset=%r)rX  rU   rm   KEYWORD_OBJr   r   r   ro   )	r9   rc   r@   rh   r   ri   rs   ru   r   s	            r$   _getobj_parsezPDFDocument._getobj_parse  s	   #ll,,.F\\++-
E<<))+C
 U?AT---,,0023 T--- 2"U? FE!JKK#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)rT  r   r_   rr   rY  rA   r>   r   getobjrl  rr  rW  r   r   r   	set_objidr   r   r   rS  )r9   r@   r   ri   ra  strmidr   r   s           r$   rt  zPDFDocument.getobj  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                 b    d| j                   vrt        fd | j                   d   d      S )NOutlinesc              3   T  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         D ]  }|  d| v r | d   |      D ]  }|  y w)	NTitleADestSEFirstLastr   Next)r   r   r   r   )entryleveltitledestactionseru   searchs          r$   r  z(PDFDocument.get_outlines.<locals>.search  s     u%E%%<6U?'	%.(ABE 99V,D"YYs^F4B %vr::%FeOga8 AGfu5 AGs   B%B(r   )rU  r'   )r9   r  s    @r$   get_outlineszPDFDocument.get_outlines  s2    T\\)	  dll:.22r#   c                     	 t        | j                  d         }t        |         }fd |      S # t        t        f$ r t        f      w xY w)NNamesc                    d| v rt        | d         \  }}|k  s|k  ry d| v r(t        | d         }t        t        d|            }|   S d| v r*t        | d         D ]  } 	t        |            }|s|c S  t	        f      )NLimitsr  rO   Kids)r   dictr   r   r>   )
dk1k2r   namesr   r   catr   lookups
          r$   r  z'PDFDocument.lookup_name.<locals>.lookup  s    1}%ak2R8rCx!|!!G*-Xa./Sz!{#AfI. !Az!}-A ! C:&&r#   )r   rU  r   r>   )r9   r  r   r  d0r  s    ``  @r$   lookup_namezPDFDocument.lookup_name  sa    	't||G45E c
#	' bz) h' 	'C:&&	's	   : A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>   rU  r)   r   )r9   r+  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|       t        j                  rt        |      S t        |      S )z0Internal function used to locate the first XRef.Nzfind_xref: %rs	   startxrefUnexpected EOFzxref found: pos=%r)
revreadlinesrS   r_   rr   r   r`   rX   rY   r[   r\   )r9   rb   prevrd   s       r$   r\  zPDFDocument.find_xref  s     '') 	3D::<DIIot,|#	3 !!122%t, WWtDz3#d)3r#   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)rU   resetrm   r   r   r_   r`   r   r\   r   rk   KEYWORD_XREFrR   rC   r   r:   r   r]  )r9   rb   rf   rT  rc   tokenra  rF   s           r$   r]  zPDFDocument.read_xref_from  s7   E	3!++-LS% 	5ueD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*)r  TTr  )r   r    r!   __doc__r   rf  r   r  r   r9  rG   r   rq  r_  rl  rj  rr  rt  r  r  r  r\  r]  r"   r#   r$   rM  rM    s~    
 &%! 'C!!$+G%a(/b f+K *6$L3,24"r#   rM  );r   r   loggingrX   hashlibr   ImportErrorCrypto.Cipherr   r   Crypto.Hashr   r  r   psparserr   r	   r
   r   r   pdftypesr   r   r   r   r   r   r   r   r   r   	pdfparserr   r   utilsr   r   r   	getLoggerr   r_   r   r'   r)   r+   r-   r/   r   r   r`  objectr4   rC   r}   r   r   r  r9  rM  r"   r#   r$   <module>r     s   	   
""!"  "    " "  ' "       " % &    g!	^ 		L 		\ 		 		- 		"4 	 X6{i.
& "Ik I\3g 3pC"K C"P}+ }+@0P#= 0Pf*U#? *U^m& m}    "C&!!"s"   E& E6 &	E32E36F	F	