o
    j                  	   @   s   d dl Z d dlmZ d dl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rJd 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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   G/var/www/ai-app/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 }	 ztjrtd||	W Y d}	~	nd}	~	ww | | z|  \}}
W n ty }	 ztjrtd|	W Y d}	~	dS d}	~	ww |t|
7 }| j| t| j|}| ||  	 z|  \}}
W n ty }	 ztjrtd|	W Y d}	~	n/d}	~	ww d	|
v r |
d	}||7 }| jr||
d| 7 }n|t|
7 }| jr.||
7 }q| ||  td
||||dd  | jdusKJ t|t|| jj }| ||f dS | ||f dS )zHandles PDF-related keywords.      N   r   Lengthz/Length is undefined: z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lencurstackr   r	   r   KEYWORD_STREAMr   r   r   KeyErrorr   STRICTr   seeknextliner   r   	bytearrayreadindexlogdebugr
   bytesdecipher)r   r!   r"   _
_object_id	object_idobjdicobjlenerrlinedata_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,   r2   r(   r)   intr   rJ   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.
    rF   r   Nc                 C   s   t | t| d S N)r   r   r   )r   rF   r   r   r   r      s   zPDFStreamParser.__init__c                 C   s   | j |    d S rN   )r*   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   r4   r   )r   r!   r"   r>   r?   r@   rA   r   r   r   rJ      s   
zPDFStreamParser.do_keyword)r   N)r   r   r   rK   r<   r   rP   r   rQ   rL   r   rJ   r   r   r   r   rM      s    
rM   ) loggingior   typingr   r   r   pdfminerr   pdfminer.castingr   pdfminer.pdfexceptionsr   pdfminer.pdftypesr	   r
   r   r   pdfminer.psexceptionsr   pdfminer.psparserr   r   r   pdfminer.pdfdocumentr   	getLoggerr   r:   r   r   rM   r   r   r   r   <module>   s    
 m