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