o
    "i                     @   sn   d Z ddlmZ ddlZddlmZmZ ddlZddlZddl	Z	e
eZG dd dZdadefdd	ZdS )
uL   
税务文档解析服务
支持解析 .doc 和 .docx 格式的税务文档
    )DocumentN)OptionalDictc                   @   s   e Zd ZdZdd Zdedeeeef  fddZdedeeeef  fdd	Z	dedeeeef  fd
dZ
dedeeef fddZdS )TaxDocumentParseru   税务文档解析器c                 C   s   dS )u   初始化文档解析器N )selfr   r   S/lsinfo/ai/hellotax_ai/base_platform/app/services/knowledge/word_document_parser.py__init__   s   zTaxDocumentParser.__init__	file_pathreturnc           
   
   C   s   zNt |}d}g }t|jD ]\}}|j }|sq|s!|r!|}q|| qd|}|s<tj	|
dd
dd}td|  |||d | dW S  tyl }	 ztd| d	|	  W Y d
}	~	d
S d
}	~	ww )u   
        解析 .docx 文件

        Args:
            file_path: 文件路径

        Returns:
            包含标题和内容的字典，失败返回 None
         
.docx.doczSuccessfully parsed DOCX file: z

titlecontent	full_textzFailed to parse DOCX file : N)r   	enumerate
paragraphstextstripappendjoinospathbasenamereplaceloggerinfo	Exceptionerror)
r   r
   docr   content_paragraphsiparar   r   er   r   r   
parse_docx   s0   



zTaxDocumentParser.parse_docxc                 C   s  zz|  |W W S  ty   Y nw td|  t Z}z7tjddddd||gdddd	 tj	
|d
d}tj	||}tj	|rU|  |W W  d   W S W n typ } ztd|  W Y d}~nd}~ww W d   n1 s{w   Y  td|  tj	
|d
dd| dtj	
|d
ddW S  ty } ztd| d|  W Y d}~dS d}~ww )u   
        解析 .doc 文件（旧版 Word 格式）
        需要先转换为 .docx 格式

        Args:
            file_path: 文件路径

        Returns:
            包含标题和内容的字典，失败返回 None
        z8Cannot directly parse .doc file, attempting conversion: sofficez
--headlessz--convert-todocxz--outdirT   )checkcapture_outputtimeoutr   r   NzLibreOffice conversion failed: z5Cannot parse .doc file, returning filename as title: r   z[Unparseable .doc file: ]r   zFailed to parse DOC file r   )r(   r!   r   warningtempfileTemporaryDirectory
subprocessrunr   r   r   r   r   existsr"   )r   r
   temp_dir	base_nameconverted_pathr'   r   r   r   	parse_docC   sP   
	

zTaxDocumentParser.parse_docc                 C   sl   t j|std|  dS t j|d  }|dkr#| |S |dkr,| |S td|  dS )u   
        自动识别并解析文档

        Args:
            file_path: 文件路径

        Returns:
            包含标题和内容的字典，失败返回 None
        zFile does not exist: N   r   r   zUnsupported file format: )	r   r   r5   r   r"   splitextlowerr(   r9   )r   r
   file_extr   r   r   
parse_filey   s   


zTaxDocumentParser.parse_filec              
   C   s   t j|t j|t j|d  |d}z5|drGt|}|j}|j	r,|j	|d< |j
r4|j
|d< |jr<|j|d< |jrJ|j|d< W |S W |S W |S  tyg } ztd|  W Y d	}~|S d	}~ww )
u   
        提取文档元数据

        Args:
            file_path: 文件路径

        Returns:
            元数据字典
        r:   )	file_name	file_size	file_typer
   r   	doc_titleauthorcreatedmodifiedzFailed to extract metadata: N)r   r   r   getsizer;   r<   endswithr   core_propertiesr   rC   rD   rE   r!   r   r0   )r   r
   metadatar#   
core_propsr'   r   r   r   extract_metadata   s6   





z"TaxDocumentParser.extract_metadataN)__name__
__module____qualname____doc__r	   strr   r   r(   r9   r>   anyrK   r   r   r   r   r      s    -6r   r   c                   C   s   t du rt a t S )u3   获取税务文档解析器实例（单例模式）N)_parserr   r   r   r   r   get_tax_document_parser   s   rS   )rO   r*   r   loggingtypingr   r   r   r3   r1   	getLoggerrL   r   r   rR   rS   r   r   r   r   <module>   s    
 )