diff --git a/go.mod b/go.mod index fb8ffc9..a0fe9d4 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.25.0 require ( github.com/tdewolff/canvas v0.0.0-20260708151538-b3beae08c578 github.com/tdewolff/font v0.0.0-20260527091451-1663e68cb8a4 - github.com/xiaoqidun/jbig2 v0.0.0-20260710074125-96fddd152f49 + github.com/xiaoqidun/jbig2 v0.0.0-20260714021516-ffe617d6fbc8 golang.org/x/image v0.44.0 golang.org/x/text v0.40.0 ) diff --git a/go.sum b/go.sum index cf846e4..28fc934 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ github.com/tdewolff/test v1.0.12 h1:7F21DqIajswxuche0geHdrUZRCWE4oko4b7bcmkkrxk= github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/wcharczuk/go-chart/v2 v2.1.2 h1:Y17/oYNuXwZg6TFag06qe8sBajwwsuvPiJJXcUcLL6E= github.com/wcharczuk/go-chart/v2 v2.1.2/go.mod h1:Zi4hbaqlWpYajnXB2K22IUYVXRXaLfSGNNR7P4ukyyQ= -github.com/xiaoqidun/jbig2 v0.0.0-20260710074125-96fddd152f49 h1:h/1lOG9/75eK4atpQFcm9oGXmxekMVfsPJowtYLXu5w= -github.com/xiaoqidun/jbig2 v0.0.0-20260710074125-96fddd152f49/go.mod h1:4ieZvd1EYR3zUzaAT4H8vLDb6XO+yjnxuh33So/5iC4= +github.com/xiaoqidun/jbig2 v0.0.0-20260714021516-ffe617d6fbc8 h1:HSruvQiN+t72xcn4VQyvB4GRCyX0dnu3+6k4DFnmPvM= +github.com/xiaoqidun/jbig2 v0.0.0-20260714021516-ffe617d6fbc8/go.mod h1:4ieZvd1EYR3zUzaAT4H8vLDb6XO+yjnxuh33So/5iC4= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= diff --git a/ofdgo.go b/ofdgo.go index d3f7545..56c6305 100644 --- a/ofdgo.go +++ b/ofdgo.go @@ -73,6 +73,7 @@ func NewRenderer(reader *Reader, opts ...RendererOption) *Renderer { FontMap: make(map[string]*canvas.FontFamily), fontFSCache: make(map[fontFSKey]*canvas.FontFamily), textGlyphPathCache: make(map[textGlyphPathCacheKey]textGlyphPathCacheValue), + templatePageCache: make(map[string]*PageContent), } for _, opt := range opts { opt(r) diff --git a/ofdgo_font_info.go b/ofdgo_font_info.go index b2f4996..6d404d8 100644 --- a/ofdgo_font_info.go +++ b/ofdgo_font_info.go @@ -291,6 +291,7 @@ func (r *Renderer) fontUsage(doc *Document, pages []*PageContent) map[string]int for _, tpl := range doc.CommonData.TemplatePage { page, err := r.Reader.PageContent(Page{BaseLoc: tpl.BaseLoc}) if err == nil { + r.templatePageCache[tpl.ID] = page r.countPageFonts(page, usage) } } diff --git a/ofdgo_renderer.go b/ofdgo_renderer.go index bae0c3a..d61c2ac 100644 --- a/ofdgo_renderer.go +++ b/ofdgo_renderer.go @@ -35,6 +35,7 @@ type Renderer struct { FontCIDMap map[string]map[uint16]rune fontFSCache map[fontFSKey]*canvas.FontFamily textGlyphPathCache map[textGlyphPathCacheKey]textGlyphPathCacheValue + templatePageCache map[string]*PageContent fontDirs []string fontFS []fs.FS } diff --git a/ofdgo_renderer_layer.go b/ofdgo_renderer_layer.go index cf16d61..7af7f65 100644 --- a/ofdgo_renderer_layer.go +++ b/ofdgo_renderer_layer.go @@ -38,19 +38,24 @@ func (r *Renderer) renderAnnotations(ctx *canvas.Context, pageID string, pageH f // renderTemplate 渲染模板 // 入参: ctx 画布上下文, templateID 模板ID, pageH 页面高度 func (r *Renderer) renderTemplate(ctx *canvas.Context, templateID string, pageH float64) { - var tplPage *TemplatePage - for _, tp := range r.Reader.doc.CommonData.TemplatePage { - if tp.ID == templateID { - tplPage = &tp - break + tplContent := r.templatePageCache[templateID] + if tplContent == nil { + var tplPage *TemplatePage + for i := range r.Reader.doc.CommonData.TemplatePage { + if r.Reader.doc.CommonData.TemplatePage[i].ID == templateID { + tplPage = &r.Reader.doc.CommonData.TemplatePage[i] + break + } } - } - if tplPage == nil { - return - } - tplContent, err := r.Reader.PageContent(Page{BaseLoc: tplPage.BaseLoc}) - if err != nil { - return + if tplPage == nil { + return + } + var err error + tplContent, err = r.Reader.PageContent(Page{BaseLoc: tplPage.BaseLoc}) + if err != nil { + return + } + r.templatePageCache[templateID] = tplContent } if tplContent.Content.Layer != nil { for _, layer := range tplContent.Content.Layer {