3
Y^͊              2   @   s  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	 yd dl
m
Z
 W n ek
rv   ej
Z
Y nX e	rdd Zn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/d0d1d2d3)Zd4d5 ZG d6d7 d7eZd8d9 ZG d:d; d;ejd<d=d>gZG d?d@ d@eZG dAdB dBZG dCdD dDZG dEdF dFeZG dGdH dHe
ZG dIdJ dJZG dKdL dLZdMdN ZG dOdP dPZdS )Q    N   )py3)UserDictc             C   s
   | j dS )Nzus-ascii)encode)s r   //tmp/pip-build-8app2_gc/Pillow/PIL/PdfParser.py
make_bytes   s    r	   c             C   s   | S )Nr   )r   r   r   r   r	      s    c             C   s   t j| 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   s`   | d t tj tjkr0| t tjd  jdS trHdjdd | D S djdd | D S d S )Nr
    c             s   s   | ]}t j|t|V  qd S )N)PDFDocEncodinggetchr).0byter   r   r   	<genexpr>P   s    zdecode_text.<locals>.<genexpr>c             s   s   | ]}t jt||V  qd S )N)r9   r:   ord)r<   r=   r   r   r   r>   R   s    )lenr   r   decoder   join)br   r   r   decode_textL   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   U   s   rE   c             C   s   | st |d S )N)rE   )	conditionerror_messager   r   r   check_format_condition[   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__b   s    zIndirectReference.__str__c             C   s   | j  jdS )Nzus-ascii)rO   r   )rN   r   r   r   	__bytes__e   s    zIndirectReference.__bytes__c             C   s$   |j | j ko"|j| jko"|j| jkS )N)	__class__	object_id
generation)rN   otherr   r   r   __eq__h   s    zIndirectReference.__eq__c             C   s
   | |k S )Nr   )rN   rT   r   r   r   __ne__m   s    zIndirectReference.__ne__c             C   s   t | j| jfS )N)hashrR   rS   )rN   r   r   r   __hash__p   s    zIndirectReference.__hash__N)rF   rG   rH   rO   rP   rU   rV   rX   r   r   r   r   rM   `   s
   rM   ZIndirectReferenceTuplerR   rS   c               @   s   e Zd Zdd ZdS )IndirectObjectDefc             C   s   d|  S )Nz	%s %s objr   )rN   r   r   r   rO   u   s    zIndirectObjectDef.__str__N)rF   rG   rH   rO   r   r   r   r   rY   t   s   rY   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_finished)rN   r   r   r   __init__z   s    
zXrefTable.__init__c             C   s2   | j r|| j|< n
|| j|< || jkr.| j|= d S )N)r^   r\   r[   r]   )rN   keyvaluer   r   r   __setitem__   s
    

zXrefTable.__setitem__c             C   s*   y
| j | S  tk
r$   | j| S X d S )N)r\   KeyErrorr[   )rN   r`   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 )Nr   z
object ID z+ cannot be deleted because it doesn't exist)r\   r]   r[   
IndexErrorstr)rN   r`   rS   r   r   r   __delitem__   s    


