U
    &^?                  *   @   sh  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 Z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,d-d.d/)Z
d0d1 ZG d2d3 d3eZd4d5 ZG d6d7 d7ed8d9d:gZG d;d< d<eZG d=d> d>ZG d?d@ d@ZG dAdB dBeZG dCdD dDejZG dEdF dFZG dGdH dHZdIdJ ZG dKdL dLZdS )M    Nc                 C   s
   |  dS Nus-ascii)encodes r   1/tmp/pip-install-a1j0c_p1/Pillow/PIL/PdfParser.py
make_bytes   s    r	   c                 C   s   t j| d S )N	utf_16_be)codecsBOM_UTF16_BEr   r   r   r   r   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   €))                                                                                                                           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>F   s     zdecode_text.<locals>.<genexpr>)lenr   r   decodejoin)br   r   r   decode_textB   s    rD   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   rE   I   s   rE   c                 C   s   | st |d S r9   )rE   )	conditionerror_messager   r   r   check_format_conditionP   s    rL   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )IndirectReferencec                 C   s   d|  S )Nz%s %s Rr   selfr   r   r   __str__X   s    zIndirectReference.__str__c                 C   s   |   dS r   )rP   r   rN   r   r   r   	__bytes__[   s    zIndirectReference.__bytes__c                 C   s$   |j | j ko"|j| jko"|j| jkS r9   )	__class__	object_id
generationrO   otherr   r   r   __eq__^   s
    

zIndirectReference.__eq__c                 C   s
   | |k S r9   r   rU   r   r   r   __ne__e   s    zIndirectReference.__ne__c                 C   s   t | j| jfS r9   )hashrS   rT   rN   r   r   r   __hash__h   s    zIndirectReference.__hash__N)rF   rG   rH   rP   rQ   rW   rX   rZ   r   r   r   r   rM   U   s
   rM   ZIndirectReferenceTuplerS   rT   c                   @   s   e Zd Zdd ZdS )IndirectObjectDefc                 C   s   d|  S )Nz	%s %s objr   rN   r   r   r   rP   m   s    zIndirectObjectDef.__str__N)rF   rG   rH   rP   r   r   r   r   r[   l   s   r[   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )	XrefTablec                 C   s    i | _ i | _ddi| _d| _d S )Nr   i   F)existing_entriesnew_entriesdeleted_entriesreading_finishedrN   r   r   r   __init__r   s    
