|
|
"""Export results to PDF and DOCX formats."""
|
|
|
|
|
|
from docx import Document
|
|
|
from docx.shared import Pt, RGBColor
|
|
|
from reportlab.lib.pagesizes import letter
|
|
|
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
|
|
from reportlab.lib.units import inch
|
|
|
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
|
|
|
from reportlab.pdfbase import pdfmetrics
|
|
|
from reportlab.pdfbase.ttfonts import TTFont
|
|
|
from pathlib import Path
|
|
|
import uuid
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
EXPORT_DIR = Path("static/exports")
|
|
|
EXPORT_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
|
|
|
def export_to_docx(original_text: str, results: list, result_type: str = "Paraphrased") -> str:
|
|
|
"""
|
|
|
Export results to DOCX format.
|
|
|
|
|
|
Args:
|
|
|
original_text: The original input text
|
|
|
results: List of results (paraphrases, translations, etc.)
|
|
|
result_type: Type of result (e.g., "Paraphrased", "Translated")
|
|
|
|
|
|
Returns:
|
|
|
Relative path to the generated DOCX file
|
|
|
"""
|
|
|
try:
|
|
|
filename = f"{uuid.uuid4().hex}.docx"
|
|
|
filepath = EXPORT_DIR / filename
|
|
|
|
|
|
doc = Document()
|
|
|
|
|
|
|
|
|
title = doc.add_heading(f'{result_type} Text Results', 0)
|
|
|
|
|
|
|
|
|
doc.add_paragraph(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
|
doc.add_paragraph("")
|
|
|
|
|
|
|
|
|
doc.add_heading('Original Text:', level=1)
|
|
|
doc.add_paragraph(original_text)
|
|
|
doc.add_paragraph("")
|
|
|
|
|
|
|
|
|
doc.add_heading(f'{result_type} Versions:', level=1)
|
|
|
|
|
|
if isinstance(results, list):
|
|
|
for idx, result in enumerate(results, 1):
|
|
|
para = doc.add_paragraph()
|
|
|
run = para.add_run(f"{idx}. {result}")
|
|
|
run.font.size = Pt(11)
|
|
|
doc.add_paragraph("")
|
|
|
else:
|
|
|
para = doc.add_paragraph(str(results))
|
|
|
para.style.font.size = Pt(11)
|
|
|
|
|
|
doc.save(str(filepath))
|
|
|
|
|
|
return f"exports/{filename}"
|
|
|
|
|
|
except Exception as e:
|
|
|
raise RuntimeError(f"DOCX export failed: {str(e)}")
|
|
|
|
|
|
|
|
|
def export_to_pdf(original_text: str, results: list, result_type: str = "Paraphrased") -> str:
|
|
|
"""
|
|
|
Export results to PDF format.
|
|
|
|
|
|
Args:
|
|
|
original_text: The original input text
|
|
|
results: List of results (paraphrases, translations, etc.)
|
|
|
result_type: Type of result (e.g., "Paraphrased", "Translated")
|
|
|
|
|
|
Returns:
|
|
|
Relative path to the generated PDF file
|
|
|
"""
|
|
|
try:
|
|
|
filename = f"{uuid.uuid4().hex}.pdf"
|
|
|
filepath = EXPORT_DIR / filename
|
|
|
|
|
|
doc = SimpleDocTemplate(str(filepath), pagesize=letter)
|
|
|
story = []
|
|
|
styles = getSampleStyleSheet()
|
|
|
|
|
|
|
|
|
title_style = ParagraphStyle(
|
|
|
'CustomTitle',
|
|
|
parent=styles['Heading1'],
|
|
|
fontSize=18,
|
|
|
textColor=RGBColor(0, 0, 128),
|
|
|
spaceAfter=12
|
|
|
)
|
|
|
|
|
|
heading_style = ParagraphStyle(
|
|
|
'CustomHeading',
|
|
|
parent=styles['Heading2'],
|
|
|
fontSize=14,
|
|
|
textColor=RGBColor(0, 0, 0),
|
|
|
spaceAfter=6
|
|
|
)
|
|
|
|
|
|
|
|
|
story.append(Paragraph(f"{result_type} Text Results", title_style))
|
|
|
story.append(Spacer(1, 0.2*inch))
|
|
|
|
|
|
|
|
|
story.append(Paragraph(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", styles['Normal']))
|
|
|
story.append(Spacer(1, 0.3*inch))
|
|
|
|
|
|
|
|
|
story.append(Paragraph("Original Text:", heading_style))
|
|
|
story.append(Paragraph(original_text, styles['Normal']))
|
|
|
story.append(Spacer(1, 0.3*inch))
|
|
|
|
|
|
|
|
|
story.append(Paragraph(f"{result_type} Versions:", heading_style))
|
|
|
story.append(Spacer(1, 0.1*inch))
|
|
|
|
|
|
if isinstance(results, list):
|
|
|
for idx, result in enumerate(results, 1):
|
|
|
story.append(Paragraph(f"{idx}. {result}", styles['Normal']))
|
|
|
story.append(Spacer(1, 0.1*inch))
|
|
|
else:
|
|
|
story.append(Paragraph(str(results), styles['Normal']))
|
|
|
|
|
|
doc.build(story)
|
|
|
|
|
|
return f"exports/{filename}"
|
|
|
|
|
|
except Exception as e:
|
|
|
raise RuntimeError(f"PDF export failed: {str(e)}")
|
|
|
|
|
|
|
|
|
def cleanup_old_exports(max_age_hours: int = 24):
|
|
|
"""Remove export files older than max_age_hours."""
|
|
|
import time
|
|
|
current_time = time.time()
|
|
|
|
|
|
for export_file in EXPORT_DIR.glob("*.*"):
|
|
|
file_age = (current_time - export_file.stat().st_mtime) / 3600
|
|
|
if file_age > max_age_hours:
|
|
|
export_file.unlink()
|
|
|
|