feat(优化性能): 优化字体复用与JPEG导出,精简渲染依赖
build.yaml / build (push) Successful in 37s

This commit is contained in:
xiaoqidun committed 2026-09-13 17:19:47 +08:00
1 parent 78b34713cc
commit 03048750e0
2 files changed
+28 -8

No files matched your search

+18 -5
View File
@@ -18,7 +18,6 @@ import (
"bytes"
"fmt"
"image"
"image/color"
"image/draw"
"image/jpeg"
"image/png"
@@ -476,7 +475,7 @@ func (s *Session) ExportPage(index int, value string, dpi float64) ([]byte, Expo
if renderErr != nil {
return nil, ExportFormat{}, renderErr
}
err = jpeg.Encode(&buf, imageWithWhiteBackground(img), &jpeg.Options{Quality: 95})
err = jpeg.Encode(&buf, fillWhiteBackground(img), &jpeg.Options{Quality: 95})
}
if err != nil {
return nil, ExportFormat{}, err
@@ -667,13 +666,27 @@ func (s *Session) ExportPDF() ([]byte, error) {
return buf.Bytes(), nil
}
// imageWithWhiteBackground 填充图片白色背景
// fillWhiteBackground 填充白色背景,复用当前导出图片的RGBA像素
// 入参: img 图片对象
// 返回: image.Image 图片对象
func imageWithWhiteBackground(img image.Image) image.Image {
func fillWhiteBackground(img image.Image) image.Image {
bounds := img.Bounds()
if rgba, ok := img.(*image.RGBA); ok {
for y := 0; y < bounds.Dy(); y++ {
row := rgba.Pix[y*rgba.Stride : y*rgba.Stride+bounds.Dx()*4]
for i := 0; i < len(row); i += 4 {
if alpha := 255 - row[i+3]; alpha != 0 {
row[i] += alpha
row[i+1] += alpha
row[i+2] += alpha
row[i+3] = 255
}
}
}
return rgba
}
dst := image.NewRGBA(bounds)
draw.Draw(dst, bounds, &image.Uniform{C: color.White}, image.Point{}, draw.Src)
draw.Draw(dst, bounds, image.White, image.Point{}, draw.Src)
draw.Draw(dst, bounds, img, bounds.Min, draw.Over)
return dst
}
+10 -3
View File
@@ -21,9 +21,10 @@ import (
"io"
"github.com/tdewolff/canvas"
"github.com/tdewolff/canvas/renderers"
"github.com/tdewolff/canvas/renderers/pdf"
"github.com/tdewolff/canvas/renderers/ps"
"github.com/tdewolff/canvas/renderers/rasterizer"
"github.com/tdewolff/canvas/renderers/svg"
"golang.org/x/image/draw"
"golang.org/x/image/math/f64"
)
@@ -88,7 +89,9 @@ func (r *Renderer) RenderToSVG(page *PageContent, writer io.Writer) error {
if err != nil {
return err
}
return c.Write(writer, renderers.SVG())
renderer := svg.New(writer, c.W, c.H, nil)
c.RenderTo(renderer)
return renderer.Close()
}
// replacePDFProducer 替换PDF的Producer属性
@@ -125,7 +128,11 @@ func (r *Renderer) RenderToEPS(page *PageContent, writer io.Writer) error {
if err != nil {
return err
}
return c.Write(writer, renderers.EPS())
options := ps.DefaultOptions
options.Format = ps.EncapsulatedPostScript
renderer := ps.New(writer, c.W, c.H, &options)
c.RenderTo(renderer)
return renderer.Close()
}
// RenderToMultiPagePDF 将整个文档导出为多页PDF