summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 {