a
    hc                  *   @  s  d dl mZ d dlZd dlZd dlZ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mZmZmZ dddddZd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2)Zddd3d4d5ZG d6d7 d7eZd8dd9d:d;d<ZG d=d> d>eZG d?d@ d@eZG dAdB dBeZG dCdD dDZG dEdF dFZG dGdH dHee ZdIZerejeeef ef Z nejZ G dJdK dKe Z!G dLdM dMZ"G dNdO dOZ#dPddQdRdSZ$G dTdU dUZ%dS )V    )annotationsN)IOAny
NamedTupleUnionstrbytessreturnc                 C  s   t j| d S )N	utf_16_be)codecsBOM_UTF16_BEencode)r
    r   ;/var/www/auris/lib/python3.9/site-packages/PIL/PdfParser.pyencode_text   s    r   u   ˘u   ˇu   ˆu   ˙u   ˝u   ˛u   ˚u   ˜u   •u   †u   ‡u   …u   —u   –u   ƒu   ⁄u   ‹u   ›u   −u   ‰u   „u   “u   ”u   ‘u   ’u   ‚u   ™u   ﬁu   ﬂu   Łu   Œu   Šu   Ÿu   Žu   ıu   łu   œu   šu   žu   €))                                                                                                                           )br   c                 C  sH   | d t tj tjkr0| t tjd  dS ddd | D S d S )Nr    c                 s  s   | ]}t |t|V  qd S N)PDFDocEncodinggetchr).0byter   r   r   	<genexpr>E       zdecode_text.<locals>.<genexpr>)lenr   r   decodejoin)r=   r   r   r   decode_textA   s    rJ   c                   @  s   e Zd ZdZdS )PdfFormatErrorz\An error that probably indicates a syntactic or semantic error in the
    PDF file structureN)__name__