zXrefTable.__delitem__c             C   s   || j kp|| jkS )N)r[   r\   )rN   r`   r   r   r   __contains__   s    zXrefTable.__contains__c             C   s.   t t| jj t| jj B t| jj B S )N)r@   setr[   keysr\   r]   )rN   r   r   r   __len__   s    zXrefTable.__len__c             C   s*   t | jj t | jj  t | jj B S )N)ri   r[   rj   r]   r\   )rN   r   r   r   rj      s    zXrefTable.keysc             C   s`  t t| jj t| jj B }t t| jj }|j }|jd x|rZd }xPt|D ]<\}}|d ksx|d |kr~|}q\|d | }||d  }P q\W |}d }|jtd|d t	|f  x|D ]}	|	| jkr|jtd| j|	   q|j
d}
t|	|
kd|	|
f  y|d }W n tk
r6   d}Y nX |jtd|| j|	 f  qW qHW |S )Ns   xref
r   z%d %d
r   z%010d %05d n 
z>expected the next deleted object ID to be %s, instead found %sz%010d %05d f 
)sortedri   r\   rj   r]   tellwrite	enumerater	   r@   poprL   re   )rN   frj   Zdeleted_keysZ	startxrefprevindexr`   Zcontiguous_keysrR   Zthis_deleted_object_idZnext_in_linked_listr   r   r   rn      sB    





zXrefTable.writeN)rF   rG   rH   r_   rb   rd   rg   rh   rk   rj   rn   r   r   r   r   rZ   y   s   rZ   c               @   sl   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e
dd dD  Zdd ZeZdS )PdfNamec             C   s6   t |tr|j| _nt |tr&|| _n|jd| _d S )Nzus-ascii)
isinstancert   namebytesr   )rN   rv   r   r   r   r_      s
    


zPdfName.__init__c             C   s   | j jdS )Nzus-ascii)rv   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 )N)ru   rt   rv   )rN   rT   r   r   r   rU      s    zPdfName.__eq__c             C   s
   t | jS )N)rW   rv   )rN   r   r   r   rX      s    zPdfName.__hash__c             C   s   dt | j S )NzPdfName(%s))reprrv   )rN   r   r   r   __repr__   s    zPdfName.__repr__c             C   s   | t j|S )N)	PdfParserinterpret_name)clsdatar   r   r   from_pdf_stream   s    zPdfName.from_pdf_stream!      c             c   s   | ]}t |V  qd S )N)r?   )r<   cr   r   r   r>      s    zPdfName.<genexpr>z#%/()<>[]{}c             C   sz   t d}xh| jD ]^}trB|| jkr.|j| qn|jtd|  qt|| jkr\|j| q|jdt|  qW t|S )N   /z#%02Xs   #%02X)		bytearrayrv   r   allowed_charsappendextendr	   r?   rw   )rN   resultrC   r   r   r   rP      s    
zPdfName.__bytes__N)rF   rG   rH   r_   rx   rU   rX   rz   classmethodr   ri   ranger   rP   rO   r   r   r   r   rt      s    rt   c               @   s   e Zd Zdd ZeZdS )PdfArrayc             C   s   ddj dd | D  d S )Ns   [     c             s   s   | ]}t |V  qd S )N)pdf_repr)r<   xr   r   r   r>     s    z%PdfArray.__bytes__.<locals>.<genexpr>s    ])rB   )rN   r   r   r   rP     s    zPdfArray.__bytes__N)rF   rG   rH   rP   rO   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zes(eZdS )PdfDictc             C   s@   |dkr.t tdr"tj| || q<|| j|< n|| |jd< d S )Nr~   __setattr__zus-ascii)hasattrr   r   __dict__r   )rN   r`   ra   r   r   r   r   	  s
    
zPdfDict.__setattr__c             C   s  y| |j d }W n tk
r.   t|Y nX t|trBt|}|jdr|j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
j|d t|d  |}|dkr|d	9 }|dkr|d9 }t
jtj|| }|S )Nzus-asciiDatezD:   Z         <         z%Y%m%d%H%M%S+-r   )r   r   )r   rc   AttributeErrorru   rw   rD   endswith
startswithr@   inttimestrptimegmtimecalendartimegm)rN   r`   ra   Zrelationshipoffsetformatr   r   r   __getattr__  s.    



zPdfDict.__getattr__c             C   sr   t d}xV| j D ]J\}}|d kr$qt|}|jd |jtt| |jd |j| qW |jd t|S )Ns   <<   
r   s   
>>)r   itemsr   r   rw   rt   )rN   outr`   ra   r   r   r   rP   -  s    


zPdfDict.__bytes__N)rF   rG   rH   r   r   rP   r   rO   r   r   r   r   r     s
   	r   c               @   s*   e Zd Zdd Zerdd Zndd ZdS )	PdfBinaryc             C   s
   || _ d S )N)r~   )rN   r~   r   r   r   r_   ?  s    zPdfBinary.__init__c             C   s   t ddjdd | jD  S )Nz<%s>r8   c             s   s   | ]}d | V  qdS )z%02XNr   )r<   rC   r   r   r   r>   D  s    z&PdfBinary.__bytes__.<locals>.<genexpr>)r	   rB   r~   )rN   r   r   r   rP   C  s    zPdfBinary.__bytes__c             C   s   ddj dd | jD  S )Nz<%s>r8   c             s   s   | ]}d t | V  qdS )z%02XN)r?   )r<   rC   r   r   r   r>   G  s    z$PdfBinary.__str__.<locals>.<genexpr>)rB   r~   )rN   r   r   r   rO   F  s    zPdfBinary.__str__N)rF   rG   rH   r_   r   rP   rO   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 )N)
