go语言web开发系列之二十二:用signintech/gopdf库生成带有图片和表格的pdf

一,安装需要用到的库:

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
)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘你真牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值