Skip to content

Commit

Permalink
Refactor merge (#328)
Browse files Browse the repository at this point in the history
  • Loading branch information
johnfercher authored Oct 1, 2023
1 parent 369789c commit 1f5086d
Show file tree
Hide file tree
Showing 14 changed files with 107 additions and 84 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ always when a new page appear, in this case, a header may have many rows, lines
* With `go get`:

```bash
go get github.com/johnfercher/maroto/v2/pkg@v2.0.0-alpha.31
go get github.com/johnfercher/maroto/v2/pkg@v2.0.0-alpha.32
```


Expand Down
4 changes: 2 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

[![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)

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

* Installation with`go get`:

```bash
go get github.com/johnfercher/maroto/v2/pkg@v2.0.0-alpha.31
go get github.com/johnfercher/maroto/v2/pkg@v2.0.0-alpha.32
```

The public API was completely redesigned with the aim of enhancing the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ import (
"log"
"os"

"github.com/johnfercher/maroto/v2/pkg/components/text"
"github.com/johnfercher/maroto/v2/pkg/props"

"github.com/johnfercher/maroto/v2/pkg"
"github.com/johnfercher/maroto/v2/pkg/components/text"
"github.com/johnfercher/maroto/v2/pkg/config"
"github.com/johnfercher/maroto/v2/pkg/props"
)

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

pdf, err := os.ReadFile("docs/assets/pdf/v2.pdf")
for i := 0; i < 50; i++ {
m.AddRows(text.NewRow(20, "content"))
}

document, err := m.Generate()
if err != nil {
log.Fatal(err.Error())
}

m.AddPDFs(pdf)

for i := 0; i < 50; i++ {
m.AddRows(text.NewRow(20, "content"))
savedPdf, err := os.ReadFile("docs/assets/pdf/v2.pdf")
if err != nil {
log.Fatal(err.Error())
}

document, err := m.Generate()
err = document.Merge(savedPdf)
if err != nil {
log.Fatal(err.Error())
}

err = document.Save("docs/assets/pdf/addpdfv2.pdf")
err = document.Save("docs/assets/pdf/mergepdfv2.pdf")
if err != nil {
log.Fatal(err.Error())
}

err = document.GetReport().Save("docs/assets/text/addpdfv2.txt")
err = document.GetReport().Save("docs/assets/text/mergepdfv2.txt")
if err != nil {
log.Fatal(err.Error())
}
Expand Down
Binary file not shown.
4 changes: 0 additions & 4 deletions docs/assets/text/addpdfv2.txt

This file was deleted.

4 changes: 4 additions & 0 deletions docs/assets/text/mergepdfv2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
generate -> avg: 8.58ms, executions: [8.58ms]
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]
merge_pdf -> avg: 1.21ms, executions: [1.21ms]
file_size -> 274.55Kb
2 changes: 1 addition & 1 deletion docs/v2/features/_sidebar.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
* [← Back To Home](README.md?id=maroto-v2)
* **Features**
* [Add Page](v2/features/addpage.md?id=add-page)
* [Add PDF](v2/features/addpdf.md?id=add-pdf)
* [Background](v2/features/background.md?id=add-background)
* [Barcode](v2/features/barcode.md?id=barcode)
* [Cell Style](v2/features/cellstyle.md?id=cell-style)
Expand All @@ -17,6 +16,7 @@
* [List](v2/features/list.md?id=list)
* [Margins](v2/features/margins.md?id=custom-margins)
* [Max Grid Sum](v2/features/maxgridsum.md?id=max-grid-sum)
* [Merge PDF](v2/features/mergepdf.md?id=merge-pdf)
* [Metadatas](v2/features/metadatas.md?id=metadatas)
* [Orientation](v2/features/orientation.md?id=orientation)
* [Page Number](v2/features/pagenumber.md?id=page-number)
Expand Down
13 changes: 0 additions & 13 deletions docs/v2/features/addpdf.md

This file was deleted.

13 changes: 13 additions & 0 deletions docs/v2/features/mergepdf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Merge PDF

## Code Example
[filename](../../assets/examples/mergepdf/v2/main.go ':include :type=code')


## PDF Generated
```pdf
assets/pdf/mergepdfv2.pdf
```

## Time Execution
[filename](../../assets/text/mergepdfv2.txt ':include :type=code')
2 changes: 1 addition & 1 deletion pkg/core/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ type Maroto interface {
AddRows(rows ...Row)
AddRow(rowHeight float64, cols ...Col) Row
AddPages(pages ...Page)
AddPDFs(pdfs ...[]byte)
GetStructure() *node.Node[Structure]
Generate() (Document, error)
}
Expand All @@ -23,6 +22,7 @@ type Document interface {
GetBase64() string
Save(file string) error
GetReport() *metrics.Report
Merge([]byte) error
}

type Node interface {
Expand Down
34 changes: 34 additions & 0 deletions pkg/core/pdf.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import (
"encoding/base64"
"os"

"github.com/johnfercher/maroto/v2/pkg/merge"
"github.com/johnfercher/maroto/v2/pkg/metrics"
"github.com/johnfercher/maroto/v2/pkg/time"
)

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

func (p *pdf) Merge(bytes []byte) error {
var mergedBytes []byte
var err error

timeSpent := time.GetTimeSpent(func() {
mergedBytes, err = merge.Bytes(p.bytes, bytes)
})
if err != nil {
return err
}

timeMetric := metrics.TimeMetric{
Key: "merge_pdf",
Times: []*metrics.Time{timeSpent},
Avg: timeSpent,
}
timeMetric.Normalize()
p.report.TimeMetrics = append(p.report.TimeMetrics, timeMetric)

p.bytes = mergedBytes
p.report.SizeMetric = metrics.SizeMetric{
Key: "file_size",
Size: metrics.Size{
Value: float64(len(mergedBytes)),
Scale: metrics.Byte,
},
}
p.report.Normalize()

return nil
}

func (p *pdf) Save(file string) error {
f, err := os.Create(file)
if err != nil {
Expand Down
51 changes: 8 additions & 43 deletions pkg/maroto.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package pkg

import (
"bytes"
"errors"
"io"
"log"

"github.com/johnfercher/maroto/v2/pkg/merge"

"github.com/johnfercher/maroto/v2/pkg/core/entity"

"github.com/johnfercher/go-tree/node"
Expand All @@ -23,7 +23,6 @@ import (
"github.com/f-amaral/go-async/pool"
"github.com/johnfercher/maroto/v2/pkg/config"
"github.com/johnfercher/maroto/v2/pkg/core"
"github.com/pdfcpu/pdfcpu/pkg/api"
)

type maroto struct {
Expand All @@ -37,7 +36,6 @@ type maroto struct {
rows []core.Row
header []core.Row
footer []core.Row
pdfs [][]byte
headerHeight float64
footerHeight float64
currentHeight float64
Expand Down Expand Up @@ -148,10 +146,6 @@ func (m *maroto) GetStructure() *node.Node[core.Structure] {
return node
}

func (m *maroto) AddPDFs(pdfs ...[]byte) {
m.pdfs = append(m.pdfs, pdfs...)
}

func (m *maroto) addRows(rows ...core.Row) {
for _, row := range rows {
m.addRow(row)
Expand Down Expand Up @@ -234,24 +228,7 @@ func (m *maroto) generate() (core.Document, error) {
return nil, err
}

if len(m.pdfs) == 0 {
return core.NewPDF(documentBytes, nil), nil
}

readers := []io.ReadSeeker{}
readers = append(readers, bytes.NewReader(documentBytes))
for _, pdf := range m.pdfs {
readers = append(readers, bytes.NewReader(pdf))
}

var buf bytes.Buffer
writer := io.Writer(&buf)
err = mergePdfs(readers, writer)
if err != nil {
return nil, err
}

return core.NewPDF(buf.Bytes(), nil), nil
return core.NewPDF(documentBytes, nil), nil
}

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

readers := make([]io.ReadSeeker, len(processed.Results)+len(m.pdfs))
pdfs := make([][]byte, len(processed.Results))
for i, result := range processed.Results {
b := result.Output.([]byte)
readers[i] = bytes.NewReader(b)
bytes := result.Output.([]byte)
pdfs[i] = bytes
}

for i, pdf := range m.pdfs {
readers[i+len(processed.Results)] = bytes.NewReader(pdf)
}

var buf bytes.Buffer
writer := io.Writer(&buf)
err := mergePdfs(readers, writer)
mergedBytes, err := merge.Bytes(pdfs...)
if err != nil {
return nil, err
}

return core.NewPDF(buf.Bytes(), nil), nil
return core.NewPDF(mergedBytes, nil), nil
}

func (m *maroto) processPage(pages []core.Page) ([]byte, error) {
Expand Down Expand Up @@ -326,9 +297,3 @@ func getConfig(configs ...*entity.Config) *entity.Config {
func getProvider(cache cache.Cache, cfg *entity.Config) core.Provider {
return gofpdf.New(cfg, cache)
}

func mergePdfs(readers []io.ReadSeeker, writer io.Writer) error {
conf := api.LoadConfiguration()
conf.WriteXRefStream = false
return api.MergeRaw(readers, writer, conf)
}
30 changes: 30 additions & 0 deletions pkg/merge/merge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package merge

import (
"bytes"
"io"

"github.com/pdfcpu/pdfcpu/pkg/api"
)

func Bytes(pdfs ...[]byte) ([]byte, error) {
readers := make([]io.ReadSeeker, len(pdfs))
for i, pdf := range pdfs {
readers[i] = bytes.NewReader(pdf)
}

var buf bytes.Buffer
writer := io.Writer(&buf)
err := mergePdfs(readers, writer)
if err != nil {
return nil, err
}

return buf.Bytes(), nil
}

func mergePdfs(readers []io.ReadSeeker, writer io.Writer) error {
conf := api.LoadConfiguration()
conf.WriteXRefStream = false
return api.MergeRaw(readers, writer, conf)
}
8 changes: 0 additions & 8 deletions pkg/metricsdecorator.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ func (m *metricsDecorator) AddPages(pages ...core.Page) {
m.addPageTime = append(m.addPageTime, timeSpent)
}

func (m *metricsDecorator) AddPDFs(pdfs ...[]byte) {
timeSpent := time.GetTimeSpent(func() {
m.inner.AddPDFs(pdfs...)
})

m.addPDFTime = append(m.addPDFTime, timeSpent)
}

func (m *metricsDecorator) AddRows(rows ...core.Row) {
timeSpent := time.GetTimeSpent(func() {
m.inner.AddRows(rows...)
Expand Down

0 comments on commit 1f5086d

Please sign in to comment.