Golang文档转换加水印

如何在Golang中实现文档转换并添加水印功能?目前需要处理PDF、Word等常见格式的文档,希望能支持自定义水印文字或图片,同时保持转换后的文档质量。有没有推荐的库或方案?最好能提供简单的代码示例。

2 回复

推荐使用 unidoc/unioffice 库。可读取 Word/PDF 文档,添加文字或图片水印后导出。示例代码:

doc, _ := document.Open("input.docx")
wm := doc.AddWatermarkText("Confidential", fontstyle)
doc.SaveToFile("output.docx")

需注意开源库许可限制,商用需购买授权。

更多关于Golang文档转换加水印的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,为文档添加水印通常涉及处理PDF、图像或其他格式。以下是常见场景的解决方案:

1. PDF加水印

使用第三方库如github.com/unidoc/unipdf

package main

import (
    "log"
    
    "github.com/unidoc/unipdf/v3/creator"
    "github.com/unidoc/unipdf/v3/model"
)

func addWatermarkToPDF(inputPath, outputPath, watermarkText string) error {
    c := creator.New()
    
    // 读取原始PDF
    pdfReader, f, err := model.NewPdfReaderFromFile(inputPath)
    if err != nil {
        return err
    }
    defer f.Close()
    
    numPages, err := pdfReader.GetNumPages()
    if err != nil {
        return err
    }
    
    // 为每页添加水印
    for i := 1; i <= numPages; i++ {
        page, err := pdfReader.GetPage(i)
        if err != nil {
            return err
        }
        
        err = c.AddPage(page)
        if err != nil {
            return err
        }
        
        // 创建水印
        p := c.NewParagraph(watermarkText)
        p.SetPos(50, 50)
        p.SetFontSize(48)
        p.SetColor(creator.ColorRGBFromHex("#d3d3d3")) // 浅灰色
        p.SetOpacity(0.3) // 半透明
        
        c.Draw(p)
    }
    
    return c.WriteToFile(outputPath)
}

func main() {
    err := addWatermarkToPDF("input.pdf", "output.pdf", "CONFIDENTIAL")
    if err != nil {
        log.Fatal(err)
    }
}

2. 图像加水印

使用标准库image/draw和第三方库:

package main

import (
    "image"
    "image/draw"
    "image/jpeg"
    "image/png"
    "os"
    
    "golang.org/x/image/font"
    "golang.org/x/image/font/basicfont"
    "golang.org/x/image/math/fixed"
)

func addWatermarkToImage(inputPath, outputPath, watermarkText string) error {
    // 读取图像文件
    file, err := os.Open(inputPath)
    if err != nil {
        return err
    }
    defer file.Close()
    
    img, _, err := image.Decode(file)
    if err != nil {
        return err
    }
    
    // 创建带水印的新图像
    watermarked := image.NewRGBA(img.Bounds())
    draw.Draw(watermarked, img.Bounds(), img, image.Point{}, draw.Over)
    
    // 添加文字水印
    d := &font.Drawer{
        Dst:  watermarked,
        Src:  image.NewUniform(image.RGBA{255, 255, 255, 128}), // 半透明白色
        Face: basicfont.Face7x13,
        Dot:  fixed.P(50, 50), // 位置
    }
    d.DrawString(watermarkText)
    
    // 保存图像
    outFile, err := os.Create(outputPath)
    if err != nil {
        return err
    }
    defer outFile.Close()
    
    return jpeg.Encode(outFile, watermarked, nil)
}

安装依赖

go get github.com/unidoc/unipdf/v3
go get golang.org/x/image

注意事项

  1. PDF处理:UniPDF是商业库,免费版有功能限制
  2. 图像格式:根据输入格式选择合适的编码器
  3. 水印位置:可调整坐标实现不同位置的水印
  4. 透明度:通过alpha通道控制水印透明度

这些方案适用于大多数文档加水印需求,可根据具体文件格式选择合适的方法。

回到顶部