o
    
zi                  	   @   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   Q/home/air/biblejyuku/back/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 rx| d}z|\\}}W n ty }	 ztd| |	d}	~	ww 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rtd	|	W Y d}	~	n/d}	~	ww d
|v r:|d
}|
|7 }
| jr9||d| 7 }n|
t|7 }
| jrH||7 }q| ||
  td||
||dd  | jduseJ t|t || jj!}| ||f dS | ||f dS )zHandles PDF-related keywords.      N   zInvalid stream dictionary: 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_STREAM
ValueErrorr   r   r   r   KeyErrorr   STRICTseeknextliner   r   	bytearrayreadindexlogdebugr
   bytesdecipher)r   r!   r"   _
_object_id	object_idobjpopped_datadicerrobjlen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   rL   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.
    rH   r   Nc                 C   s   t | t| d S N)r   r   r   )r   rH   r   r   r   r      s   zPDFStreamParser.__init__c                 C   s   | j |    d S rP   )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   r5   r   )r   r!   r"   r?   r@   rA   rB   r   r   r   rL      s   
zPDFStreamParser.do_keyword)r   N)r   r   r   rM   r=   r   rR   r   rS   rN   r   rL   r   r   r   r   rO      s    
rO   ) 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   rO   r   r   r   r   <module>   s    
 t