o
    h                  	   @   s   d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZ d dlmZ d d	lmZmZmZ erLd d
lmZ e eZG dd deZG dd deeeeedf  ZG dd deZ dS )    N)BytesIO)TYPE_CHECKINGBinaryIOOptionalUnion)settings)safe_int)PDFException)	PDFObjRef	PDFStream
dict_value	int_value)PSEOF)KWD	PSKeywordPSStackParser)PDFDocumentc                   @   s   e Zd ZdS )PDFSyntaxErrorN)__name__
__module____qualname__ r   r   E/var/www/html/venv/lib/python3.10/site-packages/pdfminer/pdfparser.pyr      s    r   c                   @   sr   e Zd ZdZdeddfddZdd	d
ZedZedZ	edZ
edZedZedZdededdfddZdS )	PDFParsera  PDFParser fetch PDF objects from a file stream.
    It can handle indirect references by referring to
    a PDF document set by set_document method.
    It also reads XRefs at the end of every PDF file.

    Typical usage:
      parser = PDFParser(fp)
      parser.read_xref()
      parser.read_xref(fallback=True) # optional
      parser.set_document(doc)
      parser.seek(offset)
      parser.nextobject()

    fpreturnNc                 C   s   t | | d | _d| _d S )NF)r   __init__docfallback)selfr   r   r   r   r   '   s   
zPDFParser.__init__r   r   c                 C   s
   || _ dS )z0Associates the parser with a PDFDocument object.N)r   )r   r   r   r   r   set_document,   s   
zPDFParser.set_document   Rs   nulls   endobjs   streams   xrefs	   startxrefpostokenc              	   C   s  || j | jfv r| j| d  dS || ju r!| j| d  dS || ju r/| |df dS || ju r_t| j	dkr[| d\\}}}t
|}|dur]t| j|}| ||f dS dS dS || ju r<| d\\}}t|}d}| jszt|d }W n ty   tjrtd| Y nw | | z|  \}}	W n ty   tjrtdY dS w |t|	7 }| j| t| j|}
| ||  	 z|  \}}	W n ty   tjrtdY n)w d	|	v r|	d	}||7 }| jr|
|	d| 7 }
n|t|	7 }| jr|
|	7 }
q| ||  td
||||
dd  | jdus)J t|t|
| jj }| ||f dS | ||f dS )zHandles PDF-related keywords.      N   r   ZLengthz/Length is undefined: %rzUnexpected EOFs	   endstreamz-Stream: pos=%d, objlen=%d, dic=%r, data=%r...
   )!KEYWORD_XREFKEYWORD_STARTXREFadd_resultspopKEYWORD_ENDOBJKEYWORD_NULLpush	KEYWORD_RlenZcurstackr   r
   r   KEYWORD_STREAMr   r   r   KeyErrorr   STRICTr   seekZnextliner   r   	bytearrayreadindexlogdebugr   bytesZdecipher)r   r"   r#   _
_object_id	object_idobjZdicZobjlenlinedataZlineposistreamr   r   r   
do_keyword7   s   





zPDFParser.do_keyword)r   r   r   N)r   r   r   __doc__r   r   r    r   r/   r-   r,   r1   r(   r)   intr   rC   r   r   r   r   r      s    
r   c                   @   sJ   e Zd ZdZdeddfddZdddZed	Zd
e	de
ddfddZdS )PDFStreamParsera#  PDFStreamParser is used to parse PDF content streams
    that is contained in each page and has instructions
    for rendering the page. A reference to a PDF document is
    needed because a PDF content stream can also have
    indirect references to other objects in the same document.
    r@   r   Nc                 C   s   t | t| d S N)r   r   r   )r   r@   r   r   r   r      s   zPDFStreamParser.__init__c                 C   s   | j |    d S rG   )r*   Zpopall)r   r   r   r   flush   s   zPDFStreamParser.flushs   objr"   r#   c                 C   s~   || j u r%| d\\}}}t|}|d ur#t| j|}| ||f d S || j| jfv r6tj	r4t
dd S | ||f d S )Nr&   zKeyword endobj found in stream)r/   r+   r   r
   r   r.   KEYWORD_OBJr,   r   r3   r   )r   r"   r#   r;   r<   r=   r>   r   r   r   rC      s   
zPDFStreamParser.do_keyword)r   N)r   r   r   rD   r:   r   rH   r   rI   rE   r   rC   r   r   r   r   rF      s    
rF   )!loggingior   typingr   r   r   r   Zpdfminerr   Zpdfminer.castingr   Zpdfminer.pdfexceptionsr	   Zpdfminer.pdftypesr
   r   r   r   Zpdfminer.psexceptionsr   Zpdfminer.psparserr   r   r   Zpdfminer.pdfdocumentr   	getLoggerr   r8   r   r   rF   r   r   r   r   <module>   s    
 m