47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
import os
|
|
import json
|
|
from docx import Document
|
|
from PyPDF2 import PdfReader
|
|
from app.services.file_storage import get_file_content
|
|
|
|
|
|
async def parse_reference_file(file_path: str) -> str:
|
|
ext = os.path.splitext(file_path)[1].lower()
|
|
content = await get_file_content(file_path)
|
|
|
|
if ext == ".txt":
|
|
return content.decode("utf-8", errors="ignore")
|
|
if ext == ".docx":
|
|
from io import BytesIO
|
|
doc = Document(BytesIO(content))
|
|
return "\n".join(p.text for p in doc.paragraphs if p.text.strip())
|
|
if ext == ".pdf":
|
|
from io import BytesIO
|
|
reader = PdfReader(BytesIO(content))
|
|
return "\n".join(page.extract_text() or "" for page in reader.pages)
|
|
|
|
raise ValueError(f"不支持的文件格式: {ext}")
|
|
|
|
|
|
async def parse_reference_files(ref_file_path: str | None) -> str:
|
|
if not ref_file_path:
|
|
return ""
|
|
|
|
try:
|
|
paths = json.loads(ref_file_path)
|
|
if isinstance(paths, list):
|
|
texts = []
|
|
for path in paths:
|
|
try:
|
|
texts.append(await parse_reference_file(path))
|
|
except Exception:
|
|
texts.append(f"[无法解析文件: {path}]")
|
|
return "\n\n".join(texts)
|
|
except json.JSONDecodeError:
|
|
pass
|
|
|
|
try:
|
|
return await parse_reference_file(ref_file_path)
|
|
except Exception:
|
|
return f"[无法解析文件: {ref_file_path}]"
|