Как вставить 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