Blame view

pdfhelper/pdf.go 4.45 KB
1b51eed04   Marko Tikvić   pdf helper
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
  package pdfhelper
  
  import (
  	"fmt"
  	"strings"
  
  	"git.to-net.rs/marko.tikvic/gofpdf"
  )
  
  // Block ...
  const (
  	CENTER   = "C"
  	LEFT     = "L"
  	RIGHT    = "R"
  	TOP      = "T"
  	BOTTOM   = "B"
  	FULL     = "1"
  	NOBORDER = ""
  )
  
  const (
  	CONTINUE = 0
  	NEWLINE  = 1
  	BELLOW   = 2
  )
  
  const (
  	cyrillicEncoding = "cp1251"
  	latinEncoding    = "cp1250"
  )
9ede5c7a9   Marko Tikvić   removed unused stuff
31
32
33
34
35
36
37
38
39
40
  const threeDots = "\u2056\u2056\u2056"
  
  type TableCell struct {
  	W, H            float64
  	Text            string
  	Font, FontStyle string
  	FontSize        float64
  	Border          string
  	Alignment       string
  }
1b51eed04   Marko Tikvić   pdf helper
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  // Helper ...
  type Helper struct {
  	*gofpdf.Fpdf
  	translators map[string]func(string) string
  }
  
  // New ...
  func New(ori, unit, size string) *Helper {
  	helper := &Helper{
  		Fpdf: gofpdf.New(ori, unit, size, ""),
  	}
  
  	return helper
  }
  
  func (pdf *Helper) LoadTranslators() {
  	pdf.translators = make(map[string]func(string) string)
  	pdf.translators[latinEncoding] = pdf.UnicodeTranslatorFromDescriptor(latinEncoding)
  	pdf.translators[cyrillicEncoding] = pdf.UnicodeTranslatorFromDescriptor(cyrillicEncoding)
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
61
  func (pdf *Helper) DrawCell(x, y float64, c TableCell) {
ec4067ed8   Marko Tikvić   accessories
62
63
  	pdf.SetXY(x, y)
  	pdf.SetFont(c.Font, c.FontStyle, c.FontSize)
9ede5c7a9   Marko Tikvić   removed unused stuff
64
  	pdf.CellFormat(c.W, c.H, pdf.toUTF8(c.Text), c.Border, BELLOW, c.Alignment, false, 0, "")
ec4067ed8   Marko Tikvić   accessories
65
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
66
  func (pdf *Helper) DrawColumn(x, y float64, cells []TableCell) {
1b51eed04   Marko Tikvić   pdf helper
67
68
69
  	pdf.SetXY(x, y)
  	for _, c := range cells {
  		pdf.SetFont(c.Font, c.FontStyle, c.FontSize)
9ede5c7a9   Marko Tikvić   removed unused stuff
70
  		pdf.CellFormat(c.W, c.H, pdf.toUTF8(c.Text), c.Border, BELLOW, c.Alignment, false, 0, "")
1b51eed04   Marko Tikvić   pdf helper
71
72
  	}
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
73
  func (pdf *Helper) DrawRow(x, y float64, cells []TableCell) {
1b51eed04   Marko Tikvić   pdf helper
74
75
76
  	pdf.SetXY(x, y)
  	for _, c := range cells {
  		pdf.SetFont(c.Font, c.FontStyle, c.FontSize)
9ede5c7a9   Marko Tikvić   removed unused stuff
77
  		pdf.CellFormat(c.W, c.H, pdf.toUTF8(c.Text), c.Border, CONTINUE, c.Alignment, false, 0, "")
1b51eed04   Marko Tikvić   pdf helper
78
79
  	}
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
80
81
82
  func (pdf *Helper) TextLength(txt, family, style string, size float64) float64 {
  	family, _, _, _ = pdf.setCorrectFontFamily(textEncoding(txt))
  	return pdf.Fpdf.TextLength(txt, family, style, size)
1b51eed04   Marko Tikvić   pdf helper
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  }
  
  func (pdf *Helper) LimitText(text, limiter string, maxWidth float64) string {
  	parts := pdf.Fpdf.SplitText(text, maxWidth)
  	if len(parts) > 1 {
  		return parts[0] + limiter
  	}
  
  	return text
  }
  
  // InsertImage ...
  func (pdf *Helper) InsertImage(img string, x, y, w, h float64) {
  	imgType := ""
  	if parts := strings.Split(img, "."); len(parts) >= 2 {
  		imgType = parts[len(parts)-1]
  	}
  	opt := gofpdf.ImageOptions{
  		ImageType:             imgType,
  		ReadDpi:               false,
  		AllowNegativePosition: false,
  	}
  	autoBreak := false // if it's not false then you can't draw the image at an arbitrary height (y position)
  	pdf.ImageOptions(img, x, y, w, h, autoBreak, opt, 0, "")
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
108
109
110
111
  func (pdf *Helper) PageHasSpace(requiredHeight float64) bool {
  	_, h := pdf.GetPageSize()
  	_, _, _, bot := pdf.GetMargins()
  	return (h - bot - pdf.GetY()) > requiredHeight
1b51eed04   Marko Tikvić   pdf helper
112
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
113
114
115
116
117
118
  // DrawBox ...
  func (pdf Helper) DrawBox(x0, y0, w, h float64) {
  	pdf.Line(x0, y0, x0+w, y0)
  	pdf.Line(x0+w, y0, x0+w, y0+h)
  	pdf.Line(x0+w, y0+h, x0, y0+h)
  	pdf.Line(x0, y0+h, x0, y0)
1b51eed04   Marko Tikvić   pdf helper
119
  }
9ede5c7a9   Marko Tikvić   removed unused stuff
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  // Strana %d/{TotalPages}
  func (pdf *Helper) InsertPageNumber(x, y float64, format string) {
  	num := fmt.Sprintf(format, pdf.PageNo())
  	pdf.DrawColumn(x, y, []TableCell{{10, 1, num, "DejaVuSans", "", 8, NOBORDER, LEFT}})
  }
  
  func (pdf *Helper) SuperscriptText(x, y, cw, ch float64, text, script string) {
  	family, style, size, sizeU := pdf.setCorrectFontFamily(textEncoding(text))
  
  	pdf.DrawCell(x, y, TableCell{cw, ch, text, family, style, size, NOBORDER, LEFT})
  
  	sx := x + pdf.TextLength(text, family, style, size)
  	sy := y - sizeU*0.2
  	pdf.DrawCell(sx, sy, TableCell{cw, ch, script, family, style, size - 2, NOBORDER, LEFT})
  }
  
  // toUTF8 ...
  func (pdf *Helper) toUTF8(s string) string {
  	encoding := textEncoding(s)
  	pdf.setCorrectFontFamily(encoding)
  	translator, ok := pdf.translators[encoding]
  	if !ok {
  		return ""
  	}
  	return translator(s)
1b51eed04   Marko Tikvić   pdf helper
145
  }
ec4067ed8   Marko Tikvić   accessories
146
  func textEncoding(s string) string {
1b51eed04   Marko Tikvić   pdf helper
147
148
149
150
151
152
153
154
  	encoding := latinEncoding
  	runes := []rune(s)
  	for _, r := range runes {
  		if uint64(r) >= 0x0402 && uint64(r) <= 0x044f {
  			encoding = cyrillicEncoding
  			break
  		}
  	}
ec4067ed8   Marko Tikvić   accessories
155
156
  	return encoding
  }
1b51eed04   Marko Tikvić   pdf helper
157
158
159
  func (pdf *Helper) setCorrectFontFamily(enc string) (family, style string, ptSize, unitSize float64) {
  	family, style, ptSize, unitSize = pdf.GetFontInfo()
  	if enc == cyrillicEncoding {
ec4067ed8   Marko Tikvić   accessories
160
161
  		if !strings.HasSuffix(family, "cyrillic") {
  			family += "cyrillic"
1b51eed04   Marko Tikvić   pdf helper
162
163
  		}
  	} else {
ec4067ed8   Marko Tikvić   accessories
164
165
  		if strings.HasSuffix(family, "cyrillic") {
  			family = strings.TrimSuffix(family, "cyrillic")
1b51eed04   Marko Tikvić   pdf helper
166
167
168
169
170
  		}
  	}
  	pdf.SetFont(family, style, ptSize)
  	return family, style, ptSize, unitSize
  }