#!/usr/bin/env python3 import csv import os import tempfile from math import ceil from operator import itemgetter from fillpdf import fillpdfs from pdfrw import PdfReader, PdfWriter # Change to your needs event_period = "25.05. - 29.05.22" event_org = "Verein der Freunde und Förderer der Bundesfachschaftentagung Elektrotechnik e.V." event_name = "90. Bundesfachschaftentagung Elektrotechnik" attendees_csv = "teilnehmer_innen.csv" empty_sheets = 1 template_form = "210705_Teilnehmendenliste_abgestimmt.pdf" date_list = ["25.05.22", "26.05.22", "27.05.22", "28.05.22", "29.05.22"] # Nothing to change below here form_mapping = [("6", "20", "21"), ("19", "40", "41"), ("18", "39", "22"), ("17", "42", "23"), ("16", "43", "24"), ("15", "44", "25"), ("14", "45", "26"), ("13", "46", "27"), ("12", "Text7", "28"), ("11", "29", "34"), ("10", "30", "35"), ("9", "31", "36"), ("8", "32", "37"), ("7", "33", "38")] def read_csv(csv_path): persons = [] try: csvfile = open(csv_path, newline='') except FileNotFoundError: print("[X] File {} not found!".format(csv_path)) exit(-1) else: with csvfile: reader = csv.DictReader(csvfile, delimiter=",") persons = [{"Name": f"{t['Vorname']} {t['Nachname']}", "Hochschule": f"{t['Standort']}"} for t in reader if t['Status'] == "Student"] persons.sort(key=itemgetter("Hochschule", "Name")) return persons def fill_pdf_form(working_directory, form, persons, zeitraum, form_date, org_name, name, add_sheets): page = 1 output_file_name = "output" personen_pro_seite = 14 anzahl_seiten = ceil(len(persons) / personen_pro_seite) pdfs = [] for j in range(anzahl_seiten + add_sheets): felder = {} i = 0 for item in form_mapping: if personen_pro_seite * j + i < len(persons): felder[item[0]] = str(j * personen_pro_seite + i + 1) felder[item[1]] = persons[j * personen_pro_seite + i]["Name"] felder[item[2]] = persons[j * personen_pro_seite + i]["Hochschule"] i += 1 if i == personen_pro_seite: output_file_path = os.path.join(working_directory, f'{output_file_name}{page}.pdf') headers = {"1": page, "2": zeitraum, "3": form_date, "4": org_name, "5": name} fields = {**headers, **felder} fillpdfs.write_fillable_pdf(input_pdf_path=form, output_pdf_path=output_file_path, data_dict=fields, flatten=True) pdfs.append(output_file_path) page += 1 return pdfs def concat_pdfs(file_list: list, output_pdf: str): writer = PdfWriter() for input_file in file_list: reader = PdfReader(input_file) writer.addpages(reader.pages) writer.trailer.Info = reader.Info writer.write(output_pdf) if __name__ == "__main__": workdir = tempfile.mkdtemp() cwd = os.getcwd() csv_file_path = os.path.join(cwd, attendees_csv) person_list = read_csv(csv_file_path) form_path = os.path.join(cwd, template_form) # check if form exits if not os.path.exists(form_path): print("[X] File {} not found!".format(form_path)) exit(1) for date in date_list: final_pdf_name = f'teilnehmendenliste_{date.replace(". ", "_")}.pdf' print(f'Creating {final_pdf_name}... ', end='') final_pdf_path = os.path.join(cwd, final_pdf_name) output_files = fill_pdf_form(workdir, form_path, person_list, event_period, date, event_org, event_name, empty_sheets) concat_pdfs(file_list=output_files, output_pdf=final_pdf_path) print('done!')