main.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/env python3
  2. from io import BytesIO
  3. from pathlib import Path
  4. import cairo
  5. from nicegui import ui
  6. PDF_PATH = Path('output.pdf')
  7. def generate_svg() -> str:
  8. output = BytesIO()
  9. surface = cairo.SVGSurface(output, 300, 200)
  10. draw(surface)
  11. surface.finish()
  12. return output.getvalue().decode('utf-8')
  13. def generate_pdf() -> bytes:
  14. output = BytesIO()
  15. surface = cairo.PDFSurface(output, 300, 200)
  16. draw(surface)
  17. surface.finish()
  18. return output.getvalue()
  19. def draw(surface: cairo.SVGSurface) -> None:
  20. context = cairo.Context(surface)
  21. context.select_font_face('Arial', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
  22. context.set_font_size(20)
  23. context.move_to(10, 40)
  24. context.show_text(name.value)
  25. context.move_to(10, 80)
  26. context.show_text(email.value)
  27. def update() -> None:
  28. preview.content = generate_svg()
  29. PDF_PATH.write_bytes(generate_pdf())
  30. with ui.row():
  31. with ui.column():
  32. name = ui.input('Name', placeholder='Enter your name', on_change=update)
  33. email = ui.input('E-Mail', placeholder='Enter your E-Mail address', on_change=update)
  34. preview = ui.html().classes('border-2 border-gray-500')
  35. update()
  36. ui.button('Download PDF', on_click=lambda: ui.download(PDF_PATH)).bind_visibility_from(name, 'value')
  37. ui.run()