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 }