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  }