123 lines
2.9 KiB
Go
123 lines
2.9 KiB
Go
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.Println("Danke! Jetzt brauche ich noch einen Titel, wie z.B. 'Teilnahmeliste der StugA Lehramt GO-Vollversammlung 01.01.2026':")
|
|
|
|
scanner.Scan()
|
|
err2 := scanner.Err()
|
|
if err2 != nil {
|
|
log.Fatalln(err2.Error())
|
|
}
|
|
title := scanner.Text()
|
|
|
|
fmt.Println("Deine Datei wird erstellt...")
|
|
|
|
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")
|
|
}
|