zXrefTable.__init__c                 C   s2   | j r|| j|< n
|| j|< || jkr.| j|= d S r9   )r`   r^   r]   r_   rO   keyvaluer   r   r   __setitem__x   s
    

zXrefTable.__setitem__c                 C   s0   z| j | W S  tk
r*   | j|  Y S X d S r9   )r^   KeyErrorr]   rO   rc   r   r   r   __getitem__   s    zXrefTable.__getitem__c                 C   s   || j kr0| j | d d }| j |= || j|< nR|| jkrX| j| d d }|| j|< n*|| jkrn| j| }ntdt| d d S )N   z
object ID z+ cannot be deleted because it doesn't exist)r^   r_   r]   
IndexErrorstr)rO   rc   rT   r   r   r   __delitem__   s    


zXrefTable.__delitem__c                 C   s   || j kp|| jkS r9   )r]   r^   rg   r   r   r   __contains__   s    zXrefTable.__contains__c                 C   s.   t t| j t| j B t| j B S r9   )r@   setr]   keysr^   r_   rN   r   r   r   __len__   s    zXrefTable.__len__c                 C   s*   t | j t | j  t | j B S r9   )rn   r]   ro   r_   r^   rN   r   r   r   ro      s    zXrefTable.keysc              	   C   sT  t t| j t| j B }t t| j }| }|d |rPd }t|D ]>\}}|d ksr|d |krx|}qV|d | }||d  } qqV|}d }|td|d t	|f  |D ]}	|	| jkr|td| j|	   q|
d}
t|	|
kd|	|
f  z|d }W n tk
r.   d}Y nX |td|| j|	 f  qqD|S )Ns   xref
ri   z%d %d
r   z%010d %05d n 
z>expected the next deleted object ID to be %s, instead found %sz%010d %05d f 
)sortedrn   r^   ro   r_   tellwrite	enumerater	   r@   poprL   rj   )rO   fro   Zdeleted_keysZ	startxrefprevindexrc   Zcontiguous_keysrS   Zthis_deleted_object_idZnext_in_linked_listr   r   r   rs      sJ     



zXrefTable.writeN)rF   rG   rH   ra   re   rh   rl   rm   rp   ro   rs   r   r   r   r   r\   q   s   r\   c                   @   sh   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	e
edddd dD  Zdd ZeZdS )PdfNamec                 C   s6   t |tr|j| _nt |tr&|| _n|d| _d S r   )
isinstancery   namebytesr   )rO   r{   r   r   r   ra      s
    


zPdfName.__init__c                 C   s   | j dS r   )r{   rA   rN   r   r   r   name_as_str   s    zPdfName.name_as_strc                 C   s    t |tr|j| jkp|| jkS r9   )rz   ry   r{   rU   r   r   r   rW      s    zPdfName.__eq__c                 C   s
   t | jS r9   )rY   r{   rN   r   r   r   rZ      s    zPdfName.__hash__c                 C   s   dt | j S )NzPdfName(%s))reprr{   rN   r   r   r   __repr__   s    zPdfName.__repr__c                 C   s   | t |S r9   )	PdfParserinterpret_name)clsdatar   r   r   from_pdf_stream   s    zPdfName.from_pdf_stream!      c                 C   s   h | ]}t |qS r   )ord)r=   cr   r   r   	<setcomp>   s     zPdfName.<setcomp>z#%/()<>[]{}c                 C   sD   t d}| jD ],}|| jkr(|| q|td|  qt|S )N   /z#%02X)	bytearrayr{   allowed_charsappendextendr	   r|   )rO   resultrC   r   r   r   rQ      s    

zPdfName.__bytes__N)rF   rG   rH   ra   r}   rW   rZ   r   classmethodr   rn   ranger   rQ   rP   r   r   r   r   ry      s   
	ry   c                   @   s   e Zd Zdd ZeZdS )PdfArrayc                 C   s   dd dd | D  d S )Ns   [     c                 s   s   | ]}t |V  qd S r9   )pdf_repr)r=   xr   r   r   r?      s     z%PdfArray.__bytes__.<locals>.<genexpr>s    ])rB   rN   r   r   r   rQ      s    zPdfArray.__bytes__N)rF   rG   rH   rQ   rP   r   r   r   r   r      s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )PdfDictc                 C   s,   |dkrt j| || n|| |d< d S )Nr   r   )collectionsUserDict__setattr__r   rb   r   r   r   r      s    zPdfDict.__setattr__c                 C   s  z| | d }W n tk
r.   t|Y nX t|trBt|}|dr|drd|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kr|d	9 }|dkr|d9 }t
t|| }|S )Nr   DatezD:   Z         <         z%Y%m%d%H%M%S)+-r   )r   rf   AttributeErrorrz   r|   rD   endswith
startswithr@   inttimestrptimegmtimecalendartimegm)rO   rc   rd   Zrelationshipoffsetformatr   r   r   __getattr__  s.    



zPdfDict.__getattr__c                 C   sn   t d}|  D ]J\}}|d kr"qt|}|d |tt| |d || q|d t|S )Ns   <<   
r   s   
>>)r   itemsr   r   r|   ry   )rO   outrc   rd   r   r   r   rQ      s    


zPdfDict.__bytes__N)rF   rG   rH   r   r   rQ   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )	PdfBinaryc                 C   s
   || _ d S r9   )r   )rO   r   r   r   r   ra   /  s    zPdfBinary.__init__c                 C   s   t dddd | jD  S )Nz<%s>r8   c                 s   s   | ]}d | V  qdS )z%02XNr   r=   rC   r   r   r   r?   3  s     z&PdfBinary.__bytes__.<locals>.<genexpr>)r	   rB   r   rN   r   r   r   rQ   2  s    zPdfBinary.__bytes__N)rF   rG   rH   ra   rQ   r   r   r   r   r   .  s   r   c                   @   s   e Zd Zdd Zdd ZdS )	PdfStreamc                 C   s   || _ || _d S r9   )
dictionarybuf)rO   r   r   r   r   r   ra   7  s    zPdfStream.__init__c                 C   s   z| j j}W n tk
r&   | j Y S X |dkrnz| j j}W n tk
rX   | j j}Y nX tj| jt|dS t	dt
| j j d S )Ns   FlateDecode)bufsizez$stream filter %s unknown/unsupported)r   Filterr   r   ZDLLengthzlib
decompressr   NotImplementedErrorr~   )rO   filterZexpected_lengthr   r   r   rA   ;  s    zPdfStream.decodeN)rF   rG   rH   ra   rA   r   r   r   r   r   6  s   r   c                 C   s  | dkrdS | dkrdS | d kr$dS t | ttttfr>t| S t | trVt| dS t | t	j
r|d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   nullr   s   (D:z%Y%m%d%H%M%SZ   )   \s   \\   (   \(s   \))rz   ry   r   r   r   r|   r   rk   r   r   struct_timestrftimedictlistr   r   replace)r   r   r   r   r   L  s0    



r   c                    @   s  e Zd ZdZdqddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdrddZdd Zdd  Zd!d" Zed#d$ Zd%d& Zdsd'd(Zd)Zd*Zd+Zd,Zed- Zed. Zd/Zee e Ze ed0 e d1 e d2 e d3 e d4 e d5 ej!Z"e ed0 e d6 e d2 e d3 e d4 e ej!Z#d7d8 Z$d9d: Z%e eZ&e ed; e d< Z'e ed= Z(e ed> e Z)e*d?d@ Z+e dAZ,e*dtdCdDZ-e edE e d< Z.e edF e d< Z/e edG e d< Z0e edH e d< Z1e edI e d< Z2e edJ Z3e edK Z4e edL e dM Z5e edN Z6e edO e dO e dP e d< Z7e edO e dO e dQ e d< Z8e edR e d< Z9e dSe dT e dU Z:e edV Z;e edW e d< Z<e*dudYdZZ=e d[Z>d\d]d^d_d`dadbdcdddedSdSd<d<dfdfe?d\d]e?d^d_e?d`dae?dbdce?dddee?dSdSe?d<d<e?dfdfiZ@e*dgdh ZAe edi e ZBe ed3 e d3 e e ZCe djZDdkdl ZEdvdmdnZFdwdodpZGdS )xr   z|Based on
    https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
    Supports PDF up to 1.4
    Nr   rbc                 C   s  |r|rt d|| _|| _|| _|| _d| _d| _|d k	rZ|d krZt|| | _}d| _|d k	r| | | _}d| _|st	|dr|j
| _i | _|r|   nTd | _| _t | _d | _t | _d | _i | _g | _g | _d | _d | _i | _t | _d| j_|r|   d S )Nz4specify buf or f or filename, but not both buf and fFTr{   r   )RuntimeErrorfilenamer   rv   start_offset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_dictr\   
xref_tabler`   seek_end)rO   r   rv   r   r   moder   r   r   ra   o  sD    
zPdfParser.__init__c                 C   s   | S r9   r   rN   r   r   r   	__enter__  s    zPdfParser.__enter__c                 C   s   |    dS )NF)close)rO   exc_type	exc_value	tracebackr   r   r   __exit__  s    zPdfParser.__exit__c                 C   s   |    |   d S r9   )	close_bufr   rN   r   r   r   start_writing  s    zPdfParser.start_writingc                 C   s.   z| j   W n tk
r"   Y nX d | _ d S r9   )r   r   r   rN   r   r   r   r     s
    zPdfParser.close_bufc                 C   s2   | j r|   | jd k	r.| jr.| j  d | _d S r9   )r   r   rv   r   r   rN   r   r   r   r     s
    
