PDF添加文字及水印

1. 代码实现

package main

import (
	"bytes"
	"fmt"
	"github.com/boombuler/barcode"
	"github.com/boombuler/barcode/qr"
	"image/jpeg"
	"io/ioutil"
	"local/pdf_deal/unipdf/v3/creator"
	pdf "local/pdf_deal/unipdf/v3/model"
	"os"
)

func main() {
	ChangePdf()
}

// 示例参考地址:https://github.com/unidoc/unipdf-examples

func ChangePdf() {
	var err error
	var inputPath, outputPath string
	inputPath, outputPath = "/Users/cpenny/go/src/local/pdf_deal/123.pdf", "/Users/cpenny/go/src/local/pdf_deal/321.pdf"
	var text, password string
	text = "耗汁为止"

	inputFile, err := os.Open(inputPath)
	checkErr(err)

	defer inputFile.Close()
	var buf []byte
	buf, err = readFile(inputFile)
	checkErr(err)

	var outBuf []byte

	outBuf, err = UniGenPdf(buf, text, password)
	checkErr(err)

	of, err := os.Create(outputPath)
	checkErr(err)

	_, err = of.Write(outBuf)
	checkErr(err)

	defer of.Close()

	fmt.Printf("Complete, see output file: %s\n", outputPath)
}

func UniGenPdf(pdfBuf []byte, text, password string) ([]byte, error) {
	var err error
	var pdfReader *pdf.PdfReader
	pdfReader, err = pdf.NewPdfReader(bytes.NewReader(pdfBuf))
	if err != nil {
		return pdfBuf, err
	}
	// 判断该PDF是否加密
	var isEncrypted bool
	isEncrypted, err = pdfReader.IsEncrypted()
	if err != nil {
		return pdfBuf, err
	}

	if isEncrypted {
		// 根据密码进行解密
		_, err = pdfReader.Decrypt([]byte(password))
		if err != nil {
			return pdfBuf, err
		}
	}
	// 获取PDF总页数
	var numPages int
	numPages, err = pdfReader.GetNumPages()
	if err != nil {
		return pdfBuf, err
	}
	c := creator.New()
	// 生成二维码水印
	var imageBuf []byte
	var imageWidth, imageHeight int
	imageWidth, imageHeight = 100, 100
	imageBuf, err = generateQrPictureByte(text, imageWidth, imageHeight)
	if err != nil {
		return pdfBuf, err
	}
	var watermarkImg *creator.Image
	watermarkImg, err = c.NewImageFromData(imageBuf)
	if err != nil {
		return pdfBuf, err
	}

	for i := 1; i <= numPages; i++ {
		pageNum := i
		var page *pdf.PdfPage
		page, err = pdfReader.GetPage(pageNum)
		if err != nil {
			return pdfBuf, err
		}
		err = c.AddPage(page)
		if err != nil {
			return pdfBuf, err
		}
		// 添加文字
		// 设置图片位置及透明度
		//watermarkImg.ScaleToWidth(c.Context().PageWidth / 10)
		watermarkImg.ScaleToHeight(c.Context().PageWidth / 10)
		watermarkImg.SetPos(c.Context().Width+watermarkImg.Width()-5, 6)
		watermarkImg.SetOpacity(1)
		err = c.Draw(watermarkImg)
		if err != nil {
			return pdfBuf, err
		}

		// 添加图片
		//p := c.NewParagraph(text)
		 Change to times bold font (default is helvetica).
		//timesBold, err := pdf.NewStandard14Font("Times-Bold")
		//if err != nil {
		//	panic(err)
		//}
		//p.SetFont(timesBold)
		//p.SetPos(xPos, yPos)
		//
		//_ = c.Draw(p)
	}
	fd := bytes.NewBuffer(pdfBuf)
	err = c.Write(fd)
	if err != nil {
		return pdfBuf, err
	}
	return fd.Bytes(), err
}

// 生成二维码图片字节数组
func generateQrPictureByte(str string, width, height int) (data []byte, err error) {
	qrCode, _ := qr.Encode(str, qr.M, qr.Auto)

	qrCode, _ = barcode.Scale(qrCode, width, height)

	fd := bytes.NewBuffer(data)
	err = jpeg.Encode(fd, qrCode, nil)
	if err != nil {
		return data, err
	}
	data = fd.Bytes()
	return data, err
}

func readFile(f *os.File) (buf []byte, err error) {
	buf, err = ioutil.ReadAll(f)
	return buf, err
}

func checkErr(err error) {
	if err != nil {

		panic(err)
	}
}

2. 文件地址

myz的文件夹 > 文档资料 > pdf_deal.7z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值