Как вставить QR-код и некоторый текст в шаблон pdf в Python (желательно) для генерации билетов

Здравствуйте, я сейчас делаю веб-приложение для конгресса в моем университете. Проект не слишком сложный, но основная функциональность заключается в том, что пользователь должен зарегистрироваться на конгрессе и получить пропуск/билет в PDF по электронной почте с QR-кодом, идентифицирующим его. Это делается для того, чтобы пользователь мог оказать помощь на любом мероприятии конгресса, где волонтер будет считывать QR-код на входе, чтобы мы могли отслеживать помощь и вознаграждать ее на индивидуальном уровне, а также отслеживать вместимость зала для целей COVID.

Сайт строится с использованием Django и DjangoRest, поэтому я хочу продолжать использовать Python везде, где это возможно. Я просмотрел такие инструменты, как ReportLabs python package. Он довольно плотный, и я не могу найти то, что ищу, а именно:

  • Откройте шаблон pdf
  • Заполните шаблон информацией о пользователе: например, именем и электронной почтой.
  • Вставьте/вставьте QR-код, сгенерированный для пользователя (это уже сделано).

Кажется, что это довольно просто, но я просто не могу найти, как это сделать, поэтому любой вклад был бы очень признателен.

Возможно, я неправильно понимаю, есть ли лучший способ генерировать билеты?

Вы можете использовать SimpleDocTemplate в reportlab и создать список истории. Например:

from io import BytesIO
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Image, Paragraph, SimpleDocTemplate, Spacer

def get_ticket_file(ticket_obj):
    buffer = BytesIO() # We dont want to store pdf
    doc = SimpleDocTemplate(
        buffer, pagesize=A4, rightMargin=50, leftMargin=50, topMargin=50, bottomMargin=50
    )
    story = []
    styles = getSampleStyleSheet()
    qr_image = Image(ticket_obj.get_qr_image(), # this is your method that returns qr image of your ticket.
                 )
    story.append(qr_image)
    story.append(Paragraph("`SomeTitle`", styles["Heading2"]))
    story.append(Spacer(1, 2)) # some space between lines
    # And so on.... add more paragraph with styles like `styles["Normal"]`
    doc.build(story)
    buffer.seek(0)
    return buffer

На ваш взгляд, верните этот pdf-файл

from django.http import FileResponse

# other logics 
pdf_file = get_ticket_file(ticket_obj)
return FileResponse(pdf_file, as_attachment=True, filename="ticket.pdf")

Также можно использовать библиотеку xhtml2pdf, которая имеет простой документ, и вы можете создавать pdf файлы с помощью HTML файла. это проще и вы пишите меньше кода. Например:

from django.template.loader import render_to_string
from io import BytesIO
from xhtml2pdf import pisa

def get_ticket_file(ticket_obj):
    html = render_to_string("ticket.html", # This is your html file. Read xhtml2pdf document in order to style it.
                            {"ticket_obj": ticket_obj})
    buffer = BytesIO()
    pdf = pisa.pisaDocument(src=html, dest=buffer, encoding="utf-8")
    buffer.seek(0)
    return buffer
Вернуться на верх