summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Montag <paul.david.montag@gmail.com>2018-12-22 18:54:08 -0600
committerKurt Jung <kurt.w.jung@gmail.com>2018-12-22 19:54:08 -0500
commita3cf901b6d1246d3e00875a3e88c69bee068156d (patch)
tree3ae6c45af72e394965ec34fc4bd519b364422786
parent55a774389a811b454a9ee3dfa78bd28fc5d0ab18 (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.go24
-rw-r--r--fpdf.go23
-rw-r--r--template.go2
3 files changed, 38 insertions, 11 deletions
diff --git a/def.go b/def.go
index 1187c8f..f19e86b 100644
--- a/def.go
+++ b/def.go
@@ -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
diff --git a/fpdf.go b/fpdf.go
index 400c83f..bc047b1 100644
--- a/fpdf.go
+++ b/fpdf.go
@@ -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 {