如何使用Go语言中的模板函数实现PDF报表的动态生成并发送邮件?

使用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报表,并将其作为附件发送到指定邮箱。这种方法不仅提高了报表生成和发送的效率,而且大大减少了人工操作的错误率,是一种非常实用的报表生成和管理方式。

后端开发标签