From e3aa8aba775a5043df71bf3c9f669f36404cf263 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Tue, 7 Jul 2026 21:35:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=89=8D=E7=AB=AF=E7=95=8C=E9=9D=A2):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96OFDGo=20WebUI=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/webui/webui.go | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/internal/webui/webui.go b/internal/webui/webui.go index 7883112..4575e07 100644 --- a/internal/webui/webui.go +++ b/internal/webui/webui.go @@ -41,9 +41,11 @@ type FontInfo = ofdgo.FontInfo // Session WebUI文档会话 type Session struct { - Reader *ofdgo.Reader - Renderer *ofdgo.Renderer - doc *ofdgo.Document + Reader *ofdgo.Reader + Renderer *ofdgo.Renderer + doc *ofdgo.Document + pageCache map[int]*ofdgo.PageContent + boxCache map[int]ofdgo.Box } // DocumentInfo 文档信息 @@ -146,7 +148,13 @@ func Open(data []byte, opts OpenOptions) (*Session, error) { rendererOptions = append(rendererOptions, ofdgo.WithFontFS(fontFS)) } rendererOptions = append(rendererOptions, ofdgo.WithAnnotations(opts.RenderAnnotations)) - return &Session{Reader: reader, Renderer: ofdgo.NewRenderer(reader, rendererOptions...), doc: doc}, nil + return &Session{ + Reader: reader, + Renderer: ofdgo.NewRenderer(reader, rendererOptions...), + doc: doc, + pageCache: make(map[int]*ofdgo.PageContent), + boxCache: make(map[int]ofdgo.Box), + }, nil } // Close 关闭文档会话 @@ -180,8 +188,8 @@ func (s *Session) Info() DocumentInfo { } for index, pageRef := range s.doc.Pages.Page { pageInfo := PageInfo{Index: index, ID: pageRef.ID} - if page, err := s.Reader.PageContent(pageRef); err == nil { - if box, err := s.Renderer.GetPageBox(page); err == nil { + if _, page, err := s.pageContent(index); err == nil { + if box, err := s.pageBox(index, page); err == nil { pageInfo.Width = box.W pageInfo.Height = box.H } @@ -199,7 +207,7 @@ func (s *Session) RenderPageSVG(index int) (PageSVG, error) { if err != nil { return PageSVG{}, err } - box, err := s.Renderer.GetPageBox(page) + box, err := s.pageBox(index, page) if err != nil { return PageSVG{}, err } @@ -284,9 +292,28 @@ func (s *Session) pageContent(index int) (ofdgo.Page, *ofdgo.PageContent, error) return ofdgo.Page{}, nil, fmt.Errorf("page index %d out of range", index) } pageRef := s.doc.Pages.Page[index] + if page, ok := s.pageCache[index]; ok { + return pageRef, page, nil + } page, err := s.Reader.PageContent(pageRef) if err != nil { return ofdgo.Page{}, nil, err } + s.pageCache[index] = page return pageRef, page, nil } + +// pageBox 获取页面物理区域 +// 入参: index 页面索引, page 页面内容 +// 返回: ofdgo.Box 页面物理区域, error 错误信息 +func (s *Session) pageBox(index int, page *ofdgo.PageContent) (ofdgo.Box, error) { + if box, ok := s.boxCache[index]; ok { + return box, nil + } + box, err := s.Renderer.GetPageBox(page) + if err != nil { + return ofdgo.Box{}, err + } + s.boxCache[index] = box + return box, nil +}