diff options
| author | Paul Montag <pmontag@iseeme.com> | 2018-10-31 19:56:01 -0500 | 
|---|---|---|
| committer | Paul Montag <pmontag@iseeme.com> | 2018-10-31 19:56:01 -0500 | 
| commit | bb287515d3b5c5b4ca7665a64a9224e8b6038804 (patch) | |
| tree | 1fda5188725bdb5790afd8019b83c97b1802b3c6 | |
| parent | 6421d61dcdc4da19badab16dc2a8af331c4fbbeb (diff) | |
Added Ability to turn template into a byte string
| -rw-r--r-- | def.go | 96 | ||||
| -rw-r--r-- | fpdf_test.go | 20 | ||||
| -rw-r--r-- | template.go | 3 | ||||
| -rw-r--r-- | template_impl.go | 59 | 
4 files changed, 175 insertions, 3 deletions
| @@ -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. | 
