feat(优化性能): 提升渲染速度
build.yaml / build (push) Successful in 33s

This commit is contained in:
2026-07-14 09:25:41 +08:00
parent 08b801d351
commit c17aae5a74
2 changed files with 51 additions and 11 deletions
+6 -4
View File
@@ -222,10 +222,6 @@ func (s *Session) Info() DocumentInfo {
PageCount: len(s.doc.Pages.Page), PageCount: len(s.doc.Pages.Page),
Pages: make([]PageInfo, 0, len(s.doc.Pages.Page)), Pages: make([]PageInfo, 0, len(s.doc.Pages.Page)),
} }
if fonts, err := s.Renderer.FontInfos(); err == nil {
info.Fonts = fonts
}
info.FontCount = len(info.Fonts)
if signatures, err := s.signatureInfos(); err == nil { if signatures, err := s.signatureInfos(); err == nil {
info.Signatures = signatures info.Signatures = signatures
} else { } else {
@@ -239,9 +235,11 @@ func (s *Session) Info() DocumentInfo {
info.CreationDate = docInfo.CreationDate info.CreationDate = docInfo.CreationDate
info.ModDate = docInfo.ModDate info.ModDate = docInfo.ModDate
} }
pages := make([]*ofdgo.PageContent, 0, len(s.doc.Pages.Page))
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.pageContent(index); err == nil { if _, page, err := s.pageContent(index); err == nil {
pages = append(pages, page)
if box, err := s.pageBox(index, 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
@@ -249,6 +247,10 @@ func (s *Session) Info() DocumentInfo {
} }
info.Pages = append(info.Pages, pageInfo) info.Pages = append(info.Pages, pageInfo)
} }
if fonts, err := s.Renderer.FontInfosFromPages(pages); err == nil {
info.Fonts = fonts
}
info.FontCount = len(info.Fonts)
return info return info
} }
+45 -7
View File
@@ -67,6 +67,30 @@ func (r *Reader) Fonts() ([]Font, error) {
// FontInfos 获取OFD字体诊断信息 // FontInfos 获取OFD字体诊断信息
// 返回: []FontInfo 字体诊断列表, error 错误信息 // 返回: []FontInfo 字体诊断列表, error 错误信息
func (r *Renderer) FontInfos() ([]FontInfo, error) { func (r *Renderer) FontInfos() ([]FontInfo, error) {
doc, err := r.fontInfoDocument()
if err != nil {
return nil, err
}
return r.fontInfos(doc, nil)
}
// FontInfosFromPages 从页面内容获取OFD字体诊断信息
// 入参: pages 页面内容列表
// 返回: []FontInfo 字体诊断列表, error 错误信息
func (r *Renderer) FontInfosFromPages(pages []*PageContent) ([]FontInfo, error) {
doc, err := r.fontInfoDocument()
if err != nil {
return nil, err
}
if pages == nil {
pages = []*PageContent{}
}
return r.fontInfos(doc, pages)
}
// fontInfoDocument 获取字体诊断文档结构
// 返回: *Document 文档结构, error 错误信息
func (r *Renderer) fontInfoDocument() (*Document, error) {
if r == nil || r.Reader == nil { if r == nil || r.Reader == nil {
return nil, fmt.Errorf("ofd renderer is not initialized") return nil, fmt.Errorf("ofd renderer is not initialized")
} }
@@ -77,11 +101,18 @@ func (r *Renderer) FontInfos() ([]FontInfo, error) {
if doc == nil { if doc == nil {
return nil, fmt.Errorf("ofd document is not opened") return nil, fmt.Errorf("ofd document is not opened")
} }
return doc, nil
}
// fontInfos 获取OFD字体诊断信息
// 入参: doc 文档结构, pages 页面内容列表
// 返回: []FontInfo 字体诊断列表, error 错误信息
func (r *Renderer) fontInfos(doc *Document, pages []*PageContent) ([]FontInfo, error) {
fonts, err := r.Reader.Fonts() fonts, err := r.Reader.Fonts()
if err != nil { if err != nil {
return nil, err return nil, err
} }
usage := r.fontUsage(doc) usage := r.fontUsage(doc, pages)
infos := make([]FontInfo, 0, len(fonts)+len(usage)) infos := make([]FontInfo, 0, len(fonts)+len(usage))
seen := make(map[string]bool) seen := make(map[string]bool)
for _, font := range fonts { for _, font := range fonts {
@@ -240,14 +271,21 @@ func fontFSMatchesStyle(fsys fs.FS, patterns []string, bold, italic bool) []stri
} }
// fontUsage 统计文档字体使用次数 // fontUsage 统计文档字体使用次数
// 入参: doc 文档结构 // 入参: doc 文档结构, pages 页面内容列表, nil表示读取文档页面
// 返回: map[string]int 字体使用次数 // 返回: map[string]int 字体使用次数
func (r *Renderer) fontUsage(doc *Document) map[string]int { func (r *Renderer) fontUsage(doc *Document, pages []*PageContent) map[string]int {
usage := make(map[string]int) usage := make(map[string]int)
for _, pageRef := range doc.Pages.Page { if pages == nil {
page, err := r.Reader.PageContent(pageRef) for _, pageRef := range doc.Pages.Page {
if err == nil { if page, err := r.Reader.PageContent(pageRef); err == nil {
r.countPageFonts(page, usage) r.countPageFonts(page, usage)
}
}
} else {
for _, page := range pages {
if page != nil {
r.countPageFonts(page, usage)
}
} }
} }
for _, tpl := range doc.CommonData.TemplatePage { for _, tpl := range doc.CommonData.TemplatePage {