Bingo generator und PDF in python?
Hallo,
Um es kurz zu fassen muss ich einen Bingokarten Generator in python schreiben, der 16 Strings zufällig in eine 4*4 Tabelle einträhgt, und dann als Output eine PDF ausgibt.
Weiß jemand wie da geht?
Danke im Vorraus :3
Python ist nicht gerade das Mittel der Wahl um PDFs zu erzeugen. Kann die PDF-Generierung auch mit LaTeX erfolgen? (Also im Python Programm als subprocess)
Eigentlich gerne Python oder C# :)
1 Antwort
Python ist zwar nicht optimal hierfür, aber es geht:
from pandas import read_csv, read_excel
from random import shuffle, seed
from datetime import datetime
from fpdf import FPDF
from pandas.core.frame import DataFrame
# read strings from csv, xslx or generate in python
csv_read = False
xslx_read = False
if csv_read:
bingo_strings = read_csv(filepath_or_buffer='bingo_random.csv', index_col=None, header=None, sep=';', dtype='str')
elif xslx_read:
bingo_strings = read_excel(io='bingo_random.xlsx', index_col=None, header=None, engine = 'openpyxl', dtype="str")
else:
bingo_strings = DataFrame({'0': ["String " + "{:02}".format(x) + " (Bingo A)" for x in range(1,17)], '1': ["String " + "{:02}".format(x) + " (Bingo B)" for x in range(1,17)]})
# prepare pdf
pdf = FPDF(orientation='L', unit='mm', format='A4')
pdf.set_margins(0,0,0) # margins to zero
pdf.set_auto_page_break(False,0) # bottom margin to zero
pdf.set_font('Arial', 'B', 16) # define font (IF CHANGED -> CHANGE ALSO BELOW)
# set parameters for 4x4 table
pdf_w = 297 # same as pdf width
pdf_h = 210 # same as pdf height
pdf_border = 15
cell_spacing = 5
cell_w = (pdf_w - 2*pdf_border - 3*cell_spacing)/4
cell_h = (pdf_h - 2*pdf_border - 3*cell_spacing)/4
# new seed for random function
seed(datetime.now())
# generate 4x4 tables for every column
for col in bingo_strings.columns:
# check if exactly 16 strings in every row
if not (len(bingo_strings[col]) == 16):
print("Wrong number of rows in column", col)
# check if no cell is empty
elif bingo_strings[col].isna().sum() > 0:
print("Missing String in column", col)
# pass
else:
# shuffle strings
shuffle(bingo_strings[col])
# output shuffled strings as csv if needed
bingo_strings.to_csv('bingo_random_shuffled.txt', header=None, index=None, sep=';')
# init new page
pdf.add_page()
cell_number = 0
# print every string in 4x4 table
for n_row in range(4):
for n_col in range(4):
# set position of cell
pdf.set_xy(pdf_border + n_col*(cell_w + cell_spacing), pdf_border + n_row*(cell_h + cell_spacing))
# calculate number of line breaks for each cell
# needed to specify exact height in table
pdf_help = FPDF()
pdf_help.add_page()
pdf_help.set_font('Arial', 'B', 16) # THIS FONT MUST MATCH PREVIOUS DEFINED FONT
pdf_help.set_xy(0,0)
pdf_help.multi_cell(w=cell_w, h=cell_h, txt=bingo_strings[col][cell_number], border=1, align='C')
factor_h = pdf_help.get_y() / cell_h
# print string in pdf
pdf.multi_cell(w=cell_w, h=cell_h/factor_h, txt=bingo_strings[col][cell_number], border=1, align='C')
# next string
cell_number += 1
# save pdf
pdf.output('bingo_random.pdf', 'F')
Die Strings können entweder im Code direkt eingegeben werden oder als csv/xslx im gleichen Ordner liegen. Es können beliebig viele Spalten sein, aber in jeder Spalte müssen genau 16 Zeilen mit Strings sein. Pro Spalte wird dann eine neue Seite mit 4x4 Tabelle erzeugt.
Danke :D
Das ist en super Grundgerüst und hat mir super geholfen reinzukommen ^w^