2026-04-10 16:26:03 +02:00
package main
import (
2026-04-10 19:24:49 +02:00
"bufio"
2026-04-10 16:26:03 +02:00
"encoding/csv"
"fmt"
2026-04-10 18:09:55 +02:00
"log"
2026-04-10 16:26:03 +02:00
"math"
2026-04-10 18:09:55 +02:00
"os"
"github.com/signintech/gopdf"
2026-04-10 16:26:03 +02:00
)
func main ( ) {
2026-04-10 19:24:49 +02:00
scanner := bufio . NewScanner ( os . Stdin )
fmt . Print ( "Moin! Dieses kleine Tool erstellt dir eine Teilnahmeliste als PDF, welche du an den AStA schicken kannst, um nach einer Vollversammlung den StugA bestätigen zu lassen.\n\n" )
fmt . Print ( "Wahrscheinlich/hoffentlich habt ihr für die Teilnahmeliste eine Umfrage auf Nextcloud erstellt, in welcher sich Leute eintragen konnten. Falls dem so ist -- perfekt! Exportiere die Daten aus Nextcloud im CSV-Format und packe sie in den selben Ordner, in welchem auch dieses Programm liegt.\n\n" )
fmt . Println ( "Gib bitte jetzt den Namen der Datei ein, z.B. 'liste.csv':" )
scanner . Scan ( )
err := scanner . Err ( )
if err != nil {
log . Fatalln ( err . Error ( ) )
}
fileName := scanner . Text ( )
2026-04-10 19:35:30 +02:00
fmt . Print ( "Danke! Jetzt brauche ich noch ein paar weitere Infos.\n\n" )
fmt . Println ( "Wie heißt euer StugA? Beispiel: 'StugA Lehramt GO':" )
2026-04-10 19:24:49 +02:00
scanner . Scan ( )
2026-04-10 19:35:30 +02:00
err = scanner . Err ( )
if err != nil {
log . Fatalln ( err . Error ( ) )
2026-04-10 19:24:49 +02:00
}
2026-04-10 19:35:30 +02:00
stuga := scanner . Text ( )
fmt . Println ( "Zuletzt brauche ich das Datum der Vollversammlung, Beispiel: '28.05.2026':" )
scanner . Scan ( )
err = scanner . Err ( )
if err != nil {
log . Fatalln ( err . Error ( ) )
}
date := scanner . Text ( )
2026-04-10 19:24:49 +02:00
fmt . Println ( "Deine Datei wird erstellt..." )
2026-04-10 19:35:30 +02:00
title := fmt . Sprintf ( "Teilnahmeliste der %s-Vollversammlung vom %s" , stuga , date )
2026-04-10 19:24:49 +02:00
createPdf ( fileName , title )
fmt . Println ( "Die Datei wurde erstellt! Das Programm schließt sich jetzt." )
}
func createPdf ( fileName , title string ) {
2026-04-10 16:26:03 +02:00
// Prepare data
2026-04-10 19:24:49 +02:00
file , err := os . Open ( fileName )
2026-04-10 16:26:03 +02:00
if err != nil {
2026-04-10 19:24:49 +02:00
log . Fatalln ( "Fehler beim Öffnen der Datei: " + err . Error ( ) )
2026-04-10 16:26:03 +02:00
}
reader := csv . NewReader ( file )
reader . LazyQuotes = true
records , errRecords := reader . ReadAll ( )
if errRecords != nil {
2026-04-10 19:24:49 +02:00
log . Fatalln ( "Fehler beim Auslesen der Datei: " + errRecords . Error ( ) )
2026-04-10 16:26:03 +02:00
}
defer file . Close ( )
// Prepare document
pdf := & gopdf . GoPdf { }
pdf . Start ( gopdf . Config {
PageSize : * gopdf . PageSizeA4 ,
} )
pdf . AddTTFFont ( "inter" , "./inter.ttf" )
2026-04-10 18:09:55 +02:00
pdf . SetMargins ( 20 , 20 , 20 , 20 )
2026-04-10 16:26:03 +02:00
var tableEntries [ ] [ ] string
var tablePageIndex = 0
2026-04-10 18:09:55 +02:00
var tablePageLength = 36
var isFirst bool = true
2026-04-10 16:26:03 +02:00
// Write data to document
2026-04-10 18:09:55 +02:00
for index , record := range records [ 1 : ] {
2026-04-10 16:26:03 +02:00
tableEntries = append ( tableEntries , [ ] string {
2026-04-10 18:09:55 +02:00
fmt . Sprintf ( "%d" , index + 1 ) ,
2026-04-10 16:26:03 +02:00
record [ 3 ] ,
record [ 5 ] ,
} )
}
iterations := math . Ceil ( float64 ( len ( tableEntries ) ) / 31.0 )
for i := 0 ; i < int ( iterations ) ; i += 1 {
// create each page here
2026-04-10 18:09:55 +02:00
pdf . AddPage ( )
var table gopdf . TableLayout
if isFirst {
pdf . SetFont ( "inter" , "" , 12 )
pdf . Cell ( nil , title )
pdf . SetFont ( "inter" , "" , 10 )
isFirst = false
2026-04-10 16:26:03 +02:00
2026-04-10 18:09:55 +02:00
table = pdf . NewTableLayout ( 20 , 40 , 21 , 1 )
} else {
table = pdf . NewTableLayout ( 20 , 20 , 21 , 1 )
2026-04-10 16:26:03 +02:00
}
2026-04-10 18:09:55 +02:00
table . AddColumn ( "#" , 30 , "left" )
table . AddColumn ( "Name" , 170 , "left" )
table . AddColumn ( "Fächer" , 340 , "left" )
for i := tablePageIndex ; i < tablePageIndex + tablePageLength ; i += 1 {
if i >= len ( tableEntries ) {
break
}
table . AddRow ( tableEntries [ i ] )
}
table . DrawTable ( )
2026-04-10 16:26:03 +02:00
tablePageIndex += tablePageLength
2026-04-10 18:09:55 +02:00
pdf . SetXY ( 573 , 815 )
pdf . Cell ( nil , fmt . Sprintf ( "%d" , int ( i + 1 ) ) )
2026-04-10 16:26:03 +02:00
}
// Finish document
pdf . WritePdf ( "vvliste.pdf" )
2026-04-10 18:09:55 +02:00
}