From f213d55fa915dfbb6ab0fbdced4eafd825e482eb Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sat, 1 Apr 2023 12:26:14 +0800 Subject: [PATCH] :art: Clean code --- kernel/model/export.go | 23 ++++++++++---- kernel/util/font.go | 68 ++++++++++++++++++++++++++++-------------- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/kernel/model/export.go b/kernel/model/export.go index 8b4e4bc04..6874adddd 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -20,7 +20,6 @@ import ( "bytes" "errors" "fmt" - "github.com/Masterminds/sprig/v3" "net/http" "net/url" "os" @@ -41,7 +40,9 @@ import ( "github.com/88250/lute/parse" "github.com/88250/lute/render" "github.com/88250/pdfcpu/pkg/api" + "github.com/88250/pdfcpu/pkg/font" "github.com/88250/pdfcpu/pkg/pdfcpu" + "github.com/Masterminds/sprig/v3" "github.com/emirpasic/gods/sets/hashset" "github.com/emirpasic/gods/stacks/linkedliststack" "github.com/imroc/req/v3" @@ -994,11 +995,23 @@ func processPDFFooter(pdfCtx *pdfcpu.Context) { } footer := buf.String() - fontName := "Times-Roman" + fontName := "Helvetica" + names := font.UserFontNames() + if 1 > len(names) { + preferredFont := util.GetPreferredFontFilePath(Conf.Lang) + if err = api.InstallFonts([]string{preferredFont.Path}); nil != err { + logging.LogErrorf("install font failed: %s", err) + } else { + names = font.UserFontNames() + logging.LogInfof("install pdf font: %s", names) + } + } + if 0 < len(names) { + fontName = names[0] + } + pos := "bc" - dx := 10 - fillCol := "#000000" - desc := fmt.Sprintf("font:%s, points:12, sc:1 abs, pos:%s, off:%d 10, fillcol:%s, rot:0", fontName, pos, dx, fillCol) + desc := fmt.Sprintf("font:%s, points:8, sc:1 abs, pos:%s, off:10 10, fillc: 0.5 0.5 0.5, rot:0", fontName, pos) footer = strings.ReplaceAll(footer, "%pages", strconv.Itoa(pdfCtx.PageCount)) m := map[int]*pdfcpu.Watermark{} for i := 1; i <= pdfCtx.PageCount; i++ { diff --git a/kernel/util/font.go b/kernel/util/font.go index d61a93977..a850d103a 100644 --- a/kernel/util/font.go +++ b/kernel/util/font.go @@ -30,9 +30,28 @@ import ( "golang.org/x/text/transform" ) +var ( + preferredFonts = []string{"Microsoft YaHei", "SimSun", "微软雅黑", "宋体", "仿宋", "Helvetica Neue", "Luxi Sans", "DejaVu Sans", "sans-serif", "Arial"} +) + +func GetPreferredFontFilePath(currentLanguage string) *Font { + fonts := loadFonts(currentLanguage) + sort.Slice(fonts, func(i, j int) bool { return len(fonts[i].Family) > len(fonts[j].Family) }) + for _, font := range fonts { + if gulu.Str.Contains(font.Family, preferredFonts) { + return font + } + } + return nil +} + func GetSysFonts(currentLanguage string) (ret []string) { fonts := loadFonts(currentLanguage) - ret = gulu.Str.RemoveDuplicatedElem(fonts) + ret = []string{} + for _, font := range fonts { + ret = append(ret, font.Family) + } + ret = gulu.Str.RemoveDuplicatedElem(ret) ret = removeUnusedFonts(ret) sort.Strings(ret) return @@ -49,47 +68,52 @@ func removeUnusedFonts(fonts []string) (ret []string) { return } -func loadFonts(currentLanguage string) (ret []string) { - ret = []string{} - for _, f := range findfont.List() { - if strings.HasSuffix(strings.ToLower(f), ".ttc") { - data, err := os.ReadFile(f) +type Font struct { + Path string + Family string +} + +func loadFonts(currentLanguage string) (ret []*Font) { + ret = []*Font{} + for _, fontPath := range findfont.List() { + if strings.HasSuffix(strings.ToLower(fontPath), ".ttc") { + data, err := os.ReadFile(fontPath) if nil != err { - logging.LogErrorf("read font file [%s] failed: %s", f, err) + logging.LogErrorf("read font file [%s] failed: %s", fontPath, err) continue } collection, err := ttc.ParseCollection(data) if nil != err { - //LogErrorf("parse font collection [%s] failed: %s", f, err) + //LogErrorf("parse font collection [%s] failed: %s", fontPath, err) continue } for i := 0; i < collection.NumFonts(); i++ { font, err := collection.Font(i) if nil != err { - //LogErrorf("get font [%s] failed: %s", f, err) + //LogErrorf("get font [%s] failed: %s", fontPath, err) continue } if family := parseFontFamily(font); "" != family { - ret = append(ret, family) - //LogInfof("[%s] [%s]", f, family) + ret = append(ret, &Font{fontPath, family}) + //LogInfof("[%s] [%s]", fontPath, family) } } - } else if strings.HasSuffix(strings.ToLower(f), ".otf") || strings.HasSuffix(strings.ToLower(f), ".ttf") { - fontFile, err := os.Open(f) + } else if strings.HasSuffix(strings.ToLower(fontPath), ".otf") || strings.HasSuffix(strings.ToLower(fontPath), ".ttf") { + fontFile, err := os.Open(fontPath) if nil != err { - //LogErrorf("open font file [%s] failed: %s", f, err) + //LogErrorf("open font file [%s] failed: %s", fontPath, err) continue } font, err := sfnt.Parse(fontFile) if nil != err { - //LogErrorf("parse font [%s] failed: %s", f, err) + //LogErrorf("parse font [%s] failed: %s", fontPath, err) continue } t, err := font.NameTable() if nil != err { - //LogErrorf("parse font name table [%s] failed: %s", f, err) + //LogErrorf("parse font name table [%s] failed: %s", fontPath, err) return } fontFile.Close() @@ -102,7 +126,7 @@ func loadFonts(currentLanguage string) (ret []string) { if sfnt.PlatformLanguageID(1033) == e.LanguageID { v, _, err := transform.Bytes(textUnicode.UTF16(textUnicode.BigEndian, textUnicode.IgnoreBOM).NewDecoder(), e.Value) if nil != err { - //LogErrorf("decode font family [%s] failed: %s", f, err) + //LogErrorf("decode font family [%s] failed: %s", fontPath, err) continue } val := string(v) @@ -119,7 +143,7 @@ func loadFonts(currentLanguage string) (ret []string) { v, _, err := transform.Bytes(textUnicode.UTF16(textUnicode.BigEndian, textUnicode.IgnoreBOM).NewDecoder(), e.Value) if nil != err { - //LogErrorf("decode font family [%s] failed: %s", f, err) + //LogErrorf("decode font family [%s] failed: %s", fontPath, err) continue } val := string(v) @@ -132,12 +156,12 @@ func loadFonts(currentLanguage string) (ret []string) { } } if "" != family && !strings.HasPrefix(family, ".") { - ret = append(ret, family) - //LogInfof("[%s] [%s]", f, family) + ret = append(ret, &Font{fontPath, family}) + //LogInfof("[%s] [%s]", fontPath, family) } if "" != familyChinese && !strings.HasPrefix(familyChinese, ".") { - ret = append(ret, familyChinese) - //LogInfof("[%s] [%s]", f, family) + ret = append(ret, &Font{fontPath, familyChinese}) + //LogInfof("[%s] [%s]", fontPath, family) } } }