zPdfParser.closec                 C   s   | j dtj d S )Nr   )rv   seekosSEEK_ENDrN   r   r   r   r     s    zPdfParser.seek_endc                 C   s   | j d d S )Ns	   %PDF-1.4
)rv   rs   rN   r   r   r   write_header  s    zPdfParser.write_headerc                 C   s   | j d|d d S )Nz% {}
utf-8)rv   rs   r   r   )rO   r   r   r   r   write_comment  s    zPdfParser.write_commentc                 C   sl   |    | | 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)del_rootnext_object_idrv   rr   r   r   rewrite_pages	write_objry   r@   r   rN   r   r   r   write_catalog  s    zPdfParser.write_catalogc                 C   s   g }t | jD ]\}}| j| }| j|j= ||td  || jkrHqi }| D ]\}}|||	 < qT| j
|d< | jd|}t | jD ]\}	}
|
|kr|| j|	< qq|D ]6}|r| j| }|j| jkr| j|j= |dd }qqg | _d S )Ns   ParentParent)N)rt   r   r   r   rS   r   ry   r   r   r}   r   
write_pager;   )rO   Zpages_tree_nodes_to_deleteiZpage_refZ	page_infoZstringified_page_inforc   rd   Znew_page_refjZcur_page_refZpages_tree_node_refZpages_tree_noder   r   r   r     s,    





