Skip to content

Commit 1f5086d

Browse files
authored
Refactor merge (#328)
1 parent 369789c commit 1f5086d

File tree

14 files changed

+107
-84
lines changed

14 files changed

+107
-84
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ always when a new page appear, in this case, a header may have many rows, lines
2828
* With `go get`:
2929

3030
```bash
31-
go get github.com/johnfercher/maroto/v2/[email protected].31
31+
go get github.com/johnfercher/maroto/v2/[email protected].32
3232
```
3333

3434

docs/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go#template-engines) [![Branch](https://img.shields.io/badge/V2-Branch-pink)](https://github.com/johnfercher/maroto/tree/v2) [![Roadmap](https://img.shields.io/badge/V2-Roadmap-purple)](https://github.com/users/johnfercher/projects/1) [![Discussion](https://img.shields.io/badge/V2-Discussion-blue)](https://github.com/johnfercher/maroto/issues/257) [![Release Notes](https://img.shields.io/badge/Release-Notes-cyan)](https://github.com/johnfercher/maroto/releases) [![Visits Badge](https://badges.pufler.dev/visits/johnfercher/maroto)](https://badges.pufler.dev)
44

5-
#### Maroto`v2.0.0-alpha.31`is here! Try out:
5+
#### Maroto`v2.0.0-alpha.32`is here! Try out:
66

77
* Installation with`go get`:
88

99
```bash
10-
go get github.com/johnfercher/maroto/v2/[email protected].31
10+
go get github.com/johnfercher/maroto/v2/[email protected].32
1111
```
1212

1313
The public API was completely redesigned with the aim of enhancing the

docs/assets/examples/addpdf/v2/main.go renamed to docs/assets/examples/mergepdf/v2/main.go

+13-11
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import (
44
"log"
55
"os"
66

7-
"github.com/johnfercher/maroto/v2/pkg/components/text"
8-
"github.com/johnfercher/maroto/v2/pkg/props"
9-
107
"github.com/johnfercher/maroto/v2/pkg"
8+
"github.com/johnfercher/maroto/v2/pkg/components/text"
119
"github.com/johnfercher/maroto/v2/pkg/config"
10+
"github.com/johnfercher/maroto/v2/pkg/props"
1211
)
1312

1413
var dummyText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ac condimentum sem."
@@ -21,28 +20,31 @@ func main() {
2120
mrt := pkg.NewMaroto(cfg)
2221
m := pkg.NewMetricsDecorator(mrt)
2322

24-
pdf, err := os.ReadFile("docs/assets/pdf/v2.pdf")
23+
for i := 0; i < 50; i++ {
24+
m.AddRows(text.NewRow(20, "content"))
25+
}
26+
27+
document, err := m.Generate()
2528
if err != nil {
2629
log.Fatal(err.Error())
2730
}
2831

29-
m.AddPDFs(pdf)
30-
31-
for i := 0; i < 50; i++ {
32-
m.AddRows(text.NewRow(20, "content"))
32+
savedPdf, err := os.ReadFile("docs/assets/pdf/v2.pdf")
33+
if err != nil {
34+
log.Fatal(err.Error())
3335
}
3436

35-
document, err := m.Generate()
37+
err = document.Merge(savedPdf)
3638
if err != nil {
3739
log.Fatal(err.Error())
3840
}
3941

40-
err = document.Save("docs/assets/pdf/addpdfv2.pdf")
42+
err = document.Save("docs/assets/pdf/mergepdfv2.pdf")
4143
if err != nil {
4244
log.Fatal(err.Error())
4345
}
4446

45-
err = document.GetReport().Save("docs/assets/text/addpdfv2.txt")
47+
err = document.GetReport().Save("docs/assets/text/mergepdfv2.txt")
4648
if err != nil {
4749
log.Fatal(err.Error())
4850
}
Binary file not shown.

docs/assets/text/addpdfv2.txt

-4
This file was deleted.

docs/assets/text/mergepdfv2.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
generate -> avg: 8.58ms, executions: [8.58ms]
2+
add_row -> avg: 86.64ns, executions: [0.24μs, 0.09μs, 0.07μs, 0.03μs, 0.08μs, 0.02μs, 0.02μs, 0.02μs, 0.08μs, 0.02μs, 0.02μs, 0.02μs, 0.03μs, 2.07μs, 0.07μs, 0.06μs, 0.01μs, 0.06μs, 0.02μs, 0.02μs, 0.02μs, 0.06μs, 0.02μs, 0.02μs, 0.02μs, 0.02μs, 0.29μs, 0.05μs, 0.05μs, 0.02μs, 0.06μs, 0.02μs, 0.02μs, 0.02μs, 0.06μs, 0.02μs, 0.02μs, 0.01μs, 0.01μs, 0.21μs, 0.04μs, 0.06μs, 0.02μs, 0.06μs, 0.02μs, 0.01μs, 0.02μs, 0.05μs, 0.02μs, 0.02μs]
3+
merge_pdf -> avg: 1.21ms, executions: [1.21ms]
4+
file_size -> 274.55Kb

docs/v2/features/_sidebar.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
* [← Back To Home](README.md?id=maroto-v2)
22
* **Features**
33
* [Add Page](v2/features/addpage.md?id=add-page)
4-
* [Add PDF](v2/features/addpdf.md?id=add-pdf)
54
* [Background](v2/features/background.md?id=add-background)
65
* [Barcode](v2/features/barcode.md?id=barcode)
76
* [Cell Style](v2/features/cellstyle.md?id=cell-style)
@@ -17,6 +16,7 @@
1716
* [List](v2/features/list.md?id=list)
1817
* [Margins](v2/features/margins.md?id=custom-margins)
1918
* [Max Grid Sum](v2/features/maxgridsum.md?id=max-grid-sum)
19+
* [Merge PDF](v2/features/mergepdf.md?id=merge-pdf)
2020
* [Metadatas](v2/features/metadatas.md?id=metadatas)
2121
* [Orientation](v2/features/orientation.md?id=orientation)
2222
* [Page Number](v2/features/pagenumber.md?id=page-number)

docs/v2/features/addpdf.md

-13
This file was deleted.

docs/v2/features/mergepdf.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Merge PDF
2+
3+
## Code Example
4+
[filename](../../assets/examples/mergepdf/v2/main.go ':include :type=code')
5+
6+
7+
## PDF Generated
8+
```pdf
9+
assets/pdf/mergepdfv2.pdf
10+
```
11+
12+
## Time Execution
13+
[filename](../../assets/text/mergepdfv2.txt ':include :type=code')

pkg/core/core.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ type Maroto interface {
1313
AddRows(rows ...Row)
1414
AddRow(rowHeight float64, cols ...Col) Row
1515
AddPages(pages ...Page)
16-
AddPDFs(pdfs ...[]byte)
1716
GetStructure() *node.Node[Structure]
1817
Generate() (Document, error)
1918
}
@@ -23,6 +22,7 @@ type Document interface {
2322
GetBase64() string
2423
Save(file string) error
2524
GetReport() *metrics.Report
25+
Merge([]byte) error
2626
}
2727

2828
type Node interface {

pkg/core/pdf.go

+34
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"encoding/base64"
55
"os"
66

7+
"github.com/johnfercher/maroto/v2/pkg/merge"
78
"github.com/johnfercher/maroto/v2/pkg/metrics"
9+
"github.com/johnfercher/maroto/v2/pkg/time"
810
)
911

1012
type pdf struct {
@@ -31,6 +33,38 @@ func (p *pdf) GetReport() *metrics.Report {
3133
return p.report
3234
}
3335

36+
func (p *pdf) Merge(bytes []byte) error {
37+
var mergedBytes []byte
38+
var err error
39+
40+
timeSpent := time.GetTimeSpent(func() {
41+
mergedBytes, err = merge.Bytes(p.bytes, bytes)
42+
})
43+
if err != nil {
44+
return err
45+
}
46+
47+
timeMetric := metrics.TimeMetric{
48+
Key: "merge_pdf",
49+
Times: []*metrics.Time{timeSpent},
50+
Avg: timeSpent,
51+
}
52+
timeMetric.Normalize()
53+
p.report.TimeMetrics = append(p.report.TimeMetrics, timeMetric)
54+
55+
p.bytes = mergedBytes
56+
p.report.SizeMetric = metrics.SizeMetric{
57+
Key: "file_size",
58+
Size: metrics.Size{
59+
Value: float64(len(mergedBytes)),
60+
Scale: metrics.Byte,
61+
},
62+
}
63+
p.report.Normalize()
64+
65+
return nil
66+
}
67+
3468
func (p *pdf) Save(file string) error {
3569
f, err := os.Create(file)
3670
if err != nil {

pkg/maroto.go

+8-43
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package pkg
22

33
import (
4-
"bytes"
54
"errors"
6-
"io"
75
"log"
86

7+
"github.com/johnfercher/maroto/v2/pkg/merge"
8+
99
"github.com/johnfercher/maroto/v2/pkg/core/entity"
1010

1111
"github.com/johnfercher/go-tree/node"
@@ -23,7 +23,6 @@ import (
2323
"github.com/f-amaral/go-async/pool"
2424
"github.com/johnfercher/maroto/v2/pkg/config"
2525
"github.com/johnfercher/maroto/v2/pkg/core"
26-
"github.com/pdfcpu/pdfcpu/pkg/api"
2726
)
2827

2928
type maroto struct {
@@ -37,7 +36,6 @@ type maroto struct {
3736
rows []core.Row
3837
header []core.Row
3938
footer []core.Row
40-
pdfs [][]byte
4139
headerHeight float64
4240
footerHeight float64
4341
currentHeight float64
@@ -148,10 +146,6 @@ func (m *maroto) GetStructure() *node.Node[core.Structure] {
148146
return node
149147
}
150148

151-
func (m *maroto) AddPDFs(pdfs ...[]byte) {
152-
m.pdfs = append(m.pdfs, pdfs...)
153-
}
154-
155149
func (m *maroto) addRows(rows ...core.Row) {
156150
for _, row := range rows {
157151
m.addRow(row)
@@ -234,24 +228,7 @@ func (m *maroto) generate() (core.Document, error) {
234228
return nil, err
235229
}
236230

237-
if len(m.pdfs) == 0 {
238-
return core.NewPDF(documentBytes, nil), nil
239-
}
240-
241-
readers := []io.ReadSeeker{}
242-
readers = append(readers, bytes.NewReader(documentBytes))
243-
for _, pdf := range m.pdfs {
244-
readers = append(readers, bytes.NewReader(pdf))
245-
}
246-
247-
var buf bytes.Buffer
248-
writer := io.Writer(&buf)
249-
err = mergePdfs(readers, writer)
250-
if err != nil {
251-
return nil, err
252-
}
253-
254-
return core.NewPDF(buf.Bytes(), nil), nil
231+
return core.NewPDF(documentBytes, nil), nil
255232
}
256233

257234
func (m *maroto) generateConcurrently() (core.Document, error) {
@@ -275,24 +252,18 @@ func (m *maroto) generateConcurrently() (core.Document, error) {
275252
log.Fatal("error on generating pages")
276253
}
277254

278-
readers := make([]io.ReadSeeker, len(processed.Results)+len(m.pdfs))
255+
pdfs := make([][]byte, len(processed.Results))
279256
for i, result := range processed.Results {
280-
b := result.Output.([]byte)
281-
readers[i] = bytes.NewReader(b)
257+
bytes := result.Output.([]byte)
258+
pdfs[i] = bytes
282259
}
283260

284-
for i, pdf := range m.pdfs {
285-
readers[i+len(processed.Results)] = bytes.NewReader(pdf)
286-
}
287-
288-
var buf bytes.Buffer
289-
writer := io.Writer(&buf)
290-
err := mergePdfs(readers, writer)
261+
mergedBytes, err := merge.Bytes(pdfs...)
291262
if err != nil {
292263
return nil, err
293264
}
294265

295-
return core.NewPDF(buf.Bytes(), nil), nil
266+
return core.NewPDF(mergedBytes, nil), nil
296267
}
297268

298269
func (m *maroto) processPage(pages []core.Page) ([]byte, error) {
@@ -326,9 +297,3 @@ func getConfig(configs ...*entity.Config) *entity.Config {
326297
func getProvider(cache cache.Cache, cfg *entity.Config) core.Provider {
327298
return gofpdf.New(cfg, cache)
328299
}
329-
330-
func mergePdfs(readers []io.ReadSeeker, writer io.Writer) error {
331-
conf := api.LoadConfiguration()
332-
conf.WriteXRefStream = false
333-
return api.MergeRaw(readers, writer, conf)
334-
}

pkg/merge/merge.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package merge
2+
3+
import (
4+
"bytes"
5+
"io"
6+
7+
"github.com/pdfcpu/pdfcpu/pkg/api"
8+
)
9+
10+
func Bytes(pdfs ...[]byte) ([]byte, error) {
11+
readers := make([]io.ReadSeeker, len(pdfs))
12+
for i, pdf := range pdfs {
13+
readers[i] = bytes.NewReader(pdf)
14+
}
15+
16+
var buf bytes.Buffer
17+
writer := io.Writer(&buf)
18+
err := mergePdfs(readers, writer)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
return buf.Bytes(), nil
24+
}
25+
26+
func mergePdfs(readers []io.ReadSeeker, writer io.Writer) error {
27+
conf := api.LoadConfiguration()
28+
conf.WriteXRefStream = false
29+
return api.MergeRaw(readers, writer, conf)
30+
}

pkg/metricsdecorator.go

-8
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,6 @@ func (m *metricsDecorator) AddPages(pages ...core.Page) {
5353
m.addPageTime = append(m.addPageTime, timeSpent)
5454
}
5555

56-
func (m *metricsDecorator) AddPDFs(pdfs ...[]byte) {
57-
timeSpent := time.GetTimeSpent(func() {
58-
m.inner.AddPDFs(pdfs...)
59-
})
60-
61-
m.addPDFTime = append(m.addPDFTime, timeSpent)
62-
}
63-
6456
func (m *metricsDecorator) AddRows(rows ...core.Row) {
6557
timeSpent := time.GetTimeSpent(func() {
6658
m.inner.AddRows(rows...)

0 commit comments

Comments
 (0)