github.com/signintech/pdft@v0.5.0/minigopdf/image_holder.go (about) 1 package gopdf 2 3 import ( 4 "bytes" 5 "crypto/md5" 6 "fmt" 7 "io" 8 "io/ioutil" 9 ) 10 11 // ImageHolder hold image data 12 type ImageHolder interface { 13 ID() string 14 io.Reader 15 } 16 17 // ImageHolderByBytes create ImageHolder by []byte 18 func ImageHolderByBytes(b []byte) (ImageHolder, error) { 19 return newImageBuff(b) 20 } 21 22 // ImageHolderByPath create ImageHolder by image path 23 func ImageHolderByPath(path string) (ImageHolder, error) { 24 return newImageBuffByPath(path) 25 } 26 27 // ImageHolderByReader create ImageHolder by io.Reader 28 func ImageHolderByReader(r io.Reader) (ImageHolder, error) { 29 return newImageBuffByReader(r) 30 } 31 32 // imageBuff image holder (impl ImageHolder) 33 type imageBuff struct { 34 id string 35 bytes.Buffer 36 } 37 38 func newImageBuff(b []byte) (*imageBuff, error) { 39 h := md5.New() 40 _, err := h.Write(b) 41 if err != nil { 42 return nil, err 43 } 44 var i imageBuff 45 i.id = fmt.Sprintf("%x", h.Sum(nil)) 46 i.Write(b) 47 return &i, nil 48 } 49 50 func newImageBuffByPath(path string) (*imageBuff, error) { 51 var i imageBuff 52 i.id = path 53 b, err := ioutil.ReadFile(path) 54 if err != nil { 55 return nil, err 56 } 57 i.Write(b) 58 return &i, nil 59 } 60 61 func newImageBuffByReader(r io.Reader) (*imageBuff, error) { 62 63 b, err := ioutil.ReadAll(r) 64 if err != nil { 65 return nil, err 66 } 67 68 h := md5.New() 69 _, err = h.Write(b) 70 if err != nil { 71 return nil, err 72 } 73 var i imageBuff 74 i.id = fmt.Sprintf("%x", h.Sum(nil)) 75 i.Write(b) 76 return &i, nil 77 } 78 79 func (i *imageBuff) ID() string { 80 return i.id 81 }