feat(内存占用): 优化模板复用与字体检查,减少重复解析和内存分配
build.yaml / build (push) Successful in 37s

This commit is contained in:
xiaoqidun committed 2026-09-12 02:12:32 +08:00
1 parent 89b8b183a0
commit 6f23085742
2 files changed
+31 -21

No files matched your search

+8 -4
View File
@@ -16,6 +16,7 @@ package ofdgo
import (
"fmt"
"io"
"path"
"sort"
)
@@ -157,7 +158,12 @@ func (r *Renderer) fontInfo(font Font) FontInfo {
Embedded: font.FontFile != "",
}
if info.Embedded {
if _, err := r.Reader.ResData(font.FontFile); err == nil {
file, err := r.Reader.openFile(r.Reader.ResPath(font.FontFile))
if err == nil {
_, err = io.Copy(io.Discard, file)
file.Close()
}
if err == nil {
info.Status = FontStatusEmbedded
info.Matched = path.Base(font.FontFile)
info.Detail = "使用内嵌字体文件"
@@ -202,9 +208,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
if page := r.loadTemplate(tpl.ID); page != nil {
r.countPageFonts(page, usage)
}
}
+23 -17
View File
@@ -34,30 +34,36 @@ 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) {
tplContent := r.templatePageCache[templateID]
tplContent := r.loadTemplate(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
}
var err error
tplContent, err = r.Reader.PageContent(Page{BaseLoc: tplPage.BaseLoc})
if err != nil {
return
}
r.templatePageCache[templateID] = tplContent
return
}
for order := range 3 {
r.renderLayers(ctx, tplContent.Content.Layer, pageH, order)
}
}
// loadTemplate 加载模板页面并复用解析结果
// 入参: templateID 模板ID
// 返回: *PageContent 模板页面
func (r *Renderer) loadTemplate(templateID string) *PageContent {
if page := r.templatePageCache[templateID]; page != nil {
return page
}
for _, tpl := range r.Reader.doc.CommonData.TemplatePage {
if tpl.ID != templateID {
continue
}
page, err := r.Reader.PageContent(Page{BaseLoc: tpl.BaseLoc})
if err != nil {
return nil
}
r.templatePageCache[templateID] = page
return page
}
return nil
}
// layerOrder 获取图层类型的绘制顺序
// 入参: kind 图层类型
// 返回: int 绘制顺序