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