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 }