
    Ji                     v    d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	 d dl
mZ  G d d      Zdefd	Z e       Zy)
    )
LlamaParse)OptionalListDictAnyN)settings)loggerc                       e Zd ZdZddee   defdZdedeeee	f      fdZ
d	edeeee	f      fd
Zdee   deeee	f      fdZdeeee	f      defdZy)	PDFParserz
    A class to parse PDF documents using LlamaParse API.
    Supports both file paths and URLs for extracting structured text from PDFs.
    Napi_keyresult_typec                     |xs t         j                  | _        | j                  st        d      t	        | j                  |d      | _        t        j                  d|        y)z
        Initialize the PDF parser.
        
        Args:
            api_key: LlamaParse API key. If None, uses settings.LLAMA_CLOUD_API_KEY
            result_type: Output format - "markdown" or "text"
        z?LLAMA_CLOUD_API_KEY must be configured in environment variablesT)r   r   verbosez'PDFParser initialized with result_type=N)r   LLAMA_CLOUD_API_KEYr   
ValueErrorr   parserr	   info)selfr   r   s      D/var/www/html/BankruptcyAI-uat/bankruptcy-ai/src/utils/pdf_parser.py__init__zPDFParser.__init__   sX     >(">">||^__ LL#

 	=k]KL    urlreturnc                    	 t        j                  d|        | j                  j                  |      }t        j                  dt	        |       d       |S # t
        $ r=}t        j                  dt        |              t        dt        |             d}~wt        $ r=}t        j                  dt        |              t        dt        |             d}~wt        $ rZ}t        |      j                         }d	|v sd
|v r8t        j                  dt        |              t        dt        |             d|v sd|v r8t        j                  dt        |              t        dt        |             d|v sd|v sd|v r8t        j                  dt        |              t        dt        |             d|v sd|v r8t        j                  dt        |              t        dt        |             t        j                  dt        |              t        dt        |             d}~ww xY w)a  
        Parse a PDF from a URL.
        
        Args:
            url: URL of the PDF document
            
        Returns:
            List of parsed documents with text content
            
        Raises:
            Exception: If PDF parsing fails
        zParsing PDF from URL: Successfully parsed z documents from URLz6LLAMAPARSE FAILURE REASON: Network connection error - zLlamaParse network error: Nz-LLAMAPARSE FAILURE REASON: Request timeout - zLlamaParse timeout: ztcptransport closedzhandler is closedzCLLAMAPARSE FAILURE REASON: HTTP connection pool exhausted/closed - z"LlamaParse connection pool issue: z
rate limit429z5LLAMAPARSE FAILURE REASON: API rate limit exceeded - zLlamaParse rate limit: authentication401403z;LLAMAPARSE FAILURE REASON: API key authentication failed - zLlamaParse auth error: zservice unavailable503z<LLAMAPARSE FAILURE REASON: LlamaParse service unavailable - zLlamaParse service down: z+LLAMAPARSE FAILURE REASON: Unknown error - zLlamaParse error: )r	   r   r   	load_datalenConnectionErrorerrorstr	ExceptionTimeoutErrorlower)r   r   	documentse	error_msgs        r   	parse_urlzPDFParser.parse_url!   s%   	?KK067--c2IKK.s9~.>>QRS 	CLLQRUVWRXQYZ[8QABB 	=LLHQQR23q6(;<< 	?AI$	15HI5Ubcfghcibjkl"DSVH MNN*ey.@TUXYZU[T\]^"9#a& BCC!Y.%92DQZHZZ[^_`[aZbcd"9#a& BCC&)3u	7I[\_`a\b[cde";CF8 DEEJ3q6(ST"4SVH =>>!	?s1   AA 	I"8BI&8CI+EI  I	file_pathc           	      J   	 t        j                  d|        | j                  j                  |      }t        j                  dt	        |       d       |S # t
        $ r@}t        j                  d| dt        |              t        dt        |             d}~ww xY w)a
  
        Parse a local PDF file.
        
        Args:
            file_path: Path to the PDF file
            
        Returns:
            List of parsed documents with text content
            
        Raises:
            Exception: If PDF parsing fails
        zParsing PDF from file: r   z documents from filezError parsing PDF file : zError parsing PDF file: N)r	   r   r   r!   r"   r&   r$   r%   )r   r-   r)   r*   s       r   
parse_filezPDFParser.parse_fileK   s    	AKK1)=>--i8IKK.s9~.>>RST 	ALL29+RAxHI6s1vh?@@	As   AA 	B"";BB"sourcesc           
         g }t        j                  dt        |       d       |D ]G  }	 | j                  j	                  |      }|j                  |       t        j                  d|        I t        j                  dt        |              |S # t        $ r.}t        j                  d| dt        |              Y d}~d}~ww xY w)z
        Parse multiple PDFs from URLs or file paths.
        
        Args:
            sources: List of URLs or file paths
            
        Returns:
            List of parsed documents from all sources
        zParsing z PDF sourcesr   zError parsing r/   NzTotal documents parsed: )	r	   r   r"   r   r!   extendr&   r$   r%   )r   r1   all_documentssourcedocsr*   s         r   parse_multiplezPDFParser.parse_multiplea   s     hs7|nL9: 	BFB{{,,V4$$T*26(;<		B 	.s=/A.BCD	  B~fXRAx@AABs   AB	C$CCr)   c                 d    |sydj                  |D cg c]  }|j                   c}      S c c}w )z
        Extract plain text from parsed documents.
        
        Args:
            documents: List of parsed documents
            
        Returns:
            Combined text from all documents
         z

)jointext)r   r)   docs      r   get_textzPDFParser.get_texty   s+     {{	:CHH:;;:s   -)Nmarkdown)__name__
__module____qualname____doc__r   r%   r   r   r   r   r,   r0   r7   r=    r   r   r   r      s    
M M3 M&(?S (?T$sCx.%9 (?TAC ADc3h,@ A,d3i Dc3h4H 0<$tCH~"6 <3 <r   r   r   c                      t               S )z
    Factory function to create a new parser instance per request.
    This avoids connection pool conflicts in async/concurrent scenarios.
    )r   rC   r   r   get_pdf_parserrE      s    
 ;r   )llama_parser   typingr   r   r   r   ossrc.core.configr   src.core.loggingr	   r   rE   
pdf_parserrC   r   r   <module>rL      s9    " , , 	 $ #}< }<@	  [
r   