Compare commits

..

8 Commits

6 changed files with 148 additions and 15 deletions

View File

@@ -48,3 +48,4 @@ hohe
geniale geniale
sanfte sanfte
vokale vokale
bunte

View File

@@ -12,11 +12,18 @@ from reportlab.graphics import renderPDF
from svglib.svglib import svg2rlg from svglib.svglib import svg2rlg
from urllib.parse import urljoin from urllib.parse import urljoin
def generate_random_username(female_nouns, male_nouns, adjectives, used_usernames): def generate_random_username(female_nouns, male_nouns, neuter_nouns, adjectives, used_usernames):
random_username = None random_username = None
while True: while True:
nouns = choice([female_nouns, male_nouns]) nouns = choice([female_nouns, male_nouns, neuter_nouns])
random_username = f"{adjectives[randrange(len(adjectives)-1)]}{'' if nouns is female_nouns else 'r'}-{nouns[randrange(len(nouns)-1)].lower()}"
adjektive_suffix = ""
if nouns is male_nouns:
adjektive_suffix = "r"
elif nouns is neuter_nouns:
adjektive_suffix = "s"
random_username = f"{adjectives[randrange(len(adjectives))]}{adjektive_suffix}-{nouns[randrange(len(nouns))].lower()}"
if random_username not in used_usernames: if random_username not in used_usernames:
used_usernames.add(random_username) used_usernames.add(random_username)
print(random_username) print(random_username)
@@ -30,12 +37,14 @@ if __name__ == "__main__":
parser.add_argument("-s", "--size", type=int, help="Ticket height, defaults to 150.", default=150) 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) parser.add_argument("-m", "--margin", type=int, help="Margin (depends on printer), defaults to 0.", default=0)
parser.add_argument("-g", "--gap", type=int, help="Gap between tickets, defaults to 0.", default=0) parser.add_argument("-g", "--gap", type=int, help="Gap between tickets, defaults to 0.", default=0)
parser.add_argument("--exclude-usernames-from", action="append", help="File with usernames that should not be used.", default=[])
args = parser.parse_args() args = parser.parse_args()
adjectives = set() adjectives = set()
female_nouns = set() female_nouns = set()
male_nouns = set() male_nouns = set()
neuter_nouns = set()
with open('adjektive-weiblich.txt', 'r') as file: with open('adjektive-weiblich.txt', 'r') as file:
for line in file: for line in file:
adjectives.add(line.strip()) adjectives.add(line.strip())
@@ -45,17 +54,26 @@ if __name__ == "__main__":
with open('nomen-maennlich.txt', 'r') as file: with open('nomen-maennlich.txt', 'r') as file:
for line in file: for line in file:
male_nouns.add(line.strip()) male_nouns.add(line.strip())
with open('nomen-neutrum.txt', 'r') as file:
for line in file:
neuter_nouns.add(line.strip())
adjectives = list(adjectives) adjectives = list(adjectives)
female_nouns = list(female_nouns) female_nouns = list(female_nouns)
male_nouns = list(male_nouns) male_nouns = list(male_nouns)
neuter_nouns = list(neuter_nouns)
pdf = canvas.Canvas(args.output, pagesize=A4) pdf = canvas.Canvas(args.output, pagesize=A4)
page_width, page_height = A4 page_width, page_height = A4
used_usernames = set() used_usernames = set()
for exclude_usernames_file in args.exclude_usernames_from:
with open(exclude_usernames_file, 'r') as file:
for line in file:
used_usernames.add(line.strip())
ticket_height = args.size ticket_height = args.size
qr_code_size = ticket_height/1.5 qr_code_size = ticket_height/1.5
logo = svg2rlg("img/karaoke-outline.svg") logo = svg2rlg("img/karaoke-2-outline.svg")
scaling_factor = ticket_height/logo.height/2 scaling_factor = ticket_height/logo.height/2
logo.scale(scaling_factor, scaling_factor) logo.scale(scaling_factor, scaling_factor)
logo_width = logo.width*scaling_factor logo_width = logo.width*scaling_factor
@@ -71,9 +89,30 @@ if __name__ == "__main__":
generated_codes = 0 generated_codes = 0
for page in range(required_pages): for page in range(required_pages):
# Add crop marks in the margin area
if args.margin > 4:
pdf.setLineWidth(0.5)
for row in range(codes_per_row):
x = args.margin+row*(ticket_width+args.gap)
pdf.line(x1=x, y1=1, x2=x, y2=args.margin-3)
pdf.line(x1=x, y1=page_height-1, x2=x, y2=page_height-args.margin+3)
if args.gap > 0 or row == codes_per_row-1:
pdf.line(x1=x+ticket_width, y1=1, x2=x+ticket_width, y2=args.margin-3)
pdf.line(x1=x+ticket_width, y1=page_height-1, x2=x+ticket_width, y2=page_height-args.margin+3)
for col in range(codes_per_col):
y = args.margin+col*(ticket_height+args.gap/1.2)
pdf.line(x1=1, y1=y, x2=args.margin-3, y2=y)
pdf.line(x1=page_width-1, y1=y, x2=page_width-args.margin+3, y2=y)
if args.gap > 0 or col == codes_per_col-1:
pdf.line(x1=1, y1=y+ticket_height, x2=args.margin-3, y2=y+ticket_height)
pdf.line(x1=page_width-1, y1=y+ticket_height, x2=page_width-args.margin+3, y2=y+ticket_height)
for y in range(codes_per_col): for y in range(codes_per_col):
for x in range(codes_per_row): for x in range(codes_per_row):
url = urljoin(args.url, generate_random_username(female_nouns, male_nouns, adjectives, used_usernames)) url = urljoin(args.url, generate_random_username(female_nouns, male_nouns, neuter_nouns, adjectives, used_usernames))
qr_code = QrCodeWidget(url) qr_code = QrCodeWidget(url)
bounds = qr_code.getBounds() bounds = qr_code.getBounds()
@@ -83,17 +122,24 @@ if __name__ == "__main__":
current_x = args.margin+(ticket_width+args.gap)*x current_x = args.margin+(ticket_width+args.gap)*x
current_y = args.margin+(ticket_height+args.gap/1.2)*y current_y = args.margin+(ticket_height+args.gap/1.2)*y
# Print outline around ticket for debugging
# pdf.setLineWidth(0.01)
# pdf.rect(current_x, current_y, ticket_width, ticket_height)
renderPDF.draw(logo, pdf, current_x, current_y+ticket_height*0.40)
drawing = Drawing(ticket_height, ticket_height, transform=[qr_code_size/code_width, 0, 0, qr_code_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) drawing.add(qr_code)
renderPDF.draw(logo, pdf, current_x, current_y+35) renderPDF.draw(drawing, pdf, current_x+logo_width, current_y+ticket_height*0.15)
pdf.setFont("Helvetica", 12) font_scale = ticket_height/100
pdf.drawRightString(current_x+logo_width, current_y+16, "Hier anmelden →")
pdf.setFont("Helvetica", 8) pdf.setFont("Helvetica", 12*font_scale)
pdf.drawRightString(current_x+logo_width+qr_code_size-7, current_y, url) pdf.drawRightString(current_x+logo_width, current_y+ticket_height*0.25, "Hier anmelden →")
pdf.setFont("Helvetica", 8*font_scale)
pdf.drawRightString(current_x+logo_width+qr_code_size-7*font_scale, current_y+ticket_height*0.10, url)
renderPDF.draw(drawing, pdf, current_x+logo_width, current_y+5)
generated_codes += 1 generated_codes += 1
if generated_codes >= args.number: if generated_codes >= args.number:
pdf.save() pdf.save()

41
img/karaoke-2-outline.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -38,3 +38,4 @@ Bonsai
Berg Berg
Blitz Blitz
Garten Garten
Luftballon

41
nomen-neutrum.txt Normal file
View File

@@ -0,0 +1,41 @@
Mikrofon
Klavier
Auge
Wort
Auto
Fahrrad
Ohr
Lama
Brot
Feuerwerk
Huhn
Boot
Cello
Schlagzeug
Herz
Geheimnis
Pferd
Geraet
Konzert
Bier
Schiff
Keyboard
Krokodil
Schaf
Wetter
Klima
Radio
Programm
Buch
Flugzeug
Spiel
Hobby
Leben
Experiment
Gesetz
Dorf
Spielzeug
Geschenk
Signal
Stroh
Gewitter

View File

@@ -39,3 +39,6 @@ Waffel
Limonade Limonade
Zeit Zeit
Tomate Tomate
Erbse
Rakete
Pause