import base64
import io
from pathlib import Path
from PIL import Image
from src.generation import ConsolidatedSummary, FlashCard
def image_to_base64(img: Image.Image) -> str:
buffer = io.BytesIO()
img.save(buffer, format="PNG")
encoded = base64.b64encode(buffer.getvalue()).decode("utf-8")
return f"data:image/png;base64,{encoded}"
def flashcard_to_html(card: FlashCard, reference_image: Image.Image = None) -> str:
key_points_html = "".join(f"
{p}" for p in card.key_points)
examples_html = "".join(f"{e}" for e in card.examples)
if reference_image is not None:
img_src = image_to_base64(reference_image)
img_html = f'
'
else:
img_html = f'{card.suggested_image}
'
return f"""
{img_html}
{card.concept}
{card.definition}
Key Points
Examples
"""
def summary_to_html(summary: ConsolidatedSummary) -> str:
concepts_html = "".join(
f"{c['name']}: {c['description']}"
for c in summary.concepts
)
return f"""
{summary.topic}
{summary.overview}
Concepts
"""
def export_to_pdf(
content: "FlashCard | ConsolidatedSummary",
output_path: Path,
reference_image: Image.Image = None,
) -> Path:
if isinstance(content, FlashCard):
html = flashcard_to_html(content, reference_image)
else:
html = summary_to_html(content)
try:
from weasyprint import HTML
except Exception as e:
raise RuntimeError(
"No se puede exportar PDF: faltan las librerias GTK en este sistema. "
"Ejecuta install.bat como administrador para instalarlas."
) from e
HTML(string=html).write_pdf(str(output_path))
return output_path