dictionarybuf)rN   r   r   r   r   r   r_   K  s    zPdfStream.__init__c             C   s   y| j j}W n tk
r"   | jS X |dkrjy| j j}W n tk
rT   | 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   NotImplementedErrorry   )rN   filterZexpected_lengthr   r   r   rA   O  s    zPdfStream.decodeN)rF   rG   rH   r_   rA   r   r   r   r   r   J  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| jdS t | t	j
r|dt	jd| jd d	 S t | trtt| S t | trtt| S trt | tst rt | trtt| S t | tr| jd
d} | jdd} | jd	d} d|  d	 S t| S d S )NTs   trueFs   falses   nullzus-asciis   (D:z%Y%m%d%H%M%SZ   )   \s   \\   (s   \(s   \))ru   rt   r   r   r   rw   r   rf   r   r   struct_timestrftimedictlistr   unicoder   r   replace)r   r   r   r   r   `  s2    


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j ed0 e d1 e d2 e d3 e d4 e d5 ej!Z"ej ed0 e d6 e d2 e d3 e d4 e ej!Z#d7d8 Z$d9d: Z%ej eZ&ej ed; e d< Z'ej ed= Z(ej ed> e Z)e*d?d@ Z+ej dAZ,e*dtdCdDZ-ej edE e d< Z.ej edF e d< Z/ej edG e d< Z0ej edH e d< Z1ej edI e d< Z2ej edJ Z3ej edK Z4ej edL e dM Z5ej edN Z6ej edO e dO e dP e d< Z7ej edO e dO e dQ e d< Z8ej edR e d< Z9ej dSe dT e dU Z:ej edV Z;ej edW e d< Z<e*dvdYdZZ=ej 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j edi e ZBej ed3 e d3 e e ZCej djZDdkdl ZEdxdmdnZFdydodpZGdS )zr{   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| j| | _}d| _| rt	|dr|j
| _i | _|r| j  nTd | _| _t | _d | _t | _d | _i | _g | _g | _d | _d | _i | _t | _d| j_|r| j  d S )Nz4specify buf or f or filename, but not both buf and fFTrv   r   )RuntimeErrorfilenamer   rq   start_offsetshould_close_bufshould_close_fileopenget_buf_from_filer   rv   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_dictrZ   
xref_tabler^   seek_end)rN   r   rq   r   r   moder   r   r   r_     sF    
zPdfParser.__init__c             C   s   | S )Nr   )rN   r   r   r   	__enter__  s    zPdfParser.__enter__c             C   s   | j   dS )NF)close)rN   exc_type	exc_value	tracebackr   r   r   __exit__  s    zPdfParser.__exit__c             C   s   | j   | j  d S )N)	close_bufr   )rN   r   r   r   start_writing  s    zPdfParser.start_writingc             C   s.   y| j j  W n tk
r"   Y nX d | _ d S )N)r   r   r   )rN   r   r   r   r     s
    zPdfParser.close_bufc             C   s2   | j r| j  | jd k	r.| jr.| jj  d | _d S )N)r   r   rq   r   r   )rN   r   r   r   r     s
    
zPdfParser.closec             C   s   | j jdtj d S )Nr   )rq   seekosSEEK_END)rN   r   r   r   r     s    zPdfParser.seek_endc             C   s   | j jd d S )Ns	   %PDF-1.4
)rq   rn   )rN   r   r   r   write_header  s    zPdfParser.write_headerc             C   s   | j jd|f jd d S )Nz%% %s
zutf-8)rq   rn   r   )rN   r   r   r   r   write_comment  s    zPdfParser.write_commentc             C   sl   | j   | j| jj | _| jd| _| j  | j| jtd| jd | j| jtdt	| j
| j
d | jS )Nr   s   Catalog)TypeZPagess   Pages)r   ZCountZKids)del_rootnext_object_idrq   rm   r   r   rewrite_pages	write_objrt   r@   r   )rN   r   r   r   write_catalog  s    

zPdfParser.write_catalogc             C   s  g }xt | jD ]\}}| j| }| j|j= |j|td  || jkrJqi }x |j D ]\}}|||j	 < qXW | j
|d< | jd|}x(t | jD ]\}	}
|
|kr|| j|	< qW qW xB|D ]:}x4|r| j| }|j| jkr| j|j= |jdd }qW qW g | _d S )Ns   ParentParent)N)ro   r   r   r   rR   r   rt   r   r   rx   r   
write_pager:   )rN   Zpages_tree_nodes_to_deleteiZpage_refZ	page_infoZstringified_page_infor`   ra   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   || _| jr(| jd | j| _| jj| j}t| j}| j|d}| j	d k	r`| j	|d< | jrp| j|d< || _	| jjdt
t| td|   d S )N)s   Roots   Sizes   Prevs   Infos   trailer
z
startxref
%d
%%%%EOF)r   r   r   r   r   r   rn   rq   r@   r   rw   r   r	   )rN   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   s   Pager   )ru   r   r   rt   r   r   )rN   refobjsdict_objr   r   r   r   	  s    


zPdfParser.write_pagec             O   s   | j }|d kr| j|j }n|j |jf| j|j< |jtt|  |j	dd }|d k	rft
||d< |rx|jt| x|D ]}|jt| q~W |d k	r|jd |j| |jd |jd |S )Nstreamr   s   stream
s   
endstream
s   endobj
)rq   r   rm   rS   r   rR   rn   rw   rY   rp   r@   r   )rN   r   r   r   rq   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 )Ns   Pages)r   r   rR   r   )rN   r   r   r   r   '  s    
zPdfParser.del_rootc             C   sT   t | dr| j S t | dr$| j S ytj| j dtjdS  tk
rN   dS X d S )N	getbuffergetvaluer   )access    )r   r   r   mmapfilenoZACCESS_READ
ValueError)rq   r   r   r   r   -  s    

zPdfParser.get_buf_from_filec             C   s   t | j| _| j| j | _| j  | jd | _| jjdd | _	t
| j| j| _| j	d krdt
 | _nt
| j| 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| j| _| jd d  | _d S )
Ns   Roots   Infos   Typez/Type missing in Roots   Catalogz/Type in Root is not /Catalogs   Pagesz/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   ru   rM   r   r   linearize_page_treer   r   )rN   r   r   r   r   9  s(    

zPdfParser.read_pdf_infoc             C   sX   yt t| jj d d}W n tk
r:   t dd}Y nX |d k	rT|df| j|j< |S )Nr   r   )rM   maxr   rj   r   rR   )rN   r   	referencer   r   r   r   S  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| j|}t|d |}x$|r`|}| jj| j|j d }q>W |sj|}|jd}t|jd| _	| j
|| _t | _| j| j	d d| jkr| j| jd  d S )Ni @  ztrailer end not found   r   r   )xref_section_offsets   Prev)r@   r   r   re_trailer_endsearchrL   startgroupr   r   interpret_trailerr   rZ   r   read_xref_tableread_prev_trailer)rN   Zsearch_start_offsetmZ
last_matchtrailer_datar   r   r   r   n  s$    



