Bingo generator und PDF in python?

max32168  31.08.2021, 17:43

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)

LucaBluemel 
Beitragsersteller
 31.08.2021, 19:46

Eigentlich gerne Python oder C# :)

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


LucaBluemel 
Beitragsersteller
 09.09.2021, 18:38

Danke :D
Das ist en super Grundgerüst und hat mir super geholfen reinzukommen ^w^

1
LucaBluemel 
Beitragsersteller
 31.08.2021, 22:51

Danke, das schau ich mir jetzt mal an ^w^

0