WiP: add logo (positioning still broken)

This commit is contained in:
2025-01-31 22:48:20 +01:00
parent b5a0df0471
commit 2e001e5858
6 changed files with 260 additions and 10 deletions

View File

@@ -9,6 +9,7 @@ from reportlab.lib.pagesizes import A4
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.barcode.qr import QrCodeWidget
from reportlab.graphics import renderPDF
from svglib.svglib import svg2rlg
from urllib.parse import urljoin
def generate_random_username(female_nouns, male_nouns, adjectives, used_usernames):
@@ -26,7 +27,8 @@ if __name__ == "__main__":
parser.add_argument("url", help="Base URL, e.g. 'https://url.com'.")
parser.add_argument("-n", "--number", type=int, help="Amount of requested usernames, defaults to 50.", default=50)
parser.add_argument("-o", "--output", type=str, help="Output file, defaults to 'qrcodes.pdf'.", default="qrcodes.pdf")
parser.add_argument("-s", "--size", type=int, help="QR code size, defaults to 45.", default=45)
parser.add_argument("-s", "--size", type=int, help="Ticket height, defaults to 150.", default=150)
parser.add_argument("-m", "--margin", type=int, help="Margin (depends on printer), defaults to 0.", default=0)
args = parser.parse_args()
@@ -50,10 +52,19 @@ if __name__ == "__main__":
page_width, page_height = A4
used_usernames = set()
codes_per_row = floor(page_width/args.size)
codes_per_col = floor(page_height/args.size)
ticket_height = args.size
qr_code_size = ticket_height/2
logo = svg2rlg("img/karaoke-outline.svg")
scaling_factor = ticket_height/logo.height
logo.scale(scaling_factor, scaling_factor)
logo_width = logo.width*scaling_factor
logo_height = logo.height*scaling_factor
ticket_width = logo_width + qr_code_size
codes_per_row = floor((page_width-args.margin*2)/ticket_width)
codes_per_col = floor((page_height-args.margin*2)/ticket_height)
if codes_per_col == 0 or codes_per_row == 0:
raise Exception(f"There is not enough space on A4 page to fit a QR code of size {args.size}x{args.size}!")
raise Exception(f"There is not enough space on A4 page to fit a QR code of size {ticket_width}x{ticket_height}!")
codes_per_page = codes_per_row*codes_per_col
required_pages = ceil(args.number/codes_per_page)
generated_codes = 0
@@ -61,16 +72,22 @@ if __name__ == "__main__":
for page in range(required_pages):
for y in range(codes_per_col):
for x in range(codes_per_row):
qr_code = QrCodeWidget(urljoin(args.url, generate_random_username(female_nouns, male_nouns, adjectives, used_usernames)))
url = urljoin(args.url, generate_random_username(female_nouns, male_nouns, adjectives, used_usernames))
qr_code = QrCodeWidget(url)
bounds = qr_code.getBounds()
code_width = bounds[2] - bounds[0]
code_height = bounds[3] - bounds[1]
drawing = Drawing(args.size, args.size, transform=[args.size/code_width, 0, 0, args.size/code_height, 0, 0])
drawing = Drawing(ticket_height, ticket_height, transform=[qr_code_size/code_width, 0, 0, qr_code_size/code_height, 0, 0])
drawing.add(qr_code)
renderPDF.draw(logo, pdf, args.margin+ticket_width*(x%codes_per_row), args.margin+ticket_height*(y%codes_per_col))
pdf.drawString(args.margin+ticket_width*(x%codes_per_row), args.margin+ticket_height*(y%codes_per_col), url)
renderPDF.draw(drawing, pdf, args.size*(x%codes_per_row), args.size*(y%codes_per_col))
pdf.drawString(args.margin+ticket_width*(x%codes_per_row), args.margin+ticket_height*(y%codes_per_col)+logo_height, "Hier Code scannen")
pdf.drawString(args.margin+ticket_width*(x%codes_per_row), args.margin+ticket_height*(y%codes_per_col)+logo_height-10, "und Song anmelden!")
renderPDF.draw(drawing, pdf, args.margin+ticket_width*(x%codes_per_row)+logo_width, args.margin+ticket_height*(y%codes_per_col))
generated_codes += 1
if generated_codes >= args.number:
pdf.save()