package main import ( "bufio" "encoding/csv" "fmt" "log" "math" "os" "github.com/signintech/gopdf" ) func main() { 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() fmt.Print("Danke! Jetzt brauche ich noch ein paar weitere Infos.\n\n") fmt.Println("Wie heißt euer StugA? Beispiel: 'StugA Lehramt GO':") scanner.Scan() err = scanner.Err() if err != nil { log.Fatalln(err.Error()) } 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() fmt.Println("Deine Datei wird erstellt...") title := fmt.Sprintf("Teilnahmeliste der %s-Vollversammlung vom %s", stuga, date) createPdf(fileName, title) fmt.Println("Die Datei wurde erstellt! Das Programm schließt sich jetzt.") } func createPdf(fileName, title string) { // Prepare data file, err := os.Open(fileName) if err != nil { log.Fatalln("Fehler beim Öffnen der Datei: " + err.Error()) } reader := csv.NewReader(file) reader.LazyQuotes = true records, errRecords := reader.ReadAll() if errRecords != nil { log.Fatalln("Fehler beim Auslesen der Datei: " + errRecords.Error()) } defer file.Close() // Prepare document pdf := &gopdf.GoPdf{} pdf.Start(gopdf.Config{ PageSize: *gopdf.PageSizeA4, }) pdf.AddTTFFont("inter", "./inter.ttf") pdf.SetMargins(20, 20, 20, 20) var tableEntries [][]string var tablePageIndex = 0 var tablePageLength = 36 var isFirst bool = true // Write data to document for index, record := range records[1:] { tableEntries = append(tableEntries, []string{ fmt.Sprintf("%d", index+1), record[3], record[5], }) } iterations := math.Ceil(float64(len(tableEntries)) / 31.0) for i := 0; i < int(iterations); i += 1 { // create each page here pdf.AddPage() var table gopdf.TableLayout if isFirst { pdf.SetFont("inter", "", 12) pdf.Cell(nil, title) pdf.SetFont("inter", "", 10) isFirst = false table = pdf.NewTableLayout(20, 40, 21, 1) } else { table = pdf.NewTableLayout(20, 20, 21, 1) } 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() tablePageIndex += tablePageLength pdf.SetXY(573, 815) pdf.Cell(nil, fmt.Sprintf("%d", int(i+1))) } // Finish document pdf.WritePdf("vvliste.pdf") }