summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md3
-rw-r--r--def.go28
-rw-r--r--doc.go3
-rw-r--r--doc/document.md3
-rw-r--r--fpdf.go23
-rw-r--r--go.mod6
-rw-r--r--go.sum20
-rw-r--r--template.go11
-rw-r--r--template_impl.go4
9 files changed, 80 insertions, 21 deletions
diff --git a/README.md b/README.md
index 38ef38d..b402678 100644
--- a/README.md
+++ b/README.md
@@ -249,7 +249,8 @@ independently of gofpdf. Paul also added support for page boxes used in
printing PDF documents. Wojciech Matusiak added supported for word
spacing. Artem Korotkiy added support of UTF-8 fonts. Dave Barnes added
support for imported objects and templates. Brigham Thompson added
-support for rounded rectangles.
+support for rounded rectangles. Joe Westcott added underline
+functionality and optimized image storage.
## Roadmap
diff --git a/def.go b/def.go
index bff23e7..8e2bea5 100644
--- a/def.go
+++ b/def.go
@@ -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) {
diff --git a/doc.go b/doc.go
index b3721e7..16cf4ba 100644
--- a/doc.go
+++ b/doc.go
@@ -257,7 +257,8 @@ independently of gofpdf. Paul also added support for page boxes used in
printing PDF documents. Wojciech Matusiak added supported for word
spacing. Artem Korotkiy added support of UTF-8 fonts. Dave Barnes added
support for imported objects and templates. Brigham Thompson added
-support for rounded rectangles.
+support for rounded rectangles. Joe Westcott added underline
+functionality and optimized image storage.
Roadmap
diff --git a/doc/document.md b/doc/document.md
index d7d84cd..b2289ce 100644
--- a/doc/document.md
+++ b/doc/document.md
@@ -228,7 +228,8 @@ templates; this allows templates to be stored independently of gofpdf. Paul
also added support for page boxes used in printing PDF documents. Wojciech
Matusiak added supported for word spacing. Artem Korotkiy added support of
UTF-8 fonts. Dave Barnes added support for imported objects and templates.
-Brigham Thompson added support for rounded rectangles.
+Brigham Thompson added support for rounded rectangles. Joe Westcott added
+underline functionality and optimized image storage.
## Roadmap
diff --git a/fpdf.go b/fpdf.go
index 1ef2b1f..2cad2e9 100644
--- a/fpdf.go
+++ b/fpdf.go
@@ -4237,6 +4237,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 {
@@ -4265,11 +4266,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
+ }
}
}
diff --git a/go.mod b/go.mod
index 6af14f1..cbb6a8c 100644
--- a/go.mod
+++ b/go.mod
@@ -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 => ./
diff --git a/go.sum b/go.sum
index f642b76..7f20736 100644
--- a/go.sum
+++ b/go.sum
@@ -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
+ }
}