__module____qualname____doc__r   r   r   r   rK   H   s   rK   boolNone)	conditionerror_messager   c                 C  s   | st |d S r?   )rK   )rR   rS   r   r   r   check_format_conditionO   s    rT   c                   @  s   e Zd ZU ded< ded< dS )IndirectReferenceTupleint	object_id
generationN)rL   rM   rN   __annotations__r   r   r   r   rU   T   s   
rU   c                   @  sV   e Zd ZddddZddddZdd	d
ddZdd	d
ddZddddZdS )IndirectReferencer   r   c                 C  s   | j  d| j dS )N z RrW   rX   selfr   r   r   __str__Z   s    zIndirectReference.__str__r   c                 C  s   |   dS Nus-ascii)r`   r   r^   r   r   r   	__bytes__]   s    zIndirectReference.__bytes__objectrP   otherr   c                 C  s6   | j |j urdS t|tsJ |j| jko4|j| jkS )NF)	__class__
isinstancerZ   rW   rX   r_   rf   r   r   r   __eq__`   s    zIndirectReference.__eq__c                 C  s
   | |k S r?   r   ri   r   r   r   __ne__f   s    zIndirectReference.__ne__rV   c                 C  s   t | j| jfS r?   )hashrW   rX   r^   r   r   r   __hash__i   s    zIndirectReference.__hash__N)rL   rM   rN   r`   rc   rj   rk   rm   r   r   r   r   rZ   Y   s
   rZ   c                   @  s   e Zd ZddddZdS )IndirectObjectDefr   r[   c                 C  s   | j  d| j dS )Nr\   z objr]   r^   r   r   r   r`   n   s    zIndirectObjectDef.__str__N)rL   rM   rN   r`   r   r   r   r   rn   m   s   rn   c                   @  s   e Zd ZddddZdddddd	Zddd
ddZddd
ddZddd
ddZddddZddddZ	dddddZ
dS )	XrefTablerQ   r[   c                 C  s    i | _ i | _ddi| _d| _d S )Nr   i   F)existing_entriesnew_entriesdeleted_entriesreading_finishedr^   r   r   r   __init__s   s    
zXrefTable.__init__rV   ztuple[int, int]keyvaluer   c                 C  s2   | j r|| j|< n
|| j|< || jv r.| j|= d S r?   )rs   rq   rp   rr   r_   rv   rw   r   r   r   __setitem__}   s
    

zXrefTable.__setitem__rv   r   c                 C  s.   z| j | W S  ty(   | j|  Y S 0 d S r?   )rq   KeyErrorrp   r_   rv   r   r   r   __getitem__   s    zXrefTable.__getitem__c                 C  s   || j v r0| j | d d }| j |= || j|< nR|| jv rX| j| d d }|| j|< n*|| jv rn| j| }nd| d}t|d S )N   z
object ID z+ cannot be deleted because it doesn't exist)rq   rr   rp   
IndexError)r_   rv   rX   msgr   r   r   __delitem__   s    


zXrefTable.__delitem__rP   c                 C  s   || j v p|| jv S r?   )rp   rq   r|   r   r   r   __contains__   s    zXrefTable.__contains__c                 C  s.   t t| j t| j B t| j B S r?   )rG   setrp   keysrq   rr   r^   r   r   r   __len__   s    zXrefTable.__len__zset[int]c                 C  s*   t | j t | j  t | j B S r?   )r   rp   r   rr   rq   r^   r   r   r   r      s    zXrefTable.keys	IO[bytes]fr   c              	   C  sJ  t t| j t| j B }t t| j }| }|d |rFd }t|D ]>\}}|d u sr|d |krx|}qV|d | }||d  } qqV|}g }|d|d t|f  |D ]}	|	| jv r|d| j|	   q|	d}
t
|	|
kd|	 d|
  z|d }W n ty(   d}Y n0 |d|| j|	 f  qqD|S )	Ns   xref
r~   s   %d %d
r   s   %010d %05d n 
z*expected the next deleted object ID to be z, instead found s   %010d %05d f 
)sortedr   rq   r   rr   tellwrite	enumeraterG   poprT   r   )r_   r   r   Zdeleted_keysZ	startxrefprevindexrv   Zcontiguous_keysrW   Zthis_deleted_object_idZnext_in_linked_listr   r   r   r      sF     



zXrefTable.writeN)rL   rM   rN   rt   ry   r}   r   r   r   r   r   r   r   r   r   ro   r   s   
ro   c                   @  s   e Zd ZU ded< dddddZdd	d
dZdddddZdd	ddZdd	ddZe	dd dddZ
eedddd dD  Zdd	ddZd S )!PdfNamer   namezPdfName | bytes | strrQ   )r   r   c                 C  s6   t |tr|j| _nt |tr&|| _n|d| _d S ra   )rh   r   r   r   r   )r_   r   r   r   r   rt      s
    


zPdfName.__init__r   r[   c                 C  s   | j dS ra   )r   rH   r^   r   r   r   name_as_str   s    zPdfName.name_as_strrd   rP   re   c                 C  s    t |tr|j| jkp|| jkS r?   )rh   r   r   ri   r   r   r   rj      s    zPdfName.__eq__rV   c                 C  s
   t | jS r?   )rl   r   r^   r   r   r   rm      s    zPdfName.__hash__c                 C  s   | j j dt| j dS )N())rg   rL   reprr   r^   r   r   r   __repr__   s    zPdfName.__repr__datar   c                 C  s   | t |S r?   )	PdfParserinterpret_name)clsr   r   r   r   from_pdf_stream   s    zPdfName.from_pdf_stream!      c                 C  s   h | ]}t |qS r   )ord)rC   cr   r   r   	<setcomp>   rF   zPdfName.<setcomp>z#%/()<>[]{}c                 C  s@   t d}| jD ](}|| jv r(|| q|d|  qt|S )N   /s   #%02X)	bytearrayr   allowed_charsappendextendr   )r_   resultr=   r   r   r   rc      s    

zPdfName.__bytes__N)rL   rM   rN   rY   rt   r   rj   rm   r   classmethodr   r   ranger   rc   r   r   r   r   r      s   
r   c                   @  s   e Zd ZddddZdS )PdfArrayr   r[   c                 C  s   dd dd | D  d S )Ns   [     c                 s  s   | ]}t |V  qd S r?   )pdf_repr)rC   xr   r   r   rE      rF   z%PdfArray.__bytes__.<locals>.<genexpr>s    ])rI   r^   r   r   r   rc      s    zPdfArray.__bytes__N)rL   rM   rN   rc   r   r   r   r   r      s   r   Fc                   @  s<   e Zd ZddddddZdddd	d
ZddddZdS )PdfDictr   r   rQ   ru   c                 C  s,   |dkrt j| || n|| |d< d S )Nr   rb   )collectionsUserDict__setattr__r   rx   r   r   r   r     s    zPdfDict.__setattr__zstr | time.struct_timerz   c              
   C  s.  z| | d }W n. ty@ } zt||W Y d }~n
d }~0 0 t|trTt|}|dr*|drv|dd  }d}t|dkr|d }t	|dd d	 }t|d
kr|t	|dd
 7 }dd t|d  }t
|d t|d  |}|dv r*|d	9 }|dkr|d9 }t
t|| }|S )Nrb   DatezD:   Z         <         z%Y%m%d%H%M%S)+-r   )r   r{   AttributeErrorrh   r   rJ   endswith
startswithrG   rV   timestrptimegmtimecalendartimegm)r_   rv   rw   eZrelationshipoffsetformatr   r   r   __getattr__  s.     



zPdfDict.__getattr__r   r[   c                 C  sn   t d}|  D ]J\}}|d u r"qt|}|d |tt| |d || q|d t|S )N   <<   
r   s   
>>)r   itemsr   r   r   r   )r_   outrv   rw   r   r   r   rc   '  s    


zPdfDict.__bytes__N)rL   rM   rN   r   r   rc   r   r   r   r   r     s   r   c                   @  s*   e Zd ZdddddZdddd	Zd
S )	PdfBinaryzlist[int] | bytesrQ   r   c                 C  s
   || _ d S r?   )r   )r_   r   r   r   r   rt   6  s    zPdfBinary.__init__r   r[   c                 C  s   dd dd | jD  S )Ns   <%s>rF   c                 s  s   | ]}d | V  qdS )s   %02XNr   rC   r=   r   r   r   rE   :  rF   z&PdfBinary.__bytes__.<locals>.<genexpr>)rI   r   r^   r   r   r   rc   9  s    zPdfBinary.__bytes__N)rL   rM   rN   rt   rc   r   r   r   r   r   5  s   r   c                   @  s,   e Zd ZddddddZdddd	Zd
S )	PdfStreamr   r   rQ   )
dictionarybufr   c                 C  s   || _ || _d S r?   )r   r   )r_   r   r   r   r   r   rt   >  s    zPdfStream.__init__r[   c                 C  s   z| j d }W n ty&   | j Y S 0 |dkrpz| j d }W n tyZ   | j d }Y n0 tj| jt|dS dt| d}t|d S )Ns   Filters   FlateDecodes   DL   Length)bufsizezstream filter z unknown/unsupported)r   r{   r   zlib
decompressrV   r   NotImplementedError)r_   filterZexpected_lengthr   r   r   r   rH   B  s    zPdfStream.decodeN)rL   rM   rN   rt   rH   r   r   r   r   r   =  s   r   r   )r   r   c                 C  s
  | du rdS | du rdS | d u r$dS t | ttttfr>t| S t | ttfrZt| 	dS t | t
jrdt
d| 	d d	 S t | trtt| S t | trtt| S t | trtt| S t | t r| d
d} | dd} | d	d} d|  d	 S t| S d S )NTs   trueFs   falses   nullrb   s   (D:z%Y%m%d%H%M%SZ   )   \s   \\   (   \(s   \))rh   r   r   r   r   r   rV   floatr   r   r   struct_timestrftimedictlistr   r   replace)r   r   r   r   r   R  s0    


r   c                    @  s  e Zd ZdZdddddd	d
dddZd dddZdd
dddZd
dddZd
dddZd
dddZ	d
dddZ
d
dddZd	d
dd d!Zd"dd#d$Zd
dd%d&Zdd'd
d(d)d*Zd+d,d,d"d-d.d/Zd'd,d,d"d-d0d1Zd
dd2d3Zed4d5d6d7d8Zd
dd9d:Zdd;d"d<d=d>Zd?Zd@ZdAZdBZedC ZedD ZdEZdFZee e Ze !edG e dH e dI e dJ e dK e dL e j"Z#e !edG e dM e dI e dJ e dK e e j"Z$d
ddNdOZ%dd
dPdQdRZ&e !eZ'e !edS e dT Z(e !edU Z)e !edV e Z*e+dWdXdYdZd[Z,e !d\Z-e+ddWd^d_d`dadbZ.e !edc e dT Z/e !edd e dT Z0e !ede e dT Z1e !edf e dT Z2e !edg e dT Z3e !edh Z4e !edi Z5e !edj e dk Z6e !edl Z7e !edm e dm e dn e dT Z8e !edm e dm e do e dT Z9e !edp e dT Z:e !dqe dr e ds Z;e !edt Z<e !edu e dT Z=e+ddwdd'ddxdydzd{Z>e !d|Z?d}d~dddddddddqdqdTdTdde@d}d~e@dde@dde@dde@dde@dqdqe@dTdTe@ddiZAe+dwdddddZBe !ed e ZCe !edJ e dJ e e ZDe !dZEdddPddZFdd"dd,dddZGddddddZHdS )r   z|Based on
    https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
    Supports PDF up to 1.4
    Nr   rbz
