使用Go语言中的模板函数实现PDF报表的动态生成并发送邮件
随着电子商务和物流行业的快速发展,报表的生成和发送已经成为了企业运营和管理的必要工作。传统的报表制作方式需要采集数据、整理数据、制作图表、以及发送邮件等环节,令人烦恼。现在,有一种更现代化的方式,使用Go语言中的模板函数生成PDF报表,大大方便了企业运营和管理的工作。
1. 安装wkhtmltopdf工具
在使用Go语言中的模板函数生成PDF报表之前,需要先安装wkhtmltopdf工具。它是一个命令行工具,可以将HTML文档转换成PDF文件。要安装该工具,可以访问其官网:https://wkhtmltopdf.org/ 根据自己的操作系统下载对应版本的安装包并进行安装。
2. 使用Go语言中的模板函数生成PDF报表
使用Go语言中的模板函数生成PDF报表,需要使用Go语言中的第三方包实现。目前,Go语言中比较流行的第三方包有gofpdf、gopdf等。这里我们以gofpdf为例:
go get github.com/jung-kurt/gofpdf
接下来,我们可以使用以下代码实现使用Go语言中的模板函数生成PDF报表:
package main
import (
"html/template"
"os"
"github.com/jung-kurt/gofpdf"
)
type Data struct {
Title string
Content string
ImgUrl string
}
func main() {
// ...省略生成数据部分...
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
// 设置中文字体
pdf.AddUTF8Font("fzltch", "", "FZLanTingHeiS-L-GB-Regular.ttf")
pdf.SetFont("fzltch", "", 14)
// 创建pdf表格
pdf.CellFormat(180, 10, "报告标题", "0", 0, "", false, 0, "")
pdf.Ln(-1)
pdf.Ln(-1)
// 添加内容
pdf.CellFormat(180, 10, data.Title, "0", 0, "", false, 0, "")
pdf.Ln(-1)
pdf.CellFormat(180, 10, data.Content, "0", 0, "", false, 0, "")
pdf.Ln(-1)
// 添加图片
pdf.ImageOptions(data.ImgUrl, 0, 0, 0, 0, false, gofpdf.ImageOptions{ReadDpi: true}, 0, "")
// 保存文件
pdf.OutputFileAndClose("report.pdf")
}
代码解析:
使用go get命令安装gofpdf包。
创建一个Data结构体类型,用于存储数据。
在main函数中,生成需要填充模板的数据。
创建gofpdf的PDF对象,并使用AddPage方法添加一个新页面。
调用SetFont方法设置中文字体,注意这里需要使用UTF-8编码格式。
使用CellFormat方法创建PDF表格并添加内容。
使用ImageOptions方法添加图片,需要指定图片的宽度和高度。
最后使用OutputFileAndClose方法将PDF文件保存到磁盘上。
3. 发送邮件附带PDF报表
PDF报表生成之后,我们需要将其发送到指定邮箱。使用Go语言中的SMTP包很容易实现该功能:
package main
import (
"bytes"
"net/smtp"
"mime/multipart"
"log"
)
func main() {
// ...省略PDF报表生成部分...
subject := "报表标题"
body := "请查收附件。"
from := "发送方邮箱地址"
password := "发送方邮箱密码"
to := "接收方邮箱地址"
// 设置邮件主体
msg := []byte("Subject: " + subject + "\r\n" +
"MIME-Version: 1.0\r\n" +
"Content-Type: multipart/mixed; boundary=boundary" + "\r\n" +
"\r\n" +
"--boundary" + "\r\n" +
"Content-Type: text/html;charset=utf-8" + "\r\n" +
"\r\n" +
body + "\r\n" +
"--boundary" + "\r\n")
pdfFile := "report.pdf"
pdfContent, _ := ioutil.ReadFile(pdfFile)
pdf := bytes.NewReader(pdfContent)
// 添加邮件附件(PDF报表)
if pdf != nil && pdf.Len() > 0 {
w := multipart.NewWriter(&buf)
headers := make(map[string]string)
headers["Content-Type"] = "application/pdf; name=" + pdfFile
headers["Content-Disposition"] = "attachment; filename=" + pdfFile
headers["Content-Transfer-Encoding"] = "base64"
writeMultiPartMessage(w, "section", headers, pdf)
w.Close()
}
// 发送邮件
err := smtp.SendMail("服务器地址:端口号",
smtp.PlainAuth("", from, password, "服务器地址"),
from, []string{to}, msg)
if err != nil {
log.Fatalf("邮件发送失败:%s", err)
} else {
log.Printf("邮件发送成功!")
}
}
func writeMultiPartMessage(w *multipart.Writer, section string, headers map[string]string, body io.Reader) error {
partWriter, err := w.CreatePart(headers)
if err != nil {
return err
}
io.Copy(partWriter, body)
return nil
}
代码解析:
在main函数中,设置邮件主体。其中boundary用于分隔不同内容的分界线。
从磁盘上读取PDF报表文件,并使用multipart.NewWriter方法创建一个包含邮件主体和附件的消息。
使用smtp.SendMail方法发送邮件。
在writeMultiPartMessage方法中,使用CreatePart方法创建新的message部分,并使用Copy方法将其写入到新的message部分中。最后返回created part。
4. 总结
通过使用Go语言中的模板函数和SMTP包,我们可以很容易地实现动态生成PDF报表,并将其作为附件发送到指定邮箱。这种方法不仅提高了报表生成和发送的效率,而且大大减少了人工操作的错误率,是一种非常实用的报表生成和管理方式。