From e2896381e2417a8ddc0042114134fac7454e23db Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Wed, 15 Jul 2026 14:23:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E7=89=87=E6=B8=B2=E6=9F=93):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA=E5=9B=BE=E7=89=87=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E7=9A=84=E5=9B=9E=E5=BD=92=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_reader.go | 9 +++++++++ ofdgo_renderer.go | 5 ++++- ofdgo_renderer_image.go | 18 ++++++++++++++++-- ofdgo_renderer_output.go | 4 +++- ofdgo_renderer_stamp.go | 4 ++++ 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ofdgo_reader.go b/ofdgo_reader.go index a42b895..284212d 100644 --- a/ofdgo_reader.go +++ b/ofdgo_reader.go @@ -38,6 +38,7 @@ type Reader struct { Stamps map[string][]Stamp Annots map[string][]Annotation fileIndex map[string]*zip.File + fileIndexFold map[string]*zip.File } // Close 关闭阅读器 @@ -53,9 +54,14 @@ func (r *Reader) Close() error { // 返回: error 错误信息 func (r *Reader) initRoot() error { r.fileIndex = make(map[string]*zip.File) + r.fileIndexFold = make(map[string]*zip.File) for _, f := range r.Zip.File { name := cleanPackagePath(f.Name) r.fileIndex[name] = f + fold := strings.ToLower(name) + if _, ok := r.fileIndexFold[fold]; !ok { + r.fileIndexFold[fold] = f + } } data, err := r.readFile("OFD.xml") if err != nil { @@ -111,6 +117,9 @@ func (r *Reader) packageFile(name string) (*zip.File, bool) { if f, ok := r.fileIndex[name]; ok { return f, true } + if f, ok := r.fileIndexFold[strings.ToLower(name)]; ok { + return f, true + } return nil, false } diff --git a/ofdgo_renderer.go b/ofdgo_renderer.go index d61c2ac..926042f 100644 --- a/ofdgo_renderer.go +++ b/ofdgo_renderer.go @@ -38,6 +38,7 @@ type Renderer struct { templatePageCache map[string]*PageContent fontDirs []string fontFS []fs.FS + decodeImages bool } // RendererOption 渲染器配置选项 @@ -168,5 +169,7 @@ func (r *Renderer) childRenderer(reader *Reader) *Renderer { if len(r.fontFS) > 0 { opts = append(opts, WithFontFS(r.fontFS...)) } - return NewRenderer(reader, opts...) + renderer := NewRenderer(reader, opts...) + renderer.decodeImages = r.decodeImages + return renderer } diff --git a/ofdgo_renderer_image.go b/ofdgo_renderer_image.go index edac8bd..37b28a1 100644 --- a/ofdgo_renderer_image.go +++ b/ofdgo_renderer_image.go @@ -88,10 +88,24 @@ func (r *Renderer) decodeImageResource(resPath string) (image.Image, error) { reader := bufio.NewReaderSize(rc, 8) header, _ := reader.Peek(8) if isJPEGData(header) { - return canvasimage.NewJPEGImage(reader) + img, err := canvasimage.NewJPEGImage(reader) + if err != nil { + return nil, err + } + if r.decodeImages { + return img.Image() + } + return img, nil } if isPNGData(header) { - return canvasimage.NewPNGImage(reader) + img, err := canvasimage.NewPNGImage(reader) + if err != nil { + return nil, err + } + if r.decodeImages { + return img.Image() + } + return img, nil } data, err := io.ReadAll(reader) if err != nil { diff --git a/ofdgo_renderer_output.go b/ofdgo_renderer_output.go index 5b5f49f..2ad0de3 100644 --- a/ofdgo_renderer_output.go +++ b/ofdgo_renderer_output.go @@ -30,7 +30,9 @@ import ( // 入参: page 页面内容 // 返回: image.Image 图像对象, error 错误信息 func (r *Renderer) RenderToImage(page *PageContent) (image.Image, error) { - c, err := r.RenderPage(page) + renderer := *r + renderer.decodeImages = true + c, err := renderer.RenderPage(page) if err != nil { return nil, err } diff --git a/ofdgo_renderer_stamp.go b/ofdgo_renderer_stamp.go index b58a304..5843871 100644 --- a/ofdgo_renderer_stamp.go +++ b/ofdgo_renderer_stamp.go @@ -63,6 +63,9 @@ func (r *Renderer) renderStamp(ctx *canvas.Context, s Stamp, pageH float64) { if len(s.Data) > 0 { img, _, err := decodeImageData(s.Data) if err == nil { + if r.decodeImages { + img = imagePixelSource(img) + } r.renderStampImage(ctx, stampImageWithTransparentWhite(img), s, pageH) return } @@ -83,6 +86,7 @@ func (r *Renderer) renderOFDStampImage(data []byte) image.Image { return nil } renderer := r.childRenderer(reader) + renderer.decodeImages = true for _, pageRef := range doc.Pages.Page { content, err := reader.PageContent(pageRef) if err != nil {