str | NonezIO[bytes] | Nonezbytes | bytearray | NonerV   r   rQ   )filenamer   r   start_offsetmoder   c                 C  s$  |r|rd}t ||| _|| _|| _|| _d| _d| _|d ur^|d u r^t|| | _}d| _|d ur| || _d| _|st	|dr|j
| _i | _|  |  |  |  | jr|   nVd | _| _t | _d | _t | _d | _t | _g | _g | _d | _d | _i | _t | _d| j_|r |   d S )Nz4specify buf or f or filename, but not both buf and fFTr   r   )RuntimeErrorr   r   r   r   should_close_bufshould_close_fileopenget_buf_from_filehasattrr   cached_objectsread_pdf_infofile_size_totalfile_size_thisr   rootroot_refinfoinfo_refpage_tree_rootpages
orig_pages	pages_reflast_xref_section_offsettrailer_dictro   
xref_tablers   seek_end)r_   r   r   r   r   r   r   r   r   r   rt   u  sN    
zPdfParser.__init__r[   c                 C  s   | S r?   r   r^   r   r   r   	__enter__  s    zPdfParser.__enter__rd   )argsr   c                 G  s   |    d S r?   )close)r_   r   r   r   r   __exit__  s    zPdfParser.__exit__c                 C  s   |    |   d S r?   )	close_bufr   r^   r   r   r   start_writing  s    zPdfParser.start_writingc                 C  s"   t | jtjr| j  d | _d S r?   )rh   r   mmapr   r^   r   r   r   r    s    
zPdfParser.close_bufc                 C  s2   | j r|   | jd ur.| jr.| j  d | _d S r?   )r   r  r   r   r   r^   r   r   r   r     s
    
