This repository has been archived by the owner on Apr 5, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
page.go
67 lines (64 loc) · 1.86 KB
/
page.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
package pdf
import (
"bytes"
"fmt"
"image"
"image/jpeg"
"github.com/jung-kurt/gofpdf"
"github.com/ledyba/IdPhotoMaker/photo"
)
// CreateDoc ...
func CreateDoc(docSizeName string, ph *photo.Photo, faceInfo *FaceInfo, reqs []*FaceRequest) ([]byte, error) {
var err error
img, _, err := image.Decode(bytes.NewReader(ph.Data))
if err != nil {
return nil, err
}
faces := make([]*Face, len(reqs))
pdf := gofpdf.New("P", "mm", docSizeName, "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
for i, req := range reqs {
name := fmt.Sprintf("%d", i)
var face *Face
face, err = CreateFace(img, ph, faceInfo, req)
if err != nil {
return nil, err
}
faces[i] = face
var buff bytes.Buffer
err = jpeg.Encode(&buff, face.Image, &jpeg.Options{Quality: 95})
if err != nil {
return nil, err
}
pdf.RegisterImageOptionsReader(name, gofpdf.ImageOptions{ImageType: "jpeg"}, bytes.NewReader(buff.Bytes()))
w, h, _ := pdf.PageSize(pdf.PageNo())
if (h-pdf.GetY())-float64(16+face.HeightInMm) < 10 {
pdf.AddPage()
}
const space = 3
margin := pdf.GetX()
line := int((w - 2*margin + space) / float64(face.WidthInMm+space))
left := (w - 2*margin + space) - float64(line)*float64(face.WidthInMm+space)
step := left/float64(line) + float64(face.WidthInMm) + space
pdf.Writef(12, "%.1fcmx%.1fcm\n", face.HeightInMm/10.0, face.WidthInMm/10.0)
total := 0
for total < req.Count {
if h-(pdf.GetY()+float64(face.HeightInMm)) < 10.0 {
pdf.AddPage()
pdf.SetY(10.0)
}
for i := 0; i < line; i++ {
pdf.ImageOptions(name, pdf.GetX()+step*float64(i), pdf.GetY(), float64(face.WidthInMm), float64(face.HeightInMm), false, gofpdf.ImageOptions{}, 0, "")
total = total + 1
}
pdf.SetY(pdf.GetY() + float64(face.HeightInMm) + space)
}
}
var buff bytes.Buffer
err = pdf.Output(&buff)
if err != nil {
return nil, err
}
return buff.Bytes(), nil
}