import io import qrcode from reportlab.lib.pagesizes import landscape, A5 from reportlab.pdfgen import canvas from reportlab.lib import colors from reportlab.lib.utils import ImageReader def generate_qr_ticket(ticket_id: int, user_id: int, seat_id: int = 0) -> bytes: buffer = io.BytesIO() width, height = landscape(A5) c = canvas.Canvas(buffer, pagesize=(width, height)) # Темный фон (под дизайн фронтенда) c.setFillColor(colors.HexColor("#121212")) c.rect(0, 0, width, height, fill=1, stroke=0) # Белая карточка билета margin = 20 c.setFillColor(colors.white) c.roundRect(margin, margin, width - 2*margin, height - 2*margin, 10, fill=1, stroke=0) # Текст c.setFillColor(colors.black) c.setFont("Helvetica-Bold", 28) c.drawString(margin + 30, height - margin - 50, "EVENT TICKET") c.setFont("Helvetica", 14) c.drawString(margin + 30, height - margin - 100, f"Ticket ID: {ticket_id}") c.drawString(margin + 30, height - margin - 130, f"User ID: {user_id}") if seat_id: c.drawString(margin + 30, height - margin - 160, f"Seat ID: {seat_id}") c.setFont("Helvetica-Oblique", 10) c.setFillColor(colors.gray) c.drawString(margin + 30, margin + 30, "Scan this QR code at the entrance.") # QR-код qr = qrcode.QRCode(box_size=5, border=1) qr.add_data(f"TICKET:{ticket_id}|USER:{user_id}|SEAT:{seat_id}") qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") # Буферизация картинки для ReportLab img_buffer = io.BytesIO() img.save(img_buffer, format="PNG") img_buffer.seek(0) c.drawImage(ImageReader(img_buffer), width - margin - 160, margin + 30, width=130, height=130) c.showPage() c.save() buffer.seek(0) return buffer.read()