zPdfParser.read_trailerc             C   sv   | j |d}| jj| j||d  }t|d |jd}tt|jd|kd | j|}d|krr| j|d  d S )N)r  i @  zprevious trailer not foundr   r   zGxref section offset in previous trailer doesn't match what was expecteds   Prev)	r  re_trailer_prevr
  r   rL   r  r   r  r  )rN   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}x|| j j||}|sV| jj||}t|o>|j t|kdt||d    P | j|jd}| j	||j \}}|||< q
W td|kot
|d td td|kot
|d td |S )Nr   z+name not found in trailer, remaining data: r   s   Sizez&/Size not in trailer or not an integers   Rootz1/Root not in trailer or not an indirect reference)re_namematchre_dict_endrL   endr@   ry   r|   r  	get_valueru   r   rM   )r}   r  trailerr   r  r`   ra   r   r   r   r    s,    zPdfParser.interpret_trailers   ([^#]*)(#([0-9a-fA-F]{2}))?Fc             C   sr   d}xR| j j|D ]B}|jdrF||jdtj|jdjd 7 }q||jd7 }qW |rf|jdS t|S d S )Nr      r   zus-asciizutf-8)re_hashes_in_namefinditerr  r   fromhexrA   rw   )r}   rawZas_textrv   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   *)\>s   \(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 j||}|r&|j }| jj||}|rtt|jddkd tt|jddkd t|d kp|tt|jdt|jdkd | j||j |d d\}}|d kr|d fS | j	j||}t|d ||j fS t| d	 | j
j||}|r^tt|jddkd
 tt|jddkd tt|jdt|jd|j fS | jj||}|r|j }i }| jj||}xv|s| j|||d d\}}|d kr|d fS | j|||d d\}	}|	||< |d kr|d fS | jj||}qW |j }| jj||}|ryt|d }
W n0 tttfk
r`   td|jdd  Y nX ||j |j |
  }| jj||j |
 }t|d |j }tt||}nt|}||fS | jj||}|rL|j }g }| jj||}xN|s>| j|||d d\}	}|j|	 |d kr,|d fS | jj||}qW ||j fS | jj||}|rld |j fS | jj||}|rd|j fS | jj||}|rd|j fS | jj||}|rt| j|jd|j fS | jj||}|rt|jd|j fS | j j||}|r0t!|jd|j fS | j"j||}|rt#dd |jdD }t$|d dkr||jt%d t#j&|j'd|j fS | j(j||}|r| j)||j S tdt*|||d   d S )Nr   r   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<   rC   r   r   r   
