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
注意事项
- PDF处理:UniPDF是商业库,免费版有功能限制
- 图像格式:根据输入格式选择合适的编码器
- 水印位置:可调整坐标实现不同位置的水印
- 透明度:通过alpha通道控制水印透明度
这些方案适用于大多数文档加水印需求,可根据具体文件格式选择合适的方法。