zPdfParser.closec                 C  s"   | j d usJ | j dtj d S )Nr   )r   seekosSEEK_ENDr^   r   r   r   r     s    zPdfParser.seek_endc                 C  s   | j d usJ | j d d S )Ns	   %PDF-1.4
)r   r   r^   r   r   r   write_header  s    zPdfParser.write_headerr	   c                 C  s*   | j d usJ | j d| d  d S )Nz% 
)r   r   r   )r_   r
   r   r   r   write_comment  s    zPdfParser.write_commentrZ   c                 C  sz   | j d usJ |   | | j  | _| d| _|   | j| jtd| jd | j| jtdt	| j
| j
d | jS )Nr      Catalog)TypeZPages   Pages)r  ZCountZKids)r   del_rootnext_object_idr   r   r   rewrite_pages	write_objr   rG   r   r^   r   r   r   write_catalog  s    zPdfParser.write_catalogc                 C  s   g }t | jD ]\}}| j| }| j|j= ||td  || jvrHqi }| D ]\}}|||	 < qT| j
|d< | jdi |}t | jD ]\}	}
|
|kr|| j|	< qq|D ]6}|r| j| }|j| jv r| j|j= |dd }qqg | _d S )Ns   ParentParent)N)r   r   r   r   rW   r   r   r   r   r   r   
write_pagerA   )r_   Zpages_tree_nodes_to_deleteiZpage_refZ	page_infoZstringified_page_inforv   rw   Znew_page_refjZcur_page_refZpages_tree_node_refZpages_tree_noder   r   r   r    s,    