zPdfParser.rewrite_pagesc                 C   s   |r|    || _| jr(| d | j| _| j| j}t| j}| j|d}| j	d k	r`| j	|d< | jrp| j|d< || _	| jdt
t| td|   d S )N)   Root   Size   Prev   Infos   trailer
z
startxref
%d
%%%%EOF)r   r   r   r   r   r   rs   rv   r@   r   r|   r   r	   )rO   Znew_root_refZ
start_xrefZnum_entriesr   r   r   r   write_xref_and_trailer  s(    





z PdfParser.write_xref_and_trailerc                 O   sL   t |tr| j| }d|kr(td|d< d|kr:| j|d< | j|f||S )Nr      Pager   )rz   r   r   ry   r   r   )rO   refobjsdict_objr   r   r   r     s    


zPdfParser.write_pagec                 O   s   | j }|d kr| | }n| |jf| j|j< |tt|  |	dd }|d k	rft
||d< |rx|t| |D ]}|t| q||d k	r|d || |d |d |S )Nstreamr   s   stream
s   
endstream
s   endobj
)rv   r   rr   rT   r   rS   rs   r|   r[   ru   r@   r   )rO   r  r  r  rv   r  objr   r   r   r     s$    



zPdfParser.write_objc                 C   s.   | j d krd S | j| j j= | j| jd j= d S )Nr   )r   r   rS   r   rN   r   r   r   r     s    
zPdfParser.del_rootc                 C   sX   t | dr|  S t | dr$|  S ztj|  dtjdW S  tk
rR   Y dS X d S )N	getbuffergetvaluer   )access    )r   r	  r
  mmapfilenoZACCESS_READ
ValueError)rv   r   r   r   r     s    

zPdfParser.get_buf_from_filec                 C   s   t | j| _| j| j | _|   | jd | _| jdd | _	t
| | j| _| j	d krdt
 | _nt
| | j	| _td| jkd t| jd dkd td| jkd tt| jd td	 | jd | _| | j| _| | j| _| jd d  | _d S )
Nr   r     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@   r   r   r   r   read_trailerr   r   r;   r   r   read_indirectr   r   rL   rz   rM   r   r   linearize_page_treer   r   rN   r   r   r   r   %  s.    

 zPdfParser.read_pdf_infoc                 C   sX   zt t| j d d}W n tk
r:   t dd}Y nX |d k	rT|df| j|j< |S )Nri   r   )rM   maxr   ro   r  rS   )rO   r   	referencer   r   r   r   A  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   [\r\n]+s   trailers   \<\<(.*\>\>)s	   startxrefs   ([0-9]+)s   %%EOF   $s   \<\<(.*?\>\>)c                 C   s   t | jd }|| jk r| j}| j| j|}t|d |}|r^|}| j| j| d }q<|sf|}|d}t|d| _	| 
|| _t | _| j| j	d d| jkr| | jd  d S )N @  ztrailer end not found   ri   r   xref_section_offsetr   )r@   r   r   re_trailer_endsearchrL   startgroupr   r   interpret_trailerr   r\   r   read_xref_tableread_prev_trailer)rO   Zsearch_start_offsetmZ
last_matchtrailer_datar   r   r   r  q  s$    



zPdfParser.read_trailerc                 C   sv   | j |d}| j| j||d  }t|d |d}tt|d|kd | |}d|krr| |d  d S )Nr  r  zprevious trailer not foundri   r   zGxref section offset in previous trailer doesn't match what was expectedr   )	r"  re_trailer_prevr  r   rL   r   r   r!  r#  )rO   r  Ztrailer_offsetr$  r%  r   r   r   r   r#    s    


zPdfParser.read_prev_trailers   /([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=r   s   \<\<s   \>\>c                 C   s   i }d}| j ||}|sT| j||}t|o<| t|kdt||d    q| |d}| 	|| \}}|||< qtd|kot
|d td td|kot
|d td |S )Nr   z+name not found in trailer, remaining data: ri   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_endrL   endr@   r~   r   r   	get_valuerz   r   rM   )r   r%  trailerr   r$  rc   rd   r   r   r   r!    s0    
zPdfParser.interpret_trailers   ([^#]*)(#([0-9a-fA-F]{2}))?Fc                 C   sn   d}| j |D ]B}|drD||dt|dd 7 }q||d7 }q|rb|dS t|S d S )Nr     ri   r   r   )re_hashes_in_namefinditerr   r   fromhexrA   r|   )r   rawZas_textr{   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   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 kp|tt|dt|dkd | j|| |d d\}}|d kr|d fS | j	||}t|d	 || fS t| d
 | j
||}|r^tt|ddkd tt|ddkd tt|dt|d| fS | j||}|r| }i }| j||}|s | j|||d d\}}|d kr|d fS | j|||d d\}	}|	||< |d kr|d fS | j||}q| }| j||}|rzt|d }
W n0 tttfk
r\   td|dd  Y nX || | |
  }| j|| |
 }t|d | }tt||}nt|}||fS | j||}|rD| }g }| j||}|s8| j|||d d\}	}||	 |d kr&|d fS | j||}q|| fS | j||}|rdd | fS | j||}|rd| fS | j||}|rd| fS | j||}|rt| |d| fS | j||}|rt|d| fS | j ||}|r(t!|d| fS | j"||}|rt#dd |dD }t$|d dkrt|t%d t#&|'d| fS | j(||}|r| )|| S tdt*|||d   d S )Nr   )NNri   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)max_nestingz(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-negatives   Lengthz)bad or missing Length in stream dict (%r)zstream end not foundTFc                 S   s   g | ]}|d kr|qS )s   0123456789abcdefABCDEFr   r   r   r   r   
<listcomp>h  s      z'PdfParser.get_value.<locals>.<listcomp>   0r   zunrecognized object:     )+
re_commentr(  r*  re_indirect_def_startrL   r   r   rM   r+  re_indirect_def_endre_indirect_referencere_dict_startr)  re_stream_start	TypeErrorrf   r  rE   r;   re_stream_endr   r   re_array_startre_array_endr   re_nullre_truere_falser'  ry   r   re_intre_realfloatre_string_hexr   r@   r   r0  rA   re_string_litget_literal_stringr~   )r   r   r   expect_indirectr3  r$  objectr   rc   rd   Z
stream_lenZstream_dataZ
hex_stringr   r   r   r+    s    
 &






zPdfParser.get_valuesF   (\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))   nr      r      t   	   b      f   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tdd S )Nr   ri   r      r-     r      r      r   zunfinished literal string)r   re_lit_str_tokenr/  r   r  r   escaped_charsr   r   r|   r*  rE   )r   r   r   Znesting_depthr   r$  r   r   r   rI    s,    

 







zPdfParser.get_literal_strings   xrefs+   ([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)c                 C   s  d}| j | j|| j }t|d | }| j| j|}|sNt|d qd}| }t|d}t|d}t	||| D ]}| j
| j|}t|d | }|dd	k}t|d}	|st|d|	f}
t|| jkp| j| |
kd
 |
| j|< qq,|S )NFzxref section start not foundzxref subsection start not foundTri   r   zxref entry not foundr-  rS  z)xref entry duplicated (and not identical))re_xref_section_startr(  r   r   rL   r*  re_xref_subsection_startr   r   r   re_xref_entryr   )rO   r  Zsubsection_foundr$  r   Zfirst_objectnum_objectsr   Zis_freerT   Z	new_entryr   r   r   r"    s@     
 
zPdfParser.read_xref_tablec                 C   sh   | j |d  \}}t||d kd|d |d ||f  | j| j|| j t| |dd }|| j|< |S )Nr   ri   zgexpected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s)rJ  r3  )r   rL   r+  r   r   rM   r   )rO   r  r3  r   rT   rd   r   r   r   r    s"    

zPdfParser.read_indirectc                 C   sj   |d kr| j }t|d dkd g }|d D ]8}| |}|d dkrR|| q,|| j|d q,|S )Nr  r   z%/Type of page tree node is not /Pagess   Kidsr  )node)r   rL   r  r   r   r  )rO   r_  r   ZkidZ
kid_objectr   r   r   r    s    
 
zPdfParser.linearize_page_tree)NNNr   r   )N)N)F)Nr   )r   )N)HrF   rG   rH   rI   ra   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newline_onlynewlinerecompileDOTALLr  r&  r  r#  Zre_whitespace_optionalr'  r;  r)  r   r!  r.  r   rA  rB  rC  rD  rE  r?  r@  rG  rH  r:  r8  r9  r7  r<  r>  r+  rY  r   rZ  rI  r[  r\  r]  r"  r  r  r   r   r   r   r   i  s  
%
	


	
	





y                

!
r   )r   r   r   r  r   rd  r   r   r	   r   r:   rD   r   rE   rL   
namedtuplerM   r[   r\   ry   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   -
])0