package main import ( "fmt" "os" "os/exec" "strings" "text/template" ) type FeeItem struct { Task string Timeframe string Hours float64 Price float64 } type Filenames struct { Data string Invoice string Main string } type Data struct { InvDate string WorkDate string InvNo string ProjName string CustComp string CustName string CustStr string CustZip string CustCity string CustCountry string TaxID string MyName string MyStr string MyZip string MyCity string MyCountry string MyTel string MyMob string MyMail string MyUrl string BankNum string BankLZ string BankName string Iban string Bic string } func billTemplate(billdata bill, cust Customer) Filenames { billid := billdata.id custr, cuzip, cucity, cucou := "", "", "", "" addr := String2StringArray(cust.Address, ";") for i, a := range addr { switch i { case 0: custr = a case 1: cuzip = a case 2: cucity = a case 3: cucou = a default: break } } dat := Data{billdata.date.UTC().Format("2006-01-02"), billdata.timerange, billdata.identity, billdata.projectname, cust.Company, cust.Name, custr, cuzip, cucity, cucou, config.Taxid, config.Name, config.Street, config.Zip, config.City, config.Country, config.Telefon, config.Mobile, config.Mail, config.Url, config.Bankacc, config.Banklz, config.Bankname, config.Iban, config.Bic, } inv := billdata.items filenamedata := fmt.Sprintf("%v_data", billid) filenameinv := fmt.Sprintf("%v_invoice", billid) filenamemain := fmt.Sprintf("%v_main.tex", billid) fnames := Filenames{filenamedata, filenameinv, filenamemain} //Parse Templates tmpl, err := template.New("invoice").Delims("[[", "]]").ParseGlob("templates/*.tex") checkErr(err) filenamedata = fmt.Sprintf("outtex/%v_data.tex", billid) filenameinv = fmt.Sprintf("outtex/%v_invoice.tex", billid) filenamemain = fmt.Sprintf("outtex/%v_main.tex", billid) //Open File datf, err := os.Create(filenamedata) checkErr(err) invf, err := os.Create(filenameinv) checkErr(err) maif, err := os.Create(filenamemain) checkErr(err) defer datf.Close() defer invf.Close() defer maif.Close() //Execute Template //err = tmpl.ExecuteTemplate(os.Stdout, "invoice.tex", td) err = tmpl.ExecuteTemplate(datf, "_data.tex", dat) checkErr(err) err = tmpl.ExecuteTemplate(invf, "_invoice.tex", inv) checkErr(err) err = tmpl.ExecuteTemplate(maif, "_main.tex", fnames) checkErr(err) return fnames } func runLatex(inputfilename, outputfilename string) error { fmt.Printf("Rendering: %s -> Output File: outpdf/Rechnung%s.pdf\n", inputfilename, cleanString(outputfilename)) pref := strings.TrimSuffix(inputfilename, "_main.tex") //cmdArgs := []string{"-synctex=1", "-interaction=nonstopmode", filename} binary, err := exec.LookPath("pdflatex") checkErr(err) //env := os.Environ() mainpdf := strings.Replace(inputfilename, ".tex", ".pdf", 1) cmd := fmt.Sprintf("cd outtex; %v -interaction=nonstopmode -output-directory='../outpdf' %s; cd ../outpdf; cp %s 'Rechnung%s.pdf'; rm %s_*", binary, inputfilename, mainpdf, cleanString(outputfilename), pref) //fmt.Println(cmd) //docmd := exec.Command(binary,cmdArgs[0], cmdArgs[1],cmdArgs[2]) docmd := exec.Command("bash", "-c", cmd) //err = docmd.Run() err = docmd.Start() //out,err := docmd.Output() //checkErr(err) err = docmd.Wait() //fmt.Println(string(out)) //fmt.Printf("Finished with Error:%v\n",err) return err } func tmpltest() { //Sampledata dat := Data{"17.6.18", "3.4.-7.6.18", "HN 07/18", "Testkopfstrasse 132", "Somecompany", "Jemand Wiadschosei", "Fakestreet 123", "6996", "Busenhausen", "Tittania", "6575-6544", "Meinam Sauluschtig", "Saubastrasse 86", "1111", "Nicetown", "Niceland", "+43 (1) 655 555 23", "+43 (0) 650 555 32", "Meinam@sauluscht.ig", "www.saulust.com", "7272626272", "20220", "Might Bank Inc.", "IB47 2382 4338 2822 1222", "BICBICBIC"} var inv []FeeItem inv = append(inv, FeeItem{"Modellierung Dachkonstruktion", "1.4.-27.4.18", 13, 325}) inv = append(inv, FeeItem{"Dokument Vorbereitung", "9.4.-5.5.18", 15, 375}) inv = append(inv, FeeItem{"Begehungen und Besprechungen", "1.4.-19.4.18", 12, 300}) inv = append(inv, FeeItem{"Wichtig aussehen", "5.5.-5.5.18", 2, 50}) //Parse Templates tmpl, err := template.New("invoice").Delims("[[", "]]").ParseGlob("templates/*.tex") checkErr(err) //Open File datf, err := os.Create("outtex/1_data.tex") checkErr(err) invf, err := os.Create("outtex/1_invoice.tex") checkErr(err) defer datf.Close() defer invf.Close() //Execute Template //err = tmpl.ExecuteTemplate(os.Stdout, "invoice.tex", td) err = tmpl.ExecuteTemplate(datf, "_data.tex", dat) checkErr(err) err = tmpl.ExecuteTemplate(invf, "_invoice.tex", inv) checkErr(err) }