DataDecoder / reportService.py
dewmisam's picture
Upload 19 files
1067825 verified
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER
from fastapi.responses import FileResponse
from backend.state import session_store
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
def generate_pdf(text, file_path):
from reportlab.lib.enums import TA_CENTER
doc = SimpleDocTemplate(file_path)
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
name="Title",
parent=styles["Heading1"],
alignment=TA_CENTER,
spaceAfter=20
)
section_style = ParagraphStyle(
name="Section",
parent=styles["Heading2"],
spaceBefore=15,
spaceAfter=10
)
bullet_style = ParagraphStyle(
name="Bullet",
parent=styles["Normal"],
leftIndent=15,
spaceAfter=5
)
normal_style = styles["Normal"]
content = []
lines = text.split("\n")
for line in lines:
line = line.strip()
line = line.replace("**", "")
if not line:
content.append(Spacer(1, 10))
continue
if "data analysis report" in line.lower():
content.append(Paragraph(line, title_style))
elif line[0].isdigit() and "." in line:
content.append(Paragraph(line, section_style))
elif line.startswith("*") or line.startswith("-"):
bullet = line.lstrip("*- ").strip()
content.append(Paragraph(f"• {bullet}", bullet_style))
else:
content.append(Paragraph(line, normal_style))
doc.build(content)
def generate_report_file(session_id):
if session_id not in session_store:
raise Exception("session not found")
ai_text = session_store[session_id].get("explanation")
if not ai_text:
raise Exception("Run /explain first")
file_path = f"report_{session_id}.pdf"
generate_pdf(ai_text, file_path)
return FileResponse(
path=file_path,
filename="report.pdf",
media_type="application/pdf"
)