最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

go - How to make the watermark evenly cover the entire page? - Stack Overflow

programmeradmin0浏览0评论

I want to make the watermark evenly cover the entire PDF page by setting parameters such as the number of rows, columns, row spacing, column spacing, and font size. However, adjusting any of the first few parameters will cause the watermark to fail to be added or cannot evenly cover the entire page. What should I do? this is my code, how should I modify it?

func repeatWatermark(watermark string, setting map[string]string) string {
    column, row, cs, rs := mgr.parserColRow(watermark, setting)
    var sb1 strings.Builder
    for i := 0; i < column; i++ {
        sb1.WriteString(watermark)
        if i < column-1 {
            sb1.WriteString(strings.Repeat(" ", cs))
        }
    }
    sb1Str := sb1.String()
    var sb2 strings.Builder
    for i := 0; i < row; i++ {
        sb2.WriteString(sb1Str)
        if i < row-1 {
            sb2.WriteString(strings.Repeat("\n", rs))
        }
    }
    return sb2.String()
}

var FontMaps = map[string]string{
    "宋体": "SimSun",
    "微软雅黑": "MicrosoftYaHei",
}

func setWatermakr(setting map[string]string) string {
    fontName := "SimSun"
    fontSize := "20"
    fontColor := "black"
    fontOpacity := "0.3"
    fontRotation := "45"
    fontScale := "1.1"
    fontAlign := "center"
    if len(setting) != 0 {
        if setting["fontName"] != "" {
            if fn, ok := FontMaps[setting["fontName"]]; ok {
                fontName = fn
            }
        }
        if setting["fontSize"] != "" {
            fontSize = setting["fontSize"]
        }
        if setting["fontColor"] != "" {
            fontColor = setting["fontColor"]
        }
        if setting["fontOpacity"] != "" {
            fontOpacity = setting["fontOpacity"]
        }
        if setting["fontRotation"] != "" {
            fontRotation = setting["fontRotation"]
        }
        if setting["fontScale"] != "" {
            fontScale = setting["fontScale"]
        }
        if setting["fontAlign"] != "" {
            fontAlign = setting["fontAlign"]
        }
    }
    return fmt.Sprintf("fontname:%s,points:%s,color:%s,opacity:%s,rot:%s,scale:%s abs,aligntext:%s", 
        fontName, fontSize, fontColor, fontOpacity, fontRotation, fontScale, fontAlign)
}

func addWatermark(parentDir string, pdf string, watermark string, setting map[string]string) (string, error) {
    output := filepath.Join(filepath.Dir(pdf), "watermark.pdf")
    font.UserFontDir = filepath.Join(parentDir, "fonts")
    font.LoadUserFonts()
    // api.LoadConfiguration()
    // err := api.InstallFonts([]string{"simsun.ttc"})
    // if err != nil {
    //  logs.Sugar().Errorf("install font err: %v", err)
    //  return pdf, err
    // }
    fonts, err := api.ListFonts()
    if err != nil {
        logs.Sugar().Errorf("list fonts err: %v", err)
    }
    logs.Sugar().Infof("list fonts:%v", fonts)
    desc := mgr.setWatermakr(setting)
    fullWatermark := mgr.repeatWatermark(watermark, setting)
    wm, err := api.TextWatermark(fullWatermark, desc, true, true, types.POINTS)
    if err != nil {
        logs.Sugar().Errorf("TextWatermark err: %v", err)
        return pdf, err
    }
    if err := api.AddWatermarksFile(pdf, output, nil, wm, nil); err != nil {
        logs.Sugar().Errorf("AddWatermarksFile err: %v", err)
        return pdf, err
    }
    logs.Sugar().Infof("pdf %s add watermark success", pdf)
    return output, nil
}
发布评论

评论列表(0)

  1. 暂无评论