/
pdf.go
125 lines (104 loc) · 2.92 KB
/
pdf.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package generator
import (
"bytes"
"fmt"
"strings"
"text/template"
"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"github.com/pkg/errors"
"github.com/kodekoding/phastos/go/helper"
)
type PDFs interface {
SetTemplate(templatePath string, data interface{}) PDFs
SetFooterHTMLTemplate(footerHTMLPath string) PDFs
SetFileName(fileName *string) PDFs
Generate() error
Error() error
}
type PDF struct {
generator *wkhtmltopdf.PDFGenerator
contents *wkhtmltopdf.PageReader
footerHTMLPath string
fileName string
err error
}
type ConverterOptions struct {
PageSize string
MarginBottom uint
MarginTop uint
MarginLeft uint
MarginRight uint
}
func NewPDF(options ...*ConverterOptions) (*PDF, error) {
generator, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
return nil, errors.Wrap(err, "phastos.generator.pdf.New")
}
// set default options
var pageSize = wkhtmltopdf.PageSizeA4
var marginBottom, marginTop, marginLeft, marginRight uint = 10, 10, 11, 11
if options != nil && len(options) > 0 {
pdfOption := options[0]
pageSize = pdfOption.PageSize
marginBottom = pdfOption.MarginBottom
marginRight = pdfOption.MarginRight
marginLeft = pdfOption.MarginLeft
marginTop = pdfOption.MarginTop
}
generator.PageSize.Set(pageSize)
generator.MarginRight.Set(marginRight)
generator.MarginLeft.Set(marginLeft)
generator.MarginTop.Set(marginTop)
generator.MarginBottom.Set(marginBottom)
return &PDF{generator: generator}, nil
}
func (c *PDF) SetTemplate(templatePath string, data interface{}) PDFs {
if c.err != nil {
return c
}
templ, err := template.ParseFiles(templatePath)
if err != nil {
c.err = errors.Wrap(err, "phastos.generator.pdf.SetTemplate.ParseFile")
return c
}
buff := new(bytes.Buffer)
if err = templ.Execute(buff, data); err != nil {
c.err = errors.Wrap(err, "phastos.generator.pdf.SetTemplate.ExecuteTemplate")
return c
}
contentString := buff.String()
c.contents = wkhtmltopdf.NewPageReader(strings.NewReader(contentString))
c.contents.EnableLocalFileAccess.Set(true)
return c
}
func (c *PDF) SetFileName(fileName *string) PDFs {
tmpFolderPath, _ := helper.GetTmpFolderPath()
*fileName = fmt.Sprintf("%s/pdf/%s", tmpFolderPath, *fileName)
helper.CheckFolder(*fileName)
c.fileName = *fileName
return c
}
func (c *PDF) Generate() error {
if c.Error() != nil {
return c.Error()
}
if c.footerHTMLPath != "" {
c.contents.FooterHTML.Set(c.footerHTMLPath)
c.contents.FooterSpacing.Set(-20.0)
}
c.generator.AddPage(c.contents)
if err := c.generator.Create(); err != nil {
return errors.Wrap(err, "phastos.generator.pdf.Generate.Create")
}
if err := c.generator.WriteFile(c.fileName); err != nil {
return errors.Wrap(err, "phastos.generator.pdf.Generate.Create")
}
return nil
}
func (c *PDF) SetFooterHTMLTemplate(footerHTMLPath string) PDFs {
c.footerHTMLPath = footerHTMLPath
return c
}
func (c *PDF) Error() error {
return c.err
}