forked from phpdave11/gofpdi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
importer.go
115 lines (95 loc) · 2.97 KB
/
importer.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
package gofpdi
import (
"io"
"github.com/boxesandglue/gofpdi/reader"
)
// The Importer class to be used by a pdf generation library
type Importer struct {
reader *reader.PdfReader
writer *PdfWriter
tplMap map[int]*TplInfo
tplN int
importedPages map[int]int
}
// TplInfo has information about a template
type TplInfo struct {
Writer *PdfWriter
TemplateID int
}
// NewImporter returns a PDF importer
func NewImporter() *Importer {
importer := &Importer{}
importer.tplMap = make(map[int]*TplInfo, 0)
importer.writer = NewPdfWriter()
importer.importedPages = make(map[int]int, 0)
return importer
}
// SetObjIDGetter sets a function that is called each time the PDF writer should
// generate a new object number
func (imp *Importer) SetObjIDGetter(f func() int) {
imp.writer.NextObjectID = f
}
// SetSourceStream sets the importer source by providing a io.ReadSeeker
func (imp *Importer) SetSourceStream(rs io.ReadSeeker) error {
var err error
if imp.reader, err = reader.NewPdfReaderFromStream(rs); err != nil {
return err
}
// Make the next writer start template numbers at this.tplN
imp.writer.SetTplIDOffset(imp.tplN)
return nil
}
// GetNumPages returns the number of pages in the PDF document
func (imp *Importer) GetNumPages() (int, error) {
return imp.reader.GetNumPages()
}
// GetPageSizes returns the page sizes for all pages
func (imp *Importer) GetPageSizes() (map[int]map[string]map[string]float64, error) {
return imp.reader.GetAllPageBoxes(1.0)
}
// ImportPage imports a page and returns the template number
func (imp *Importer) ImportPage(pageno int, box string) (int, error) {
// If page has already been imported, return existing tplN
if _, ok := imp.importedPages[pageno]; ok {
return imp.importedPages[pageno], nil
}
res, err := imp.writer.ImportPage(imp.reader, pageno, box)
if err != nil {
return 0, err
}
// Get current template id
tplN := imp.tplN
// Set tpl info
imp.tplMap[tplN] = &TplInfo{TemplateID: res, Writer: imp.writer}
// Increment template id
imp.tplN++
// Cache imported page tplN
imp.importedPages[pageno] = tplN
return tplN, nil
}
// SetNextObjectID sets the start object number the generated PDF code has.
func (imp *Importer) SetNextObjectID(objID int) {
imp.writer.SetNextObjectID(objID)
}
// PutFormXobjects puts form xobjects and get back a map of template names (e.g.
// /GOFPDITPL1) and their object ids (int)
func (imp *Importer) PutFormXobjects() (map[string]int, error) {
res := make(map[string]int, 0)
tplNamesIds, err := imp.writer.PutFormXobjects(imp.reader)
if err != nil {
return nil, err
}
for tplName, pdfObjID := range tplNamesIds {
res[tplName] = pdfObjID.id
}
return res, nil
}
// GetImportedObjects gets object ids (int) and their contents ([]byte)
func (imp *Importer) GetImportedObjects() map[int][]byte {
res := make(map[int][]byte, 0)
pdfObjIDBytes := imp.writer.GetImportedObjects()
for pdfObjID, bytes := range pdfObjIDBytes {
res[pdfObjID.id] = bytes
}
return res
}