From bb287515d3b5c5b4ca7665a64a9224e8b6038804 Mon Sep 17 00:00:00 2001 From: Paul Montag Date: Wed, 31 Oct 2018 19:56:01 -0500 Subject: Added Ability to turn template into a byte string --- def.go | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fpdf_test.go | 20 ++++++++++-- template.go | 3 ++ template_impl.go | 59 ++++++++++++++++++++++++++++++++++ 4 files changed, 175 insertions(+), 3 deletions(-) diff --git a/def.go b/def.go index d53e627..4b19a06 100644 --- a/def.go +++ b/def.go @@ -18,6 +18,7 @@ package gofpdf import ( "bytes" + "encoding/gob" "io" "time" ) @@ -175,6 +176,101 @@ type ImageInfoType struct { dpi float64 } +func (info *ImageInfoType) GobEncode() ([]byte, error) { + w := new(bytes.Buffer) + encoder := gob.NewEncoder(w) + + err := encoder.Encode(info.data) + if err == nil { + err = encoder.Encode(info.smask) + } + if err == nil { + err = encoder.Encode(info.i) + } + if err == nil { + err = encoder.Encode(info.n) + } + if err == nil { + err = encoder.Encode(info.w) + } + if err == nil { + err = encoder.Encode(info.h) + } + if err == nil { + err = encoder.Encode(info.cs) + } + if err == nil { + err = encoder.Encode(info.pal) + } + if err == nil { + err = encoder.Encode(info.bpc) + } + if err == nil { + err = encoder.Encode(info.f) + } + if err == nil { + err = encoder.Encode(info.dp) + } + if err == nil { + err = encoder.Encode(info.trns) + } + if err == nil { + err = encoder.Encode(info.scale) + } + if err == nil { + err = encoder.Encode(info.dpi) + } + + return w.Bytes(), err +} + +func (info *ImageInfoType) GobDecode(buf []byte) error { + r := bytes.NewBuffer(buf) + decoder := gob.NewDecoder(r) + + err := decoder.Decode(&info.data) + if err == nil { + err = decoder.Decode(&info.smask) + } + if err == nil { + err = decoder.Decode(&info.i) + } + if err == nil { + err = decoder.Decode(&info.n) + } + if err == nil { + err = decoder.Decode(&info.w) + } + if err == nil { + err = decoder.Decode(&info.h) + } + if err == nil { + err = decoder.Decode(&info.cs) + } + if err == nil { + err = decoder.Decode(&info.pal) + } + if err == nil { + err = decoder.Decode(&info.bpc) + } + if err == nil { + err = decoder.Decode(&info.f) + } + if err == nil { + err = decoder.Decode(&info.dp) + } + if err == nil { + err = decoder.Decode(&info.trns) + } + if err == nil { + err = decoder.Decode(&info.scale) + } + if err == nil { + err = decoder.Decode(&info.dpi) + } + return err +} + // PointConvert returns the value of pt, expressed in points (1/72 inch), as a // value expressed in the unit of measure specified in New(). Since font // management in Fpdf uses points, this method can help with line height diff --git a/fpdf_test.go b/fpdf_test.go index 4774ec6..e212d95 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -19,6 +19,7 @@ package gofpdf_test import ( "bufio" "bytes" + "encoding/gob" "fmt" "io" "io/ioutil" @@ -1950,10 +1951,23 @@ func ExampleFpdf_CreateTemplate() { pdf.SetLineWidth(2.5) pdf.SetFont("Arial", "B", 16) + template3 := new(gofpdf.FpdfTpl) + b := new(bytes.Buffer) + enc := gob.NewEncoder(b) + + if err := enc.Encode(template); err != nil { + pdf.SetError(err) + } + + dec := gob.NewDecoder(b) + if err := dec.Decode(template3); err != nil { + pdf.SetError(err) + } + pdf.AddPage() - pdf.UseTemplate(template) - pdf.UseTemplateScaled(template, gofpdf.PointType{X: 0, Y: 30}, tplSize) - pdf.UseTemplateScaled(template, gofpdf.PointType{X: 0, Y: 60}, tplSize.ScaleBy(1.4)) + pdf.UseTemplate(template3) + pdf.UseTemplateScaled(template3, gofpdf.PointType{X: 0, Y: 30}, tplSize) + pdf.UseTemplateScaled(template3, gofpdf.PointType{X: 0, Y: 60}, tplSize.ScaleBy(1.4)) pdf.Line(40, 210, 60, 210) pdf.Text(40, 200, "Template example page 1") diff --git a/template.go b/template.go index 60b076b..2b886ed 100644 --- a/template.go +++ b/template.go @@ -18,6 +18,7 @@ package gofpdf */ import ( + "encoding/gob" "sort" ) @@ -107,6 +108,8 @@ type Template interface { Bytes() []byte Images() map[string]*ImageInfoType Templates() []Template + gob.GobDecoder + gob.GobEncoder } func (f *Fpdf) templateFontCatalog() { diff --git a/template_impl.go b/template_impl.go index 01bb040..9e5d496 100644 --- a/template_impl.go +++ b/template_impl.go @@ -1,5 +1,10 @@ package gofpdf +import ( + "bytes" + "encoding/gob" +) + /* * Copyright (c) 2015 Kurt Jung (Gmail: kurt.w.jung), * Marcus Downing, Jan Slabon (Setasign) @@ -80,6 +85,60 @@ func (t *FpdfTpl) Templates() []Template { return t.templates } +func (t *FpdfTpl) GobEncode() ([]byte, error) { + w := new(bytes.Buffer) + encoder := gob.NewEncoder(w) + + err := encoder.Encode(t.id) + if err == nil { + err = encoder.Encode(t.corner) + } + if err == nil { + err = encoder.Encode(t.size) + } + if err == nil { + err = encoder.Encode(t.bytes) + } + if err == nil { + err = encoder.Encode(t.images) + } + if err == nil { + err = encoder.Encode(t.templates) + } + + return w.Bytes(), err +} + +func (t *FpdfTpl) GobDecode(buf []byte) error { + r := bytes.NewBuffer(buf) + decoder := gob.NewDecoder(r) + + err := decoder.Decode(&t.id) + if err == nil { + err = decoder.Decode(&t.corner) + } + if err == nil { + err = decoder.Decode(&t.size) + } + if err == nil { + err = decoder.Decode(&t.bytes) + } + if err == nil { + err = decoder.Decode(&t.images) + } + if err == nil { + templates := make([]*FpdfTpl, 0) + err = decoder.Decode(&templates) + t.templates = make([]Template, len(templates)) + + for x := 0; x < len(templates); x++ { + t.templates[x] = templates[x] + } + } + + return err +} + // Tpl is an Fpdf used for writing a template. It has most of the facilities of // an Fpdf, but cannot add more pages. Tpl is used directly only during the // limited time a template is writable. -- cgit v1.2.1-24-ge1ad