-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
105 lines (91 loc) · 2.03 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
_ "embed"
"fmt"
"log"
"strings"
"github.com/signintech/gopdf"
)
//go:embed "Inter/Inter Variable/Inter.ttf"
var interFont []byte
//go:embed "Inter/Inter Hinted for Windows/Desktop/Inter-Bold.ttf"
var interBoldFont []byte
type Receipt struct {
Number string
Date string
BillFrom Company
BillTo Company
Items []Item
Notes string
Subtotal float64
Tax float64
Discount float64
Total float64
}
type Company struct {
Name string
Logo string
Email string
}
type Item struct {
name string
quantity int
price float64
}
func main() {
generateReceipt(Receipt{
Number: "083",
Date: "Aug 3, 2023",
BillFrom: Company{
Name: "Gopher Inc.",
Logo: "gopher.png",
Email: "gopher@gmail.com",
},
BillTo: Company{
Name: "John Doe",
Email: "john@gmail.com",
},
Items: []Item{
{name: "Mystic Staff", quantity: 8, price: 320},
{name: "Aghanim's Scepter", quantity: 4, price: 420},
{name: "Perseverance", quantity: 1, price: 100},
{name: "Vitality Booster", quantity: 19, price: 110},
{name: "Sacred Relic", quantity: 2, price: 380},
},
Notes: "Thank you for your business",
Tax: 130,
Discount: 80,
})
}
func generateReceipt(receipt Receipt) {
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{
PageSize: *gopdf.PageSizeA4,
})
pdf.SetMargins(40, 40, 40, 40)
pdf.AddPage()
err := pdf.AddTTFFontData("Inter", interFont)
if err != nil {
log.Print(err.Error())
return
}
err = pdf.AddTTFFontData("Inter-Bold", interBoldFont)
if err != nil {
log.Print(err.Error())
return
}
setCompany(&pdf, receipt.BillFrom)
setBillTo(&pdf, receipt.BillTo)
subtotal := setItems(&pdf, receipt.Items)
setNotes(&pdf, receipt.Notes)
setTotals(&pdf, subtotal, receipt.Tax, receipt.Discount)
setHeader(&pdf)
fmt.Println("PDF generated!")
name := strings.ReplaceAll(receipt.BillTo.Name, " ", "-")
filename := fmt.Sprintf("%s-%s.pdf", receipt.Number, name)
err = pdf.WritePdf("receipts/" + filename)
if err != nil {
log.Print(err.Error())
return
}
}