82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
package logic
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/signintech/gopdf"
|
|
"image"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
)
|
|
|
|
// 把用户签字内容 填充到 合同模版里面
|
|
func insertSignature(templatePath string, outputPath string, signImgPath string) error {
|
|
pdf := gopdf.GoPdf{}
|
|
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4})
|
|
|
|
resp, imageErr := http.Get(signImgPath)
|
|
if imageErr != nil {
|
|
return errors.New("error downloading signature image")
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
b, _err := io.ReadAll(resp.Body)
|
|
if _err != nil {
|
|
return errors.New("error reading signature image")
|
|
}
|
|
|
|
// Create a new reader from the bytes
|
|
imgReader := bytes.NewReader(b)
|
|
img, _, err := image.DecodeConfig(imgReader)
|
|
if err != nil {
|
|
return errors.New("error decoding signature image")
|
|
}
|
|
w := img.Width
|
|
h := img.Height
|
|
|
|
// 导入模板文件中的页面
|
|
err = pdf.ImportPagesFromSource(templatePath, "/MediaBox")
|
|
if err != nil {
|
|
log.Fatalf("无法导入页面: %v", err)
|
|
}
|
|
|
|
// 获取模板文件的总页数
|
|
totalPages := pdf.GetNumberOfPages()
|
|
fmt.Printf("模板文件的总页数: %d\n", totalPages)
|
|
|
|
targetPage := totalPages
|
|
|
|
// 遍历所有页
|
|
for i := 1; i <= totalPages; i++ {
|
|
tpl := pdf.ImportPage(templatePath, i, "/MediaBox")
|
|
pdf.AddPage()
|
|
pdf.UseImportedTemplate(tpl, 0, 0, gopdf.PageSizeA4.W, gopdf.PageSizeA4.H)
|
|
// 只在目标页插入签名
|
|
if i == targetPage {
|
|
|
|
imgH1, _err := gopdf.ImageHolderByBytes(b)
|
|
if _err != nil {
|
|
//zap.L().Error("SignContract err", zap.Error(err))
|
|
return errors.New("error processing signature image")
|
|
}
|
|
newWidth := 80.0
|
|
newHeight := (newWidth / float64(w)) * float64(h)
|
|
err = pdf.ImageByHolder(imgH1, 380, 540, &gopdf.Rect{W: newWidth, H: newHeight})
|
|
if err != nil {
|
|
//zap.L().Error("SignContract err", zap.Error(err))
|
|
return errors.New("error inserting signature")
|
|
}
|
|
}
|
|
}
|
|
|
|
// 生成新的 PDF
|
|
if err = pdf.WritePdf(outputPath); err != nil {
|
|
//zap.L().Error("WritePdf err", zap.Error(err))
|
|
return errors.New("error writing final PDF")
|
|
}
|
|
|
|
return nil
|
|
}
|