diff options
| author | Paul Montag <paul.david.montag@gmail.com> | 2018-12-22 18:54:08 -0600 | 
|---|---|---|
| committer | Kurt Jung <kurt.w.jung@gmail.com> | 2018-12-22 19:54:08 -0500 | 
| commit | a3cf901b6d1246d3e00875a3e88c69bee068156d (patch) | |
| tree | 3ae6c45af72e394965ec34fc4bd519b364422786 | |
| parent | 55a774389a811b454a9ee3dfa78bd28fc5d0ab18 (diff) | |
Updated font id generation and image id (#222)
Generated font ID will now be the same across machines when generating
the same font file.
Generated image Id will now be the same across machines when generating
the same image file.
| -rw-r--r-- | def.go | 24 | ||||
| -rw-r--r-- | fpdf.go | 23 | ||||
| -rw-r--r-- | template.go | 2 | 
3 files changed, 38 insertions, 11 deletions
| @@ -18,7 +18,10 @@ package gofpdf  import (  	"bytes" +	"crypto/sha1"  	"encoding/gob" +	"encoding/json" +	"fmt"  	"io"  	"time"  ) @@ -164,7 +167,6 @@ func (p PointType) XY() (float64, float64) {  type ImageInfoType struct {  	data  []byte  	smask []byte -	i     int  	n     int  	w     float64  	h     float64 @@ -176,11 +178,17 @@ type ImageInfoType struct {  	trns  []int  	scale float64 // document scaling factor  	dpi   float64 +	i     string +} + +func generateImageID(info *ImageInfoType) (string, error) { +	b, err := info.GobEncode() +	return fmt.Sprintf("%x", sha1.Sum(b)), err  }  // GobEncode encodes the receiving image to a byte slice.  func (info *ImageInfoType) GobEncode() (buf []byte, err error) { -	fields := []interface{}{info.data, info.smask, info.i, info.n, info.w, info.h, info.cs, +	fields := []interface{}{info.data, info.smask, info.n, info.w, info.h, info.cs,  		info.pal, info.bpc, info.f, info.dp, info.trns, info.scale, info.dpi}  	w := new(bytes.Buffer)  	encoder := gob.NewEncoder(w) @@ -196,13 +204,15 @@ func (info *ImageInfoType) GobEncode() (buf []byte, err error) {  // GobDecode decodes the specified byte buffer (generated by GobEncode) into  // the receiving image.  func (info *ImageInfoType) GobDecode(buf []byte) (err error) { -	fields := []interface{}{&info.data, &info.smask, &info.i, &info.n, &info.w, &info.h, +	fields := []interface{}{&info.data, &info.smask, &info.n, &info.w, &info.h,  		&info.cs, &info.pal, &info.bpc, &info.f, &info.dp, &info.trns, &info.scale, &info.dpi}  	r := bytes.NewBuffer(buf)  	decoder := gob.NewDecoder(r)  	for j := 0; j < len(fields) && err == nil; j++ {  		err = decoder.Decode(fields[j])  	} + +	info.i, err = generateImageID(info)  	return  } @@ -686,6 +696,14 @@ type fontDefType struct {  	i            string       // 1-based position in font list, set by font loader, not this program  } +// generateFontID generates a font Id from the font definition +func generateFontID(fdt fontDefType) (string, error) { +	// file can be different if generated in different instance +	fdt.File = "" +	b, err := json.Marshal(&fdt) +	return fmt.Sprintf("%x", sha1.Sum(b)), err +} +  type fontInfoType struct {  	Data               []byte  	File               string @@ -23,7 +23,6 @@ package gofpdf  import (  	"bytes" -	"crypto/sha1"  	"encoding/binary"  	"encoding/json"  	"fmt" @@ -1578,9 +1577,12 @@ func (f *Fpdf) AddFontFromBytes(familyStr, styleStr string, jsonFileBytes, zFile  		return  	} -	// search existing encodings -	info.i = fmt.Sprintf("%x", sha1.Sum(jsonFileBytes)) +	if info.i, err = generateFontID(info); err != nil { +		f.err = err +		return +	} +	// search existing encodings  	if len(info.Diff) > 0 {  		n := -1 @@ -2523,7 +2525,7 @@ func (f *Fpdf) imageOut(info *ImageInfoType, x, y, w, h float64, allowNegativeX,  	}  	// dbg("h %.2f", h)  	// q 85.04 0 0 NaN 28.35 NaN cm /I2 Do Q -	f.outf("q %.5f 0 0 %.5f %.5f %.5f cm /I%d Do Q", w*f.k, h*f.k, x*f.k, (f.h-(y+h))*f.k, info.i) +	f.outf("q %.5f 0 0 %.5f %.5f %.5f cm /I%s Do Q", w*f.k, h*f.k, x*f.k, (f.h-(y+h))*f.k, info.i)  	if link > 0 || len(linkStr) > 0 {  		f.newLink(x, y, w, h, link, linkStr)  	} @@ -2660,7 +2662,10 @@ func (f *Fpdf) RegisterImageOptionsReader(imgName string, options ImageOptions,  	if f.err != nil {  		return  	} -	info.i = len(f.images) + 1 + +	if info.i, f.err = generateImageID(info); f.err != nil { +		return +	}  	f.images[imgName] = info  	return @@ -2952,8 +2957,12 @@ func (f *Fpdf) loadfont(r io.Reader) (def fontDefType) {  	err = json.Unmarshal(buf.Bytes(), &def)  	if err != nil {  		f.err = err +		return +	} + +	if def.i, err = generateFontID(def); err != nil { +		f.err = err  	} -	def.i = fmt.Sprintf("%x", sha1.Sum(buf.Bytes()))  	// dump(def)  	return  } @@ -3556,7 +3565,7 @@ func (f *Fpdf) putxobjectdict() {  		}  		for _, key = range keyList {  			image = f.images[key] -			f.outf("/I%d %d 0 R", image.i, image.n) +			f.outf("/I%s %d 0 R", image.i, image.n)  		}  	}  	{ diff --git a/template.go b/template.go index e3e4fe5..31204c2 100644 --- a/template.go +++ b/template.go @@ -178,7 +178,7 @@ func (f *Fpdf) putTemplates() {  				for _, key = range keyList {  					// for _, ti := range tImages {  					ti = tImages[key] -					f.outf("/I%d %d 0 R", ti.i, ti.n) +					f.outf("/I%s %d 0 R", ti.i, ti.n)  				}  			}  			for _, tt := range tTemplates { | 
