refactored code

This commit is contained in:
Dominik Rimpf 2022-05-15 18:51:06 +02:00
parent 5c9de76dc4
commit eb691683f0

View file

@ -1,8 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import csv import csv
import os import os
import sys
import tempfile import tempfile
from math import ceil
from operator import itemgetter from operator import itemgetter
from fillpdf import fillpdfs from fillpdf import fillpdfs
@ -26,82 +26,75 @@ form_mapping = [("6", "20", "21"), ("19", "40", "41"), ("18", "39", "22"),
def read_csv(csv_path): def read_csv(csv_path):
persons = []
try: try:
csvfile = open(csv_path, newline='') csvfile = open(csv_path, newline='')
except FileNotFoundError: except FileNotFoundError:
print("[X] File {} not found!".format(csv_path)) print("[X] File {} not found!".format(csv_path))
exit(-1) sys.exit(1)
else: else:
with csvfile: with csvfile:
reader = csv.DictReader(csvfile, delimiter=",") reader = csv.DictReader(csvfile, delimiter=",")
persons = [{"Name": f"{t['Vorname']} {t['Nachname']}", "Hochschule": f"{t['Standort']}"} for t in reader if persons = [{"Name": f"{t['Vorname']} {t['Nachname']}", "Hochschule": f"{t['Standort']}"} for t in reader if
t['Status'] == "Student"] t['Status'] == "Student"]
persons.sort(key=itemgetter("Hochschule", "Name")) persons.sort(key=itemgetter("Hochschule", "Name"))
for idx, p in enumerate(persons):
p["Position"] = str(idx + 1)
return persons return persons
def fill_pdf_form(working_directory, form, persons, zeitraum, form_date, org_name, name, add_sheets): def fill_template(template_path, persons_list, headers, output_path):
fields = {}
for person, mapping in zip(persons_list, form_mapping):
fields[mapping[0]] = person["Position"]
fields[mapping[1]] = person["Name"]
fields[mapping[2]] = person["Hochschule"]
fields = {**headers, **fields}
fillpdfs.write_fillable_pdf(input_pdf_path=template_path, output_pdf_path=output_path, data_dict=fields,
flatten=True)
def create_pdf(output_pdf, form, persons_chunks, zeitraum, form_date, org_name, name, add_sheets):
page = 1 page = 1
output_file_name = "output" 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() writer = PdfWriter()
for input_file in file_list: form_reader = PdfReader(template_form)
reader = PdfReader(input_file) writer.trailer.Info = form_reader.Info
writer.addpages(reader.pages)
writer.trailer.Info = reader.Info
writer.write(output_pdf) with tempfile.TemporaryDirectory() as workdir:
for persons_list in persons_chunks + [[] for i in range(add_sheets)]:
output_file_path = os.path.join(workdir, f'{output_file_name}{page}.pdf')
headers = {"1": page, "2": zeitraum, "3": form_date, "4": org_name, "5": name}
fill_template(template_path=form, persons_list=persons_list, headers=headers, output_path=output_file_path)
reader = PdfReader(output_file_path)
writer.addpages(reader.pages)
page += 1
writer.write(output_pdf)
if __name__ == "__main__": if __name__ == "__main__":
workdir = tempfile.mkdtemp()
cwd = os.getcwd() cwd = os.getcwd()
csv_file_path = os.path.join(cwd, attendees_csv) csv_file_path = os.path.join(cwd, attendees_csv)
person_list = read_csv(csv_file_path)
form_path = os.path.join(cwd, template_form) form_path = os.path.join(cwd, template_form)
# check if form exits # check if form exits
if not os.path.exists(form_path): if not os.path.exists(form_path):
print("[X] File {} not found!".format(form_path)) print("[X] File {} not found!".format(form_path))
exit(1) sys.exit(1)
person_list = read_csv(csv_file_path)
persons_per_page = len(form_mapping)
person_list_per_page = [person_list[i:i + persons_per_page] for i in range(0, len(person_list), persons_per_page)]
for date in date_list: for date in date_list:
final_pdf_name = f'teilnehmendenliste_{date.replace(". ", "_")}.pdf' final_pdf_name = f'teilnehmendenliste_{date.replace(".", "_").replace(" ", "")}.pdf'
print(f'Creating {final_pdf_name}... ', end='')
final_pdf_path = os.path.join(cwd, final_pdf_name) 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, print(f'Creating {final_pdf_name}... ', end='')
empty_sheets) create_pdf(final_pdf_path, form_path, person_list_per_page, event_period, date, event_org, event_name, empty_sheets)
concat_pdfs(file_list=output_files, output_pdf=final_pdf_path)
print('done!') print('done!')