zPdfParser.rewrite_pageszIndirectReference | None)new_root_refr   c                 C  s   | j d usJ |r |   || _| jr6| d | j| _| j| j }t| j}| j|d}| j	d urn| j	|d< | jr~| j|d< || _	| j dt
t| d|   d S )N)   Root   Size   Prev   Infos   trailer
s   
startxref
%d
%%%%EOF)r   r  r   r   r  r   r   r   rG   r   r   r   )r_   r  Z
start_xrefZnum_entriesr   r   r   r   write_xref_and_trailer  s.    




z PdfParser.write_xref_and_trailerzint | IndirectReference | Noner   )refobjsdict_objr   c                 O  sV   t |tr| j| n|}d|vr,td|d< d|vr>| j|d< | j|g|R i |S )Nr     Pager  )rh   rV   r   r   r   r  )r_   r  r  r  Zobj_refr   r   r   r    s    
zPdfParser.write_pagec                 O  s   | j d usJ | j }|d u r,| | }n| |jf| j|j< |tt|  |	dd }|d urtt
||d< |r|t| |D ]}|t| q|d ur|d || |d |d |S )NstreamZLengths   stream
s   
endstream
s   endobj
)r   r  r   rX   r   rW   r   r   rn   r   rG   r   )r_   r  r  r  r   r   objr   r   r   r    s&    



zPdfParser.write_objc                 C  s.   | j d u rd S | j| j j= | j| jd j= d S )Nr  )r   r   rW   r   r^   r   r   r   r  0  s    
zPdfParser.del_rootr   zbytes | mmap.mmapr   c                 C  sV   t | dr|  S t | dr$|  S ztj|  dtjdW S  tyP   Y dS 0 d S )N	getbuffergetvaluer   )accessrF   )r   r"  r#  r  filenoZACCESS_READ
ValueError)r   r   r   r   r   6  s    

