一,安装需要用到的库:
1,gopdf库的地址:
GitHub - signintech/gopdf: A simple library for generating PDF written in Go lang
2,gopdf库安装的命令:
liuhongdi@ku:~$ go get -u github.com/signintech/gopdf
3,gorm库的官网地址:
GORM - The fantastic ORM library for Golang, aims to be developer friendly.
4,gorm库安装:
liuhongdi@ku:~$ go get -u gorm.io/gorm
说明:刘宏缔的go森林是一个专注golang的博客,
网站:https://blog.imgtouch.com
原文: go语言web开发系列之二十二:用signintech/gopdf库生成带有图片和表格的pdf – 架构森林
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,地址:
GitHub - liuhongdi/digv22: 用signintech/gopdf库生成带有图片和表格的pdf
2,功能说明:
演示了生成和下载pdf,及在pdf中加入图片和表格
3,项目结构:如图:
三,用到的sql
1,建表sql
CREATE TABLE `goods` (
`goodsId` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`goodsName` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '商品名称',
`subject` varchar(200) NOT NULL DEFAULT '' COMMENT '标题',
`price` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存数量',
PRIMARY KEY (`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品表'
2,插入演示数据:
INSERT INTO `goods` (`goodsId`, `goodsName`, `subject`, `price`, `stock`) VALUES
(1, '蜂蜜牛奶手工皂', '深入滋养,肌肤细腻嫩滑', '70.00', 100),
(2, '紫光筷子筒', '紫光智护,干爽防潮更健康', '189.00', 40),
(3, '野性mini便携式蓝牙音箱', '强悍机能,品味豪迈', '499.00', 100),
(4, '乐穿梭茶具', '茶具+茶叶精美端午礼盒', '200.00', 40);
四,go代码说明
1,controller/fileController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv22/service"
"github.com/signintech/gopdf"
"log"
"strconv"
)
type FileController struct{}
func NewFileController() FileController {
return FileController{}
}
//生成一个pdf文件
func (g FileController) GetOne(c *gin.Context) {
//创建pdf
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{ PageSize: *gopdf.PageSizeA4 })
pdf.AddPage()
//设置font
err := pdf.AddTTFFont("wts11", "/data/temp/PingFang_Regular.ttf")
if err != nil {
log.Print(err.Error())
return
}
err = pdf.SetFont("wts11", "", 14)
if err != nil {
log.Print(err.Error())
return
}
pdf.SetTextColor(0x00,0x00,0xff)
//添加text内容
pdf.SetX(288)
pdf.SetY(20)
pdf.Cell(nil, "您好")
//添加图片
pdf.Image("/data/liuhongdi/digv22/static/1200.jpeg", 47, 50, &gopdf.Rect{W: 500, H: 300}) //print image
//添加表格的标题
pdf.SetX(47)
pdf.SetY(370)
alignOption := gopdf.CellOption{Align: gopdf.Center | gopdf.Middle,
Border: gopdf.Left | gopdf.Right | gopdf.Bottom | gopdf.Top,};
pdf.CellWithOption(&gopdf.Rect{
W: 500,
H: 50,
}, "旗舰店12月入库商品列表", alignOption)
//设置表格表头的字体
err = pdf.SetFont("wts11", "", 10)
pdf.SetTextColor(0xa8,0xa8,0xa8)
if err != nil {
log.Print(err.Error())
return
}
//生成表格的表头
pdf.SetX(47)
pdf.SetY(420)
pdf.CellWithOption(&gopdf.Rect{
W: 50,
H: 40,
}, "商品ID", alignOption)
pdf.SetX(97)
pdf.SetY(420)
pdf.CellWithOption(&gopdf.Rect{
W: 400,
H: 40,
}, "商品名称", alignOption)
pdf.SetX(497)
pdf.SetY(420)
pdf.CellWithOption(&gopdf.Rect{
W: 50,
H: 40,
}, "商品库存", alignOption)
//生成表格的内容
pdf.SetTextColor(0x00,0x00,0x00)
alignLeft := gopdf.CellOption{Align: gopdf.Left | gopdf.Middle,
Border: gopdf.Left | gopdf.Right | gopdf.Bottom | gopdf.Top,};
//查询数据库,用表格显示数据
//得到商品列表
goods,err := service.GetGoodsList()
//遍历商品
for i,v := range goods {
curY := 460+i*40
pdf.SetX(47)
pdf.SetY(float64(curY))
pdf.CellWithOption(&gopdf.Rect{
W: 50,
H: 40,
}, " "+strconv.FormatInt(v.GoodsId,10), alignLeft)
pdf.SetX(97)
pdf.SetY(float64(curY))
pdf.CellWithOption(&gopdf.Rect{
W: 400,
H: 40,
}, " "+v.GoodsName, alignLeft)
pdf.SetX(497)
pdf.SetY(float64(curY))
pdf.CellWithOption(&gopdf.Rect{
W: 50,
H: 40,
}, " "+string(v.Stock), alignLeft)
}
//save to file
pdf.WritePdf("/data/temp/hello.pdf")
return
}
//生成一个pdf文件并下载
func (g FileController) DownOne(c *gin.Context) {
filepath:="/data/temp/hello.pdf"
filename:="hello.pdf"
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))//fmt.Sprintf("attachment; filename=%s", filename)对下载的文件重命名
c.Writer.Header().Add("Content-Type", "text/pdf")
c.File(filepath)
return
}
2,service/goods.go
package service
import (
"github.com/liuhongdi/digv22/dao"
"github.com/liuhongdi/digv22/model"
)
//得到多件商品返回
func GetGoodsList() ([]*model.Goods,error) {
goods, err := dao.SelectAllGoods()
return goods,err
}
3,dao/goods.go
package dao
import (
"github.com/liuhongdi/digv22/global"
"github.com/liuhongdi/digv22/model"
)
func SelectAllGoods() ([]*model.Goods, error) {
var goods []*model.Goods
global.DBLink.Find(&goods)
return goods, nil
}
4,model/goods.go
package model
type Goods struct {
GoodsId int64 `gorm:"column:goodsId",json:"goodsid"` // 自增
GoodsName string `gorm:"column:goodsName",json:"goodsname"` //
Subject string `gorm:"column:subject",json:"subject"`
Price string `gorm:"column:price",json:"price"`
Stock string `gorm:"column:stock",json:"stock"`
}
func (Goods) TableName() string {
return "goods"
}
5,其他相关代码可访问github查看
五,测试效果
1,测试生成pdf,
访问:
http://127.0.0.1:8080/file/getone
2,测试下载
访问:
http://127.0.0.1:8080/file/downone
下载完成后打开查看:
六,查看库的版本:
module github.com/liuhongdi/digv22
go 1.15
require (
github.com/gin-gonic/gin v1.6.3
gorm.io/driver/mysql v1.0.1
gorm.io/gorm v1.20.6
github.com/signintech/gopdf v0.9.13
)