From 9bde9eec64737088fce987a6f5aeba5bdee44eca Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 13 Sep 2026 18:48:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=A8=E6=96=87=E6=90=9C=E7=B4=A2=E4=B8=8E?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E5=8C=B9=E9=85=8D=E6=80=A7=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DEPS=E5=AF=BC=E5=87=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=8F=8D=E9=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_font_match.go | 59 ++++++++++++++++++++-------------------- ofdgo_renderer_output.go | 9 ++++-- ofdgo_search.go | 5 +++- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/ofdgo_font_match.go b/ofdgo_font_match.go index d6215d5..a97d6b3 100644 --- a/ofdgo_font_match.go +++ b/ofdgo_font_match.go @@ -16,6 +16,7 @@ package ofdgo import ( "path" + "slices" "strings" ) @@ -35,7 +36,7 @@ const ( fontMatchFuzzy ) -var fontMatchRules = []fontMatchRule{ +var fontMatchRules = normalizeFontMatchRules([]fontMatchRule{ { Keys: []string{"小标宋", "方正小标宋", "xiaobiaosong", "fzxiaobiaosong", "fzxbs"}, Names: []string{"小标宋体", "方正小标宋简体", "FZXiaoBiaoSong-B05", "FZXiaoBiaoSong-B05S"}, @@ -109,10 +110,28 @@ var fontMatchRules = []fontMatchRule{ Files: []string{"times.ttf", "times new roman*.ttf", "times*.ttf"}, System: "Times New Roman", }, -} +}) var fontNameReplacer = strings.NewReplacer(" ", "", "-", "", "_", "", "(", "", ")", "", "(", "", ")", "") +// normalizeFontMatchRules 预处理固定字体规则的匹配名称,保留候选名称及顺序 +// 入参: rules 字体匹配规则 +// 返回: []fontMatchRule 预处理后的规则 +func normalizeFontMatchRules(rules []fontMatchRule) []fontMatchRule { + for i := range rules { + rule := &rules[i] + keys := append(append(rule.Keys, rule.Names...), rule.System) + rule.Keys = nil + for _, key := range keys { + key = fontNormalizeName(key) + if key != "" && !slices.Contains(rule.Keys, key) { + rule.Keys = append(rule.Keys, key) + } + } + } + return rules +} + // FontNormalizeName 规范化字体名称 // 入参: name 字体名称 // 返回: string 规范化后的字体名称 @@ -180,12 +199,9 @@ func fontQualifiedNames(name string) []string { continue } prefix := "" - for _, group := range [][]string{rule.Keys, rule.Names, {rule.System}} { - for _, alias := range group { - alias = fontNormalizeName(alias) - if len(alias) > len(prefix) && strings.HasPrefix(name, alias) { - prefix = alias - } + for _, alias := range rule.Keys { + if len(alias) > len(prefix) && strings.HasPrefix(name, alias) { + prefix = alias } } suffix := strings.TrimPrefix(name, prefix) @@ -351,32 +367,15 @@ func fontRuleMatchLevel(rule fontMatchRule, name string) int { return fontMatchNone } level := fontMatchNone - match := func(item string) bool { - item = fontNormalizeName(item) - if item != "" && name == item { - level = fontMatchExact - return true + for _, item := range rule.Keys { + if name == item { + return fontMatchExact } - if item != "" && (level == fontMatchNone || level > fontMatchPartial) && strings.HasPrefix(name, item) { + if strings.HasPrefix(name, item) { level = fontMatchPartial - } - if item != "" && level == fontMatchNone && strings.Contains(name, item) { + } else if level == fontMatchNone && strings.Contains(name, item) { level = fontMatchFuzzy } - return false - } - for _, item := range rule.Keys { - if match(item) { - return level - } - } - for _, item := range rule.Names { - if match(item) { - return level - } - } - if rule.System != "" { - match(rule.System) } return level } diff --git a/ofdgo_renderer_output.go b/ofdgo_renderer_output.go index 42caf8e..12d8e2a 100644 --- a/ofdgo_renderer_output.go +++ b/ofdgo_renderer_output.go @@ -15,6 +15,7 @@ package ofdgo import ( + "bufio" "bytes" "fmt" "image" @@ -130,9 +131,13 @@ func (r *Renderer) RenderToEPS(page *PageContent, writer io.Writer) error { } options := ps.DefaultOptions options.Format = ps.EncapsulatedPostScript - renderer := ps.New(writer, c.W, c.H, &options) + buffer := bufio.NewWriter(writer) + renderer := ps.New(buffer, c.W, c.H, &options) c.RenderTo(renderer) - return renderer.Close() + if err := renderer.Close(); err != nil { + return err + } + return buffer.Flush() } // RenderToMultiPagePDF 将整个文档导出为多页PDF diff --git a/ofdgo_search.go b/ofdgo_search.go index aeb49ea..37bc849 100644 --- a/ofdgo_search.go +++ b/ofdgo_search.go @@ -84,13 +84,16 @@ func (p *PageText) Search(query string) []TextMatch { length := utf8.RuneCountInString(query) for index, run := range p.Runs { text := foldText(run.Text) - runes := []rune(run.Text) + var runes []rune codeOffset := 0 for offset := 0; offset < len(text); { found := strings.Index(text[offset:], query) if found < 0 { break } + if runes == nil { + runes = []rune(run.Text) + } start := codeOffset + utf8.RuneCountInString(text[offset:offset+found]) offset += found end := start + length