mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
@@ -5,7 +5,7 @@ go 1.25.0
|
|||||||
require (
|
require (
|
||||||
github.com/tdewolff/canvas v0.0.0-20260708151538-b3beae08c578
|
github.com/tdewolff/canvas v0.0.0-20260708151538-b3beae08c578
|
||||||
github.com/tdewolff/font v0.0.0-20260527091451-1663e68cb8a4
|
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/image v0.44.0
|
||||||
golang.org/x/text v0.40.0
|
golang.org/x/text v0.40.0
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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/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 h1:Y17/oYNuXwZg6TFag06qe8sBajwwsuvPiJJXcUcLL6E=
|
||||||
github.com/wcharczuk/go-chart/v2 v2.1.2/go.mod h1:Zi4hbaqlWpYajnXB2K22IUYVXRXaLfSGNNR7P4ukyyQ=
|
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-20260714021516-ffe617d6fbc8 h1:HSruvQiN+t72xcn4VQyvB4GRCyX0dnu3+6k4DFnmPvM=
|
||||||
github.com/xiaoqidun/jbig2 v0.0.0-20260710074125-96fddd152f49/go.mod h1:4ieZvd1EYR3zUzaAT4H8vLDb6XO+yjnxuh33So/5iC4=
|
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 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
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=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func NewRenderer(reader *Reader, opts ...RendererOption) *Renderer {
|
|||||||
FontMap: make(map[string]*canvas.FontFamily),
|
FontMap: make(map[string]*canvas.FontFamily),
|
||||||
fontFSCache: make(map[fontFSKey]*canvas.FontFamily),
|
fontFSCache: make(map[fontFSKey]*canvas.FontFamily),
|
||||||
textGlyphPathCache: make(map[textGlyphPathCacheKey]textGlyphPathCacheValue),
|
textGlyphPathCache: make(map[textGlyphPathCacheKey]textGlyphPathCacheValue),
|
||||||
|
templatePageCache: make(map[string]*PageContent),
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(r)
|
opt(r)
|
||||||
|
|||||||
@@ -291,6 +291,7 @@ func (r *Renderer) fontUsage(doc *Document, pages []*PageContent) map[string]int
|
|||||||
for _, tpl := range doc.CommonData.TemplatePage {
|
for _, tpl := range doc.CommonData.TemplatePage {
|
||||||
page, err := r.Reader.PageContent(Page{BaseLoc: tpl.BaseLoc})
|
page, err := r.Reader.PageContent(Page{BaseLoc: tpl.BaseLoc})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
r.templatePageCache[tpl.ID] = page
|
||||||
r.countPageFonts(page, usage)
|
r.countPageFonts(page, usage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type Renderer struct {
|
|||||||
FontCIDMap map[string]map[uint16]rune
|
FontCIDMap map[string]map[uint16]rune
|
||||||
fontFSCache map[fontFSKey]*canvas.FontFamily
|
fontFSCache map[fontFSKey]*canvas.FontFamily
|
||||||
textGlyphPathCache map[textGlyphPathCacheKey]textGlyphPathCacheValue
|
textGlyphPathCache map[textGlyphPathCacheKey]textGlyphPathCacheValue
|
||||||
|
templatePageCache map[string]*PageContent
|
||||||
fontDirs []string
|
fontDirs []string
|
||||||
fontFS []fs.FS
|
fontFS []fs.FS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,20 +38,25 @@ func (r *Renderer) renderAnnotations(ctx *canvas.Context, pageID string, pageH f
|
|||||||
// renderTemplate 渲染模板
|
// renderTemplate 渲染模板
|
||||||
// 入参: ctx 画布上下文, templateID 模板ID, pageH 页面高度
|
// 入参: ctx 画布上下文, templateID 模板ID, pageH 页面高度
|
||||||
func (r *Renderer) renderTemplate(ctx *canvas.Context, templateID string, pageH float64) {
|
func (r *Renderer) renderTemplate(ctx *canvas.Context, templateID string, pageH float64) {
|
||||||
|
tplContent := r.templatePageCache[templateID]
|
||||||
|
if tplContent == nil {
|
||||||
var tplPage *TemplatePage
|
var tplPage *TemplatePage
|
||||||
for _, tp := range r.Reader.doc.CommonData.TemplatePage {
|
for i := range r.Reader.doc.CommonData.TemplatePage {
|
||||||
if tp.ID == templateID {
|
if r.Reader.doc.CommonData.TemplatePage[i].ID == templateID {
|
||||||
tplPage = &tp
|
tplPage = &r.Reader.doc.CommonData.TemplatePage[i]
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if tplPage == nil {
|
if tplPage == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tplContent, err := r.Reader.PageContent(Page{BaseLoc: tplPage.BaseLoc})
|
var err error
|
||||||
|
tplContent, err = r.Reader.PageContent(Page{BaseLoc: tplPage.BaseLoc})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
r.templatePageCache[templateID] = tplContent
|
||||||
|
}
|
||||||
if tplContent.Content.Layer != nil {
|
if tplContent.Content.Layer != nil {
|
||||||
for _, layer := range tplContent.Content.Layer {
|
for _, layer := range tplContent.Content.Layer {
|
||||||
r.renderLayer(ctx, layer, pageH, nil, nil, 0, nil)
|
r.renderLayer(ctx, layer, pageH, nil, nil, 0, nil)
|
||||||
|
|||||||
Reference in New Issue
Block a user