<listcomp>M  s    z'PdfParser.get_value.<locals>.<listcomp>   0zus-asciizunrecognized object:     )NN)+
re_commentr  r  re_indirect_def_startrL   r   r  rM   r  re_indirect_def_endre_indirect_referencere_dict_startr  re_stream_start	TypeErrorrc   r   rE   r:   re_stream_endr   r   re_array_startre_array_endr   re_nullre_truere_falser  rt   r|   re_intre_realfloatre_string_hexr   r@   r?   r  rA   re_string_litget_literal_stringry   )r}   r~   r   expect_indirectr  r  objectr   r`   ra   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  }x| jj||D ]}|j|||j   |jdrZ|j| j|jdd   n|jdr|jt|jddd  d nt|jdrnh|jdr|jd nR|jdr|jd	 |d7 }n4|jd
r|dkrt	||j
 fS |jd |d8 }|j
 }qW tdd S )Nr   r   r      r     r      r      r   zunfinished literal string)r   re_lit_str_tokenr  r   r  r  escaped_charsr   r   rw   r  rE   )r}   r~   r   Znesting_depthr   r  r   r   r   r5  p  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|| j }t|d |j }x| jj| j|}|sNt|d P d}|j }t|jd}t|jd}xt	||| D ]}| j
j| j|}t|d |j }|jdd	k}t|jd}	|st|jd|	f}
t|| jkp| j| |
kd
 |
| j|< qW q.W |S )NFzxref section start not foundzxref subsection start not foundTr   r   zxref entry not foundr  r?  z)xref entry duplicated (and not identical))re_xref_section_startr  r   r   rL   r  re_xref_subsection_startr   r  r   re_xref_entryr   )rN   r  Zsubsection_foundr  r   Zfirst_objectnum_objectsr   Zis_freerS   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   r   zgexpected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s)r6  r  )r   rL   r  r   r   rM   r   )rN   r   r  r   rS   ra   r   r   r   r     s    

zPdfParser.read_indirectc             C   sn   |d kr| j }t|d dkd g }xD|d D ]8}| j|}|d dkrT|j| q.|j| j|d q.W |S )Ns   Types   Pagesz%/Type of page tree node is not /Pagess   Kidss   Page)node)r   rL   r   r   r   r  )rN   rK  r   ZkidZ
kid_objectr   r   r   r    s    
zPdfParser.linearize_page_tree)NNNr   r   )N)N)Fr   )Nr   r   )r   )N)HrF   rG   rH   rI   r_   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|   r-  r.  r/  r0  r1  r+  r,  r3  r4  r&  r$  r%  r#  r(  r*  r  rE  r?   rF  r5  rG  rH  rI  r  r   r  r   r   r   r   r{   ~  s    
&
	

62

"x

r{   )r   r   collectionsr   r   rP  r   r   Z_utilr   r   ImportErrorr	   r   r9   rD   r   rE   rL   
namedtuplerM   rY   rZ   rt   r   r   r   r   r   r   r{   r   r   r   r   <module>   s   
	Z.6