Browse Source

:sparkles: Support adding the watermark on export PDF https://github.com/siyuan-note/siyuan/issues/9961

Daniel 1 year ago
parent
commit
2ff2f1972e
3 changed files with 46 additions and 31 deletions
  1. 2 2
      kernel/api/export.go
  2. 31 29
      kernel/model/export.go
  3. 13 0
      kernel/util/rune.go

+ 2 - 2
kernel/api/export.go

@@ -528,8 +528,8 @@ func processPDF(c *gin.Context) {
 		merge = arg["merge"].(bool)
 	}
 	removeAssets := arg["removeAssets"].(bool)
-	//watermark := arg["watermark"].(bool)
-	err := model.ProcessPDF(id, path, merge, removeAssets, true)
+	watermark := arg["watermark"].(bool)
+	err := model.ProcessPDF(id, path, merge, removeAssets, watermark)
 	if nil != err {
 		ret.Code = -1
 		ret.Msg = err.Error()

+ 31 - 29
kernel/model/export.go

@@ -852,35 +852,6 @@ func processPDFWatermark(pdfCtx *pdfcpu.Context, watermark bool) {
 		return
 	}
 
-	desc := Conf.Export.PDFWatermarkDesc
-	descParts := strings.Split(desc, ",")
-	m := map[string]string{}
-	for _, descPart := range descParts {
-		kv := strings.Split(descPart, ":")
-		if 2 != len(kv) {
-			continue
-		}
-		m[kv[0]] = kv[1]
-	}
-	if "" == m["fontname"] {
-		m["fontname"] = "LXGWWenKaiLite-Regular"
-	}
-	descBuilder := bytes.Buffer{}
-	for k, v := range m {
-		descBuilder.WriteString(k)
-		descBuilder.WriteString(":")
-		descBuilder.WriteString(v)
-		descBuilder.WriteString(",")
-	}
-	desc = descBuilder.String()
-	desc = desc[:len(desc)-1]
-
-	fontPath := filepath.Join(util.AppearancePath, "fonts", "LxgwWenKai-Lite-1.311", "LXGWWenKaiLite-Regular.ttf")
-	err := api.InstallFonts([]string{fontPath})
-	if nil != err {
-		logging.LogErrorf("install font [%s] failed: %s", fontPath, err)
-	}
-
 	mode := "text"
 	if gulu.File.IsExist(str) {
 		if ".pdf" == strings.ToLower(filepath.Ext(str)) {
@@ -890,9 +861,40 @@ func processPDFWatermark(pdfCtx *pdfcpu.Context, watermark bool) {
 		}
 	}
 
+	desc := Conf.Export.PDFWatermarkDesc
+	if "text" == mode && util.ContainsCJK(str) {
+		// 中日韩文本水印需要安装字体文件
+		descParts := strings.Split(desc, ",")
+		m := map[string]string{}
+		for _, descPart := range descParts {
+			kv := strings.Split(descPart, ":")
+			if 2 != len(kv) {
+				continue
+			}
+			m[kv[0]] = kv[1]
+		}
+		m["fontname"] = "LXGWWenKaiLite-Regular"
+		descBuilder := bytes.Buffer{}
+		for k, v := range m {
+			descBuilder.WriteString(k)
+			descBuilder.WriteString(":")
+			descBuilder.WriteString(v)
+			descBuilder.WriteString(",")
+		}
+		desc = descBuilder.String()
+		desc = desc[:len(desc)-1]
+
+		fontPath := filepath.Join(util.AppearancePath, "fonts", "LxgwWenKai-Lite-1.311", "LXGWWenKaiLite-Regular.ttf")
+		err := api.InstallFonts([]string{fontPath})
+		if nil != err {
+			logging.LogErrorf("install font [%s] failed: %s", fontPath, err)
+		}
+	}
+
 	logging.LogInfof("add PDF watermark [mode=%s, str=%s, desc=%s]", mode, str, desc)
 
 	var wm *pdfcpu.Watermark
+	var err error
 	switch mode {
 	case "text":
 		wm, err = pdfcpu.ParseTextWatermarkDetails(str, desc, false, pdfcpu.POINTS)

+ 13 - 0
kernel/util/rune.go

@@ -18,10 +18,23 @@ package util
 
 import (
 	"regexp"
+	"unicode"
 
 	"github.com/88250/gulu"
 )
 
+func ContainsCJK(text string) bool {
+	for _, r := range text {
+		ret := unicode.Is(unicode.Han, r) || unicode.Is(unicode.Lm, r) ||
+			unicode.Is(unicode.Hiragana, r) || unicode.Is(unicode.Katakana, r) ||
+			unicode.Is(unicode.Hangul, r)
+		if ret {
+			return true
+		}
+	}
+	return false
+}
+
 var emojiRegex = regexp.MustCompile(`/([0-9#][\x{20E3}])|` +
 	`[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}]|` +
 	`[\x{2190}-\x{21FF}]|[\x{FE00}-\x{FEFF}]|` +