package main import ( "fmt" "github.com/jung-kurt/gofpdf" "gopkg.in/yaml.v2" "io/ioutil" "log" "os" "os/exec" "path/filepath" ) type Metadata struct { Invoice_nr string Invoice_info string Invoice_date string Vat float64 Account string Due_date string } type Address struct { Name string Street string Zip string City string Tel_no string Email string } type InvoiceItem struct { Text string Quantity float64 Pice_per_unit float64 } type InvoiceData struct { Metadata Metadata Sender_address Address Billing_address Address Item []InvoiceItem } /* global variable declaration */ var pdf *gofpdf.Fpdf var y_pos float64 var invoice_data InvoiceData var prog_dir string const margin_top = 7 const logo_top = 6 const logo_height = 20 const line_spacing = 5 const address_top = 50 const line1_top = 100 const tabstop_left = 20 const tabstop_left_2 = 32 const tabstop_address = 120 const tabstop_count = 10 const tabstop_price = 10 const tabstop_total = 170 const tabstop_logo = 155 const tabstop_right = 200 func ReadInvoiceData(filename string) { data, err := ioutil.ReadFile(filename) if err != nil { log.Fatal(err) } //fmt.Printf("File contents: %s", data) err = yaml.Unmarshal([]byte(data), &invoice_data) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- t:\n%v\n\n", invoice_data) fmt.Printf("%s\n", invoice_data.Billing_address.Name) } func WriteText(x float64, y float64, text string, alignStr ...string) { tr := pdf.UnicodeTranslatorFromDescriptor("") align := "LT" if len(alignStr) > 0 { align = alignStr[0] } pdf.SetXY(x, y) pdf.CellFormat(0, 11, tr(text), "", 0, align, false, 0, "") } func SetupInvoice() { pdf = gofpdf.New("P", "mm", "A4", "") pdf.SetMargins(0, 0, 0) pdf.SetFontLocation("fonts") pdf.AddFont("Dejavusans", "", "DejaVuSans.json") pdf.AddFont("Dejavusans-Bold", "", "DejaVuSans-Bold.json") pdf.SetFont("Dejavusans", "", 10) } func PrintPageHeader(firstPage bool) { var opt gofpdf.ImageOptions pdf.AddPage() y_pos = margin_top pdf.SetFont("Dejavusans-Bold", "", 10) WriteText(tabstop_left, y_pos, "nbit Informatik GmbH") pdf.SetFont("Dejavusans", "", 10) y_pos = y_pos + line_spacing WriteText(tabstop_left, y_pos, "Kirchweg 2") y_pos = y_pos + line_spacing WriteText(tabstop_left, y_pos, "3510 Konolfingen") y_pos = y_pos + line_spacing y_pos = y_pos + line_spacing WriteText(tabstop_left, y_pos, "Tel.") WriteText(tabstop_left_2, y_pos, "+41 31 792 00 40") y_pos = y_pos + line_spacing WriteText(tabstop_left, y_pos, "EMail") WriteText(tabstop_left_2, y_pos, "joerg.lehmann@nbit.ch") y_pos = y_pos + line_spacing opt.ImageType = "png" opt.ReadDpi = true pdf.ImageOptions("logos/nbit-logo.png", tabstop_logo, logo_top, 0, logo_height, false, opt, 0, "") } func PrintAddress() { fmt.Printf("Blabla: %s\n", invoice_data.Billing_address.Name) y_pos = address_top WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Name) y_pos = y_pos + line_spacing WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Street) y_pos = y_pos + line_spacing WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Zip+" "+invoice_data.Billing_address.City) y_pos = y_pos + line_spacing pdf.Line(tabstop_left, line1_top, tabstop_right, line1_top) } func PrintQR() { var opt gofpdf.ImageOptions cmd := exec.Command(filepath.Join(prog_dir, "qrbill.sh"), "--account", invoice_data.Metadata.Account, "--amount", "123.00", "--creditor-name", invoice_data.Sender_address.Name, "--creditor-street", invoice_data.Sender_address.Street, "--creditor-postalcode", invoice_data.Sender_address.Zip, "--creditor-city", invoice_data.Sender_address.City, "--extra-infos", invoice_data.Metadata.Invoice_info, "--debtor-name", invoice_data.Billing_address.Name, "--debtor-street", invoice_data.Billing_address.Street, "--debtor-postalcode", invoice_data.Billing_address.Zip, "--debtor-city", invoice_data.Billing_address.City, "--due-date", invoice_data.Metadata.Due_date, "--language", "de") cmd.Env = append(os.Environ(), "INVNO="+invoice_data.Metadata.Invoice_nr, ) stdoutStderr, err := cmd.CombinedOutput() fmt.Printf("%s\n", stdoutStderr) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", stdoutStderr) opt.ImageType = "jpeg" opt.ReadDpi = true pdf.ImageOptions("qr-images/"+invoice_data.Metadata.Invoice_nr+".jpg", 0, 200, 0, 0, false, opt, 0, "") } func main() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatal(err) } prog_dir = dir if len(os.Args) != 2 { fmt.Printf("usage: mkinvoice \n") os.Exit(1) } ReadInvoiceData(os.Args[1]) SetupInvoice() PrintPageHeader(true) PrintAddress() PrintQR() err = pdf.OutputFileAndClose(filepath.Join(prog_dir, "output", invoice_data.Metadata.Invoice_nr+".pdf")) if err == nil { fmt.Printf("Successfully created invoice\n") } else { fmt.Printf("Error: %v\n", err) } }