mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
This commit is contained in:
+34
-7
@@ -41,9 +41,11 @@ type FontInfo = ofdgo.FontInfo
|
|||||||
|
|
||||||
// Session WebUI文档会话
|
// Session WebUI文档会话
|
||||||
type Session struct {
|
type Session struct {
|
||||||
Reader *ofdgo.Reader
|
Reader *ofdgo.Reader
|
||||||
Renderer *ofdgo.Renderer
|
Renderer *ofdgo.Renderer
|
||||||
doc *ofdgo.Document
|
doc *ofdgo.Document
|
||||||
|
pageCache map[int]*ofdgo.PageContent
|
||||||
|
boxCache map[int]ofdgo.Box
|
||||||
}
|
}
|
||||||
|
|
||||||
// DocumentInfo 文档信息
|
// DocumentInfo 文档信息
|
||||||
@@ -146,7 +148,13 @@ func Open(data []byte, opts OpenOptions) (*Session, error) {
|
|||||||
rendererOptions = append(rendererOptions, ofdgo.WithFontFS(fontFS))
|
rendererOptions = append(rendererOptions, ofdgo.WithFontFS(fontFS))
|
||||||
}
|
}
|
||||||
rendererOptions = append(rendererOptions, ofdgo.WithAnnotations(opts.RenderAnnotations))
|
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 关闭文档会话
|
// Close 关闭文档会话
|
||||||
@@ -180,8 +188,8 @@ func (s *Session) Info() DocumentInfo {
|
|||||||
}
|
}
|
||||||
for index, pageRef := range s.doc.Pages.Page {
|
for index, pageRef := range s.doc.Pages.Page {
|
||||||
pageInfo := PageInfo{Index: index, ID: pageRef.ID}
|
pageInfo := PageInfo{Index: index, ID: pageRef.ID}
|
||||||
if page, err := s.Reader.PageContent(pageRef); err == nil {
|
if _, page, err := s.pageContent(index); err == nil {
|
||||||
if box, err := s.Renderer.GetPageBox(page); err == nil {
|
if box, err := s.pageBox(index, page); err == nil {
|
||||||
pageInfo.Width = box.W
|
pageInfo.Width = box.W
|
||||||
pageInfo.Height = box.H
|
pageInfo.Height = box.H
|
||||||
}
|
}
|
||||||
@@ -199,7 +207,7 @@ func (s *Session) RenderPageSVG(index int) (PageSVG, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return PageSVG{}, err
|
return PageSVG{}, err
|
||||||
}
|
}
|
||||||
box, err := s.Renderer.GetPageBox(page)
|
box, err := s.pageBox(index, page)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PageSVG{}, err
|
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)
|
return ofdgo.Page{}, nil, fmt.Errorf("page index %d out of range", index)
|
||||||
}
|
}
|
||||||
pageRef := s.doc.Pages.Page[index]
|
pageRef := s.doc.Pages.Page[index]
|
||||||
|
if page, ok := s.pageCache[index]; ok {
|
||||||
|
return pageRef, page, nil
|
||||||
|
}
|
||||||
page, err := s.Reader.PageContent(pageRef)
|
page, err := s.Reader.PageContent(pageRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ofdgo.Page{}, nil, err
|
return ofdgo.Page{}, nil, err
|
||||||
}
|
}
|
||||||
|
s.pageCache[index] = page
|
||||||
return pageRef, page, nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user