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 {