github.com/signintech/pdft@v0.5.0/minigopdf/image_obj.go (about)

     1  package gopdf
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"image"
     7  	_ "image/jpeg"
     8  	_ "image/png"
     9  	"io"
    10  	"io/ioutil"
    11  	"log"
    12  	"os"
    13  )
    14  
    15  // ImageObj image object
    16  type ImageObj struct {
    17  	buffer bytes.Buffer
    18  	//imagepath string
    19  
    20  	rawImgReader  *bytes.Reader
    21  	imginfo       imgInfo
    22  	pdfProtection *PDFProtection
    23  	//getRoot func() *GoPdf
    24  }
    25  
    26  func (i *ImageObj) init(funcGetRoot func() *GoPdf) {
    27  
    28  }
    29  
    30  // SetSMaskObjID set objId of SMask
    31  func (i *ImageObj) SetSMaskObjID(objID int) {
    32  	i.imginfo.smarkObjID = objID
    33  }
    34  
    35  func (i *ImageObj) setProtection(p *PDFProtection) {
    36  	i.pdfProtection = p
    37  }
    38  
    39  func (i *ImageObj) protection() *PDFProtection {
    40  	return i.pdfProtection
    41  }
    42  
    43  func (i *ImageObj) build(objID int) error {
    44  
    45  	buff, err := buildImgProp(i.imginfo)
    46  	if err != nil {
    47  		return err
    48  	}
    49  	_, err = buff.WriteTo(&i.buffer)
    50  	if err != nil {
    51  		return err
    52  	}
    53  
    54  	i.buffer.WriteString(fmt.Sprintf("/Length %d\n>>\n", len(i.imginfo.data))) // /Length 62303>>\n
    55  	i.buffer.WriteString("stream\n")
    56  	if i.protection() != nil {
    57  		tmp, err := rc4Cip(i.protection().objectkey(objID), i.imginfo.data)
    58  		if err != nil {
    59  			return err
    60  		}
    61  		i.buffer.Write(tmp)
    62  		i.buffer.WriteString("\n")
    63  	} else {
    64  		i.buffer.Write(i.imginfo.data)
    65  	}
    66  	i.buffer.WriteString("\nendstream\n")
    67  
    68  	return nil
    69  }
    70  
    71  func (i *ImageObj) isColspaceIndexed() bool {
    72  	return isColspaceIndexed(i.imginfo)
    73  }
    74  
    75  func (i *ImageObj) haveSMask() bool {
    76  	return haveSMask(i.imginfo)
    77  }
    78  
    79  // CreateSMask Create SMask
    80  func (i *ImageObj) CreateSMask() (*SMask, error) {
    81  	if !i.haveSMask() {
    82  		return nil, nil
    83  	}
    84  	return i.createSMask()
    85  }
    86  
    87  func (i *ImageObj) createSMask() (*SMask, error) {
    88  	var smk SMask
    89  	smk.setProtection(i.protection())
    90  	smk.w = i.imginfo.w
    91  	smk.h = i.imginfo.h
    92  	smk.colspace = "DeviceGray"
    93  	smk.bitsPerComponent = "8"
    94  	smk.filter = i.imginfo.filter
    95  	smk.data = i.imginfo.smask
    96  	smk.decodeParms = fmt.Sprintf("/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns %d", i.imginfo.w)
    97  	return &smk, nil
    98  }
    99  
   100  func (i *ImageObj) createDeviceRGB() (*DeviceRGBObj, error) {
   101  	var dRGB DeviceRGBObj
   102  	dRGB.data = i.imginfo.pal
   103  	return &dRGB, nil
   104  }
   105  
   106  func (i *ImageObj) getType() string {
   107  	return "Image"
   108  }
   109  
   110  func (i *ImageObj) getObjBuff() *bytes.Buffer {
   111  	return &(i.buffer)
   112  }
   113  
   114  // SetImagePath set image path
   115  func (i *ImageObj) SetImagePath(path string) error {
   116  
   117  	file, err := os.Open(path)
   118  	if err != nil {
   119  		return err
   120  	}
   121  	defer file.Close()
   122  
   123  	err = i.SetImage(file)
   124  	if err != nil {
   125  		return err
   126  	}
   127  	return nil
   128  }
   129  
   130  // SetImage set image
   131  func (i *ImageObj) SetImage(r io.Reader) error {
   132  
   133  	data, err := ioutil.ReadAll(r)
   134  	if err != nil {
   135  		return err
   136  	}
   137  	i.rawImgReader = bytes.NewReader(data)
   138  
   139  	return nil
   140  }
   141  
   142  // GetRect get rect of img
   143  func (i *ImageObj) GetRect() *Rect {
   144  
   145  	rect, err := i.getRect()
   146  	if err != nil {
   147  		log.Fatalf("%+v", err)
   148  	}
   149  	return rect
   150  }
   151  
   152  // GetRect get rect of img
   153  func (i *ImageObj) getRect() (*Rect, error) {
   154  
   155  	i.rawImgReader.Seek(0, 0)
   156  	m, _, err := image.Decode(i.rawImgReader)
   157  	if err != nil {
   158  		return nil, err
   159  	}
   160  
   161  	imageRect := m.Bounds()
   162  	k := 1
   163  	w := -128 //init
   164  	h := -128 //init
   165  	if w < 0 {
   166  		w = -imageRect.Dx() * 72 / w / k
   167  	}
   168  	if h < 0 {
   169  		h = -imageRect.Dy() * 72 / h / k
   170  	}
   171  	if w == 0 {
   172  		w = h * imageRect.Dx() / imageRect.Dy()
   173  	}
   174  	if h == 0 {
   175  		h = w * imageRect.Dy() / imageRect.Dx()
   176  	}
   177  
   178  	var rect = new(Rect)
   179  	rect.H = float64(h)
   180  	rect.W = float64(w)
   181  
   182  	return rect, nil
   183  }
   184  
   185  func (i *ImageObj) parse() error {
   186  
   187  	i.rawImgReader.Seek(0, 0)
   188  	imginfo, err := parseImg(i.rawImgReader)
   189  	if err != nil {
   190  		return err
   191  	}
   192  	i.imginfo = imginfo
   193  
   194  	return nil
   195  }
   196  
   197  // GetObjBuff get buffer
   198  func (i *ImageObj) GetObjBuff() *bytes.Buffer {
   199  	return i.getObjBuff()
   200  }
   201  
   202  // Parse parse img
   203  func (i *ImageObj) Parse() error {
   204  	return i.parse()
   205  }
   206  
   207  // Build build buffer
   208  func (i *ImageObj) Build(objID int) error {
   209  	return i.build(objID)
   210  }