diff options
| -rw-r--r-- | def.go | 28 | ||||
| -rw-r--r-- | fpdf.go | 23 | ||||
| -rw-r--r-- | go.mod | 6 | ||||
| -rw-r--r-- | go.sum | 20 | ||||
| -rw-r--r-- | template.go | 11 | ||||
| -rw-r--r-- | template_impl.go | 4 | 
6 files changed, 74 insertions, 18 deletions
| @@ -165,20 +165,20 @@ func (p PointType) XY() (float64, float64) {  // Changes to this structure should be reflected in its GobEncode and GobDecode  // methods.  type ImageInfoType struct { -	data  []byte -	smask []byte -	n     int -	w     float64 -	h     float64 -	cs    string -	pal   []byte -	bpc   int -	f     string -	dp    string -	trns  []int -	scale float64 // document scaling factor -	dpi   float64 -	i     string +	data  []byte  // Raw image data +	smask []byte  // Soft Mask, an 8bit per-pixel transparency mask +	n     int     // Image object number +	w     float64 // Width +	h     float64 // Height +	cs    string  // Color space +	pal   []byte  // Image color palette +	bpc   int     // Bits Per Component +	f     string  // Image filter +	dp    string  // DecodeParms +	trns  []int   // Transparency mask +	scale float64 // Document scale factor +	dpi   float64 // Dots-per-inch found from image file (png only) +	i     string  // SHA-1 checksum of the above values.  }  func generateImageID(info *ImageInfoType) (string, error) { @@ -4215,6 +4215,7 @@ func implode(sep string, arr []int) string {  	return s.String()  } +// arrayCountValues counts the occurrences of each item in the $mp array.  func arrayCountValues(mp []int) map[int]int {  	answer := make(map[int]int)  	for _, v := range mp { @@ -4243,11 +4244,31 @@ func (f *Fpdf) putimages() {  	for key = range f.images {  		keyList = append(keyList, key)  	} + +	// Sort the keyList []string by the corresponding image's width.  	if f.catalogSort {  		sort.SliceStable(keyList, func(i, j int) bool { return f.images[keyList[i]].w < f.images[keyList[j]].w })  	} + +	// Maintain a list of inserted image SHA-1 hashes, with their +	// corresponding object ID number. +	insertedImages := map[string]int{} +  	for _, key = range keyList { -		f.putimage(f.images[key]) +		image := f.images[key] + +		// Check if this image has already been inserted using it's SHA-1 hash. +		insertedImageObjN, isFound := insertedImages[image.i] + +		// If found, skip inserting the image as a new object, and +		// use the object ID from the insertedImages map. +		// If not, insert the image into the PDF and store the object ID. +		if isFound { +			image.n = insertedImageObjN +		} else { +			f.putimage(image) +			insertedImages[image.i] = image.n +		}  	}  } @@ -4,9 +4,13 @@ go 1.12  require (  	github.com/boombuler/barcode v1.0.0 +	github.com/davecgh/go-spew v1.1.1 // indirect +	github.com/kr/pretty v0.1.0 // indirect  	github.com/phpdave11/gofpdi v1.0.7  	github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58 -	golang.org/x/image v0.0.0-20190507092727-e4e5bf290fec +	github.com/stretchr/testify v1.4.0 // indirect +	golang.org/x/image v0.0.0-20190902063713-cb417be4ba39 +	gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect  )  replace github.com/jung-kurt/gopdf => ./ @@ -2,7 +2,14 @@ github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDd  github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=  github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=  github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=  github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=  github.com/phpdave11/gofpdi v1.0.7 h1:k2oy4yhkQopCK+qW8KjCla0iU2RpDow+QUDmH9DDt44=  github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=  github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -11,8 +18,17 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb  github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=  github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58 h1:nlG4Wa5+minh3S9LVFtNoY+GVRiudA2e3EVfcCi3RCA=  github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=  github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=  github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/image v0.0.0-20190507092727-e4e5bf290fec h1:arXJwtMuk5vqI1NHX0UTnNw977rYk5Sl4jQqHj+hun4= -golang.org/x/image v0.0.0-20190507092727-e4e5bf290fec/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/image v0.0.0-20190902063713-cb417be4ba39 h1:4dQcAORh9oYBwVSBVIkP489LUPC+f1HBkTYXgmqfR+o= +golang.org/x/image v0.0.0-20190902063713-cb417be4ba39/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=  golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/template.go b/template.go index 31204c2..c0d3933 100644 --- a/template.go +++ b/template.go @@ -84,7 +84,18 @@ func (f *Fpdf) UseTemplateScaled(t Template, corner PointType, size SizeType) {  	for _, tt := range t.Templates() {  		f.templates[tt.ID()] = tt  	} + +	// Create a list of existing image SHA-1 hashes. +	existingImages := map[string]bool{} +	for _, image := range f.images { +		existingImages[image.i] = true +	} + +	// Add each template image to $f, unless already present.  	for name, ti := range t.Images() { +		if _, found := existingImages[ti.i]; found { +			continue +		}  		name = sprintf("t%s-%s", t.ID(), name)  		f.images[name] = ti  	} diff --git a/template_impl.go b/template_impl.go index c5d7be8..c1e2dff 100644 --- a/template_impl.go +++ b/template_impl.go @@ -296,4 +296,8 @@ func (t *Tpl) loadParamsFromFpdf(f *Fpdf) {  	t.Fpdf.fontSizePt = f.fontSizePt  	t.Fpdf.fontStyle = f.fontStyle  	t.Fpdf.ws = f.ws + +	for key, value := range f.images { +		t.Fpdf.images[key] = value +	}  } | 
