v0.0.451 wpdf image processing
Some checks failed
Build Docker and Deploy / Run goext test-suite (push) Has been cancelled

This commit is contained in:
2024-05-14 12:46:49 +02:00
parent c28bc086b2
commit 246e555f3f
8 changed files with 767 additions and 7 deletions

View File

@@ -3,13 +3,19 @@ package wpdf
import (
"bytes"
"github.com/jung-kurt/gofpdf"
"gogs.mikescher.com/BlackForestBytes/goext/imageext"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"image"
"image/color"
"net/http"
)
type PDFImageRef struct {
Info *gofpdf.ImageInfoType
Name string
Info *gofpdf.ImageInfoType
Name string
Bin []byte
Image *image.Image
Mime string
}
type PDFImageRegisterOpt struct {
@@ -48,6 +54,7 @@ func (b *WPDFBuilder) RegisterImage(bin []byte, opts ...*PDFImageRegisterOpt) *P
imageType := ""
readDpi := false
allowNegativePosition := false
mime := "application/octet-stream"
for _, opt := range opts {
imageType = langext.Coalesce(opt.imageType, imageType)
@@ -61,12 +68,26 @@ func (b *WPDFBuilder) RegisterImage(bin []byte, opts ...*PDFImageRegisterOpt) *P
switch ct {
case "image/jpg":
imageType = "JPG"
mime = ct
case "image/jpeg":
imageType = "JPEG"
mime = ct
case "image/png":
imageType = "PNG"
mime = ct
case "image/gif":
imageType = "GIF"
mime = ct
}
} else {
switch imageType {
case "JPG":
case "JPEG":
mime = "image/jpeg"
case "PNG":
mime = "image/png"
case "GIF":
mime = "image/gif"
}
}
@@ -79,8 +100,11 @@ func (b *WPDFBuilder) RegisterImage(bin []byte, opts ...*PDFImageRegisterOpt) *P
info := b.b.RegisterImageOptionsReader(imgName, options, bytes.NewReader(bin))
return &PDFImageRef{
Name: imgName,
Info: info,
Name: imgName,
Info: info,
Bin: bin,
Image: nil,
Mime: mime,
}
}
@@ -95,6 +119,11 @@ type PDFImageOpt struct {
imageType *string
readDpi *bool
allowNegativePosition *bool
imageFit *imageext.ImageFit
fillColor *color.Color
compression *imageext.ImageCompresson
reEncodePixelPerMM *float64
crop *imageext.ImageCrop
}
func NewPDFImageOpt() *PDFImageOpt {
@@ -151,7 +180,40 @@ func (opt *PDFImageOpt) AllowNegativePosition(v bool) *PDFImageOpt {
return opt
}
func (opt *PDFImageOpt) ImageFit(v imageext.ImageFit) *PDFImageOpt {
opt.imageFit = &v
return opt
}
func (opt *PDFImageOpt) FillColor(v color.Color) *PDFImageOpt {
opt.fillColor = &v
return opt
}
func (opt *PDFImageOpt) Compression(v imageext.ImageCompresson) *PDFImageOpt {
opt.compression = &v
return opt
}
func (opt *PDFImageOpt) ReEncodePixelPerMM(v float64) *PDFImageOpt {
opt.reEncodePixelPerMM = &v
return opt
}
func (opt *PDFImageOpt) Crop(cropX float64, cropY float64, cropWidth float64, cropHeight float64) *PDFImageOpt {
opt.crop = &imageext.ImageCrop{
CropX: cropX,
CropY: cropY,
CropWidth: cropWidth,
CropHeight: cropHeight,
}
return opt
}
func (b *WPDFBuilder) Image(img *PDFImageRef, opts ...*PDFImageOpt) {
var err error
x := b.GetX()
y := b.GetY()
w := img.Info.Width()
@@ -162,6 +224,11 @@ func (b *WPDFBuilder) Image(img *PDFImageRef, opts ...*PDFImageOpt) {
imageType := ""
readDpi := false
allowNegativePosition := false
reEncodePixelPerMM := 15.0
var imageFit *imageext.ImageFit = nil
var fillColor color.Color = color.Transparent
compression := imageext.CompressionPNGSpeed
var crop *imageext.ImageCrop = nil
for _, opt := range opts {
x = langext.Coalesce(opt.x, x)
@@ -174,6 +241,68 @@ func (b *WPDFBuilder) Image(img *PDFImageRef, opts ...*PDFImageOpt) {
imageType = langext.Coalesce(opt.imageType, imageType)
readDpi = langext.Coalesce(opt.readDpi, readDpi)
allowNegativePosition = langext.Coalesce(opt.allowNegativePosition, allowNegativePosition)
imageFit = langext.CoalesceOpt(opt.imageFit, imageFit)
fillColor = langext.Coalesce(opt.fillColor, fillColor)
compression = langext.Coalesce(opt.compression, compression)
reEncodePixelPerMM = langext.Coalesce(opt.reEncodePixelPerMM, reEncodePixelPerMM)
crop = langext.CoalesceOpt(opt.crop, crop)
}
regName := img.Name
if imageFit != nil || fillColor != nil || crop != nil {
var dataimg image.Image
if img.Image != nil {
dataimg = *img.Image
} else {
dataimg, err = imageext.VerifyAndDecodeImage(bytes.NewReader(img.Bin), img.Mime)
if err != nil {
b.b.SetError(err)
return
}
}
if crop != nil {
dataimg, err = imageext.CropImage(dataimg, crop.CropX, crop.CropY, crop.CropWidth, crop.CropHeight)
if err != nil {
b.b.SetError(err)
return
}
}
if imageFit != nil {
pdfPixelPerMillimeter := 15.0
pxw := w * pdfPixelPerMillimeter
pxh := h * pdfPixelPerMillimeter
dataimg, err = imageext.ObjectFitImage(dataimg, pxw, pxh, *imageFit, fillColor)
if err != nil {
b.b.SetError(err)
return
}
}
bfr, imgMime, err := imageext.EncodeImage(dataimg, compression)
if err != nil {
b.b.SetError(err)
return
}
regName = regName + "_" + langext.MustRawHexUUID()
switch imgMime {
case "image/jpeg":
imageType = "JPEG"
case "image/png":
imageType = "PNG"
case "image/gif":
imageType = "GIF"
}
b.b.RegisterImageOptionsReader(regName, gofpdf.ImageOptions{ImageType: imageType}, &bfr)
}
fpdfOpt := gofpdf.ImageOptions{
@@ -182,5 +311,5 @@ func (b *WPDFBuilder) Image(img *PDFImageRef, opts ...*PDFImageOpt) {
AllowNegativePosition: allowNegativePosition,
}
b.b.ImageOptions(img.Name, x, y, w, h, flow, fpdfOpt, link, linkStr)
b.b.ImageOptions(regName, x, y, w, h, flow, fpdfOpt, link, linkStr)
}