zPdfParser.get_buf_from_filec                 C  sD  | j d usJ t| j | _| j| j | _|   t| jdd ud | jd | _	| j	d us`J | jdd | _
t| | j	| _| j
d u rt | _nt| | j
| _td| jv d t| jd dkd t| jdd ud	 tt| jd td
 | jd | _| jd usJ | | j| _| | j| _| jd d  | _d S )Nr  zRoot is missingr     Typez/Type missing in Rootr
  z/Type in Root is not /Catalogr  z/Pages missing in Rootz+/Pages in Root is not an indirect reference)r   rG   r   r   r   read_trailerrT   r   rA   r   r   r   read_indirectr   r   rh   rZ   r   r   linearize_page_treer   r   r^   r   r   r   r   B  s<    

zPdfParser.read_pdf_infoz
int | None)r   r   c                 C  sV   zt t| j d d}W n ty8   t dd}Y n0 |d urR|df| j|j< |S )Nr~   r   )rZ   maxr   r   r&  rW   )r_   r   	referencer   r   r   r  f  s    zPdfParser.next_object_ids   [][()<>{}/%]s$   [][()<>{}/%\000\011\012\014\015\040]s   [\000\011\012\014\015\040]s#   [\000\011\012\014\015\0400-9a-fA-F]   *   +s   [\000\011\014\040]*s   [\r\n]+s   trailers   <<(.*>>)s	   startxrefs   ([0-9]+)s   %%EOF   $s	   <<(.*?>>)c                 C  s   | j d usJ t| j d }|| jk r,| j}| j| j |}t|d ud |}|rp|}| j| j | d }qN|sx|}|d usJ |d}t|d| _	| 
|| _t | _| j| j	d d| jv r| | jd  d S )N @  ztrailer end not found   r~   r   xref_section_offsetr  )r   rG   r   re_trailer_endsearchrT   startgrouprV   r   interpret_trailerr   ro   r   read_xref_tableread_prev_trailer)r_   Zsearch_start_offsetmZ
last_matchtrailer_datar   r   r   r(    s(    


zPdfParser.read_trailer)r3  r   c                 C  s   | j d usJ | j|d}| j| j ||d  }t|d ud |d usNJ |d}tt|d|kd | |}d|v r| |d  d S )Nr2  r0  zprevious trailer not foundr~   r   zGxref section offset in previous trailer doesn't match what was expectedr  )	r   r9  re_trailer_prevr5  rT   r7  rV   r8  r:  )r_   r3  Ztrailer_offsetr;  r<  r   r   r   r   r:    s    

zPdfParser.read_prev_trailers   /([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=r   r   s   >>r   zdict[bytes, Any])r<  r   c                 C  s   i }d}| j ||}|sX| j||}t|d uo@| t|kdt||d    q| |d}t	|t
svJ | || \}}|||< |d u rq|}qtd|v ot	|d td td|v ot	|d td |S )Nr   z+name not found in trailer, remaining data: r~   r  z&/Size not in trailer or not an integerr  z1/Root not in trailer or not an indirect reference)re_namematchre_dict_endrT   endrG   r   r   r7  rh   r   	get_valuerV   rZ   )r   r<  trailerr   r;  rv   rw   Zvalue_offsetr   r   r   r8    s8    zPdfParser.interpret_trailers   ([^#]*)(#([0-9a-fA-F]{2}))?FrP   zstr | bytes)rawas_textr   c                 C  sn   d}| j |D ]B}|drD||dt|dd 7 }q||d7 }q|rb|dS t|S d S )NrF      r~   rb   zutf-8)re_hashes_in_namefinditerr7  r   fromhexrH   r   )r   rD  rE  r   r;  r   r   r   r     s    
&
zPdfParser.interpret_names   null(?=s   true(?=s   false(?=s   ([-+]?[0-9]+)(?=s)   ([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=s   \[   ]s   <(s   *)>r   s   ([-+]?[0-9]+)s   R(?=s   obj(?=s	   endobj(?=r   s	   %[^\r\n]*s   )*s   stream\r?\ns   endstream(?=r   zbytes | bytearray | mmap.mmapztuple[Any, int | None])r   r   expect_indirectmax_nestingr   c                 C  s  |dkrdS | j ||}|r&| }| j||}|rtt|ddkd tt|ddkd t|d u p|tt|dt|dkd | j|| |d d\}}|d u r|d fS | j	||}t|d ud	 |d usJ || fS t| d
 | j
||}|rntt|ddkd tt|ddkd tt|dt|d| fS | j||}|r| }i }| j||}|}	|s"|	d usJ | j||	|d d\}
}	|	d u r|d fS | j||	|d d\}}	|||
< |	d u r|d fS | j||	}q| }	| j||	}|r|d}|d u s^t|tsrd| d}t||| | |  }| j|| | }t|d ud |d usJ | }	tt|||	fS t||	fS | j||}|rz| }g }| j||}|}	|sn|	d us(J | j||	|d d\}}	|| |	d u r\|d fS | j||	}q|| fS | j||}|rd | fS | j||}|rd| fS | j||}|rd| fS | j||}|r
t| |d| fS | j||}|r4t|d| fS | j||}|r^t|d| fS | j ||}|rt!dd |dD }t"|d dkr|t#d t!$|%d| fS | j&||}|r| '|| S dt(|||d   }t|d S )Nr   )NNr~   z<indirect object definition: object ID must be greater than 0r   z;indirect object definition: generation must be non-negativez2indirect object definition different than expected)rL  z(indirect object definition end not foundz$indirect object definition not foundz;indirect object reference: object ID must be greater than 0z:indirect object reference: generation must be non-negativer   z&bad or missing Length in stream dict (r   zstream end not foundTFc                 s  s   | ]}|d v r|V  qdS )s   0123456789abcdefABCDEFNr   r   r   r   r   rE     s   z&PdfParser.get_value.<locals>.<genexpr>   0rb   zunrecognized object:     ))
re_commentr?  rA  re_indirect_def_startrT   rV   r7  rZ   rB  re_indirect_def_endre_indirect_referencere_dict_startr@  re_stream_startrA   rh   rK   re_stream_endr   r   re_array_startre_array_endr   re_nullre_truere_falser>  r   r   re_intre_realr   re_string_hexr   rG   r   rI  rH   re_string_litget_literal_stringr   )r   r   r   rK  rL  r;  rd   Zobject_offsetr   current_offsetrv   rw   Z
stream_lenr   Zstream_dataresultsZ
hex_stringr   r   r   rB  )  s    
&










zPdfParser.get_valuesF   (\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))   nr      r      t   	   b      f   r   ztuple[bytes, int])r   r   r   c                 C  s  d}t  }| j||D ]}||||   |drX|| j|dd   n|dr|t|ddd  d nx|drnl|dr|d nV|dr|d	 |d7 }n8|d
r|dkrt	||
 f  S |d |d8 }|
 }qd}t|d S )Nr   r~   r      rF     r      r      r   zunfinished literal string)r   re_lit_str_tokenrH  r   r6  r7  escaped_charsr   rV   r   rA  rK   )r   r   r   Znesting_depthr   r;  r   r   r   r   r_    s.    

 







zPdfParser.get_literal_strings   xrefs+   ([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)c                 C  s&  | j d usJ d}| j| j || j }t|d ud |d usBJ | }| j| j |}|slt|d q"d}| }t|d}t|d}t	||| D ]|}| j
| j |}t|d ud |d usJ | }|dd	k}|st|d}	t|d|	f}
|| jvr|
| j|< qqJ|S )
NFzxref section start not foundzxref subsection start not foundTr~   r   zxref entry not foundrF  ri  )r   re_xref_section_startr?  r   rT   rA  re_xref_subsection_startrV   r7  r   re_xref_entryr   )r_   r3  Zsubsection_foundr;  r   Zfirst_objectnum_objectsr  Zis_freerX   Z	new_entryr   r   r   r9    s<    
zPdfParser.read_xref_table)r  rL  r   c              
   C  s   | j |d  \}}t||d kd|d  d|d  d| d|  | jd usRJ | j| j|| j t| |dd }|| j|< |S )Nr   r~   zexpected to find generation z for object ID z) in xref table, instead found generation z at offset )rK  rL  )r   rT   r   rB  r   rZ   r   )r_   r  rL  r   rX   rw   r   r   r   r)    s(    

zPdfParser.read_indirectzPdfDict | Nonezlist[IndirectReference])noder   c                 C  sn   |d ur|n| j }t|d dkd g }|d D ]8}| |}|d dkrV|| q0|| j|d q0|S )Nr'  r  z%/Type of page tree node is not /Pagess   Kidsr  )ru  )r   rT   r)  r   r   r*  )r_   ru  Z	page_noder   ZkidZ
kid_objectr   r   r   r*  $  s    
zPdfParser.linearize_page_tree)NNNr   r   )N)N)F)Nr   )r   )N)IrL   rM   rN   rO   rt   r   r   r  r  r   r   r  r	  r  r  r  r  r  r  staticmethodr   r   r  	delimiterZdelimiter_or_ws
whitespaceZwhitespace_or_hexZwhitespace_optionalZwhitespace_mandatoryZwhitespace_optional_no_nlZnewline_onlynewlinerecompileDOTALLr4  r=  r(  r:  Zre_whitespace_optionalr>  rS  r@  r   r8  rG  r   rX  rY  rZ  r[  r\  rV  rW  r]  r^  rR  rP  rQ  rO  rT  rU  rB  ro  r   rp  r_  rq  rr  rs  r9  r)  r*  r   r   r   r   r   o  s       1 
$
	
	




   
! r   )&
__future__r   r   r   r   r  r  rz  r   r   typingr   r   r   r   r   r@   rJ   r   rK   rT   rU   rZ   rn   ro   r   r   r   TYPE_CHECKINGr   r   r   Z	_DictBaser   r   r   r   r   r   r   r   r   <module>   s   -^)0