pdf库和图表库介绍
  1. pdf库: github.com/jung-kurt/gofpdf
  2. 图表库: github.com/wcharczuk/go-chart
最小pdf的官方示例
// 初始化一个pdf
// param1: P/L 横屏或者竖屏
// param2: mm, cm ... 间距单位,一般是mm
// param3: A4,A3,A5 纸张大小
// param4: 特定的字体样式
pdf := gofpdf.New("P", "mm", "A4", "")
// 添加新的空白页,在写入内容之前,一定要添加一个空白页
pdf.AddPage()
// 设置特定的字体,如果是中文字体的话,需要使用其它方法,下面介绍
// param1: 字体样式名称,可以引入自己下载的
// param2: 字体样式,B,I,U,S,分别是粗体,斜体,下划线,删除线,或者其它
// param3: 字体大小
pdf.SetFont("Arial", "B", 16)
// 新建一个表格单元,也就是一块区域,可以理解为一行
// param1: 单元格宽,这里40表示40mm,与new里面的单位有关
// param2: 单元格高
// param3: 显示的内容
// 实际例子中使用的是pdf.CellFormat() 这个api,可以在一行画多个单元格
pdf.Cell(40, 10, "Hello, world")
err := pdf.OutputFileAndClose("hello.pdf")

运行上面的代码实际上就能生成一个hello.pdf,里面内容也是只有一句话,helloworld.

  1. 创建pdf的流程要经过new()方法产生一个pdf对象,后面所有的操作都使用这个pdf对象
  2. 使用AddPage()添加一下新的空白页,后续的操作都将发生在这个空白页上,换页也是使用这个操作
  3. SetFont()设置下面的字体样式,大小.可以set多次,后面的字体已最后一次设置的为准
  4. CellFormat()/Cell() 相当于是开辟一块空间,可以在这块空间上面写字,贴图等,在调用这个方法之前,上面的字体必须要进行一次初始化.
pdf其它常用api介绍
  1. AddUTF8Font(familyStr, styleStr, fileStr string)

param1: 需要使用的字体名称,可以你自定义,比如说familyStr为fontNameC1,后续通过pdf.SetFont(fontNameC1, “”, 20) 来设置字体
param2: 字体的样式
param3: 字体的位置
在windows系统上面可以打开字体设置来查看可以使用的字体,我在这里使用了两种如下:
var fontNameC1 = “jianti_changgui”
var fontPathC1 = “C:\Windows\Fonts\Deng.ttf”
var fontNameC2 = “jianti_cuti”
var fontPathC2 = “C:\Windows\Fonts\Dengb.ttf”
使用:
pdf.AddUTF8Font(fontNameC1, “”, fontPathC1)
pdf.AddUTF8Font(fontNameC2, “”, fontPathC2)
pdf.SetFont(fontNameC1, “”, 10)
pdf.SetFont(fontNameC2, “”, 10)

  1. CellFormat(w, h float64, txtStr, borderStr string, ln int,alignStr string, fill bool, link int, linkStr string)

param1: 单元格的宽,为0时表示一行,单位根据new()里面设置的来
param2: 单元格的高,不能为0,单位根据new()里面设置的来
param3: 单元格内容
param4: 边框样式,一个空字符串表示无边框,“1”表示全边框,一个或多个“L”,“T”,“R”和“B”分别表示边界左,上,右,下
param5: 表示调用后当前位置的位置。可能的值为0,接着当前行继续,1换行,2目前没有试过
param6: 字体的位置,水平对齐包括"L", “C"或"R”(左,中,右)。垂直对齐由包含控制"T", “M”, “B"或"A”(上,中,下,基线),可以组合,比如说LT,CM等等
param7: 是否填充单元格,需要调用SetFillColor()方法.默认false
param8: 内部超链接,没用过
param9: 超链接,没用过
比如说要画一个两行两列的表格,可以使用如下代码:

for i:=0;i<2;i++{
	// param5 为0表示画完第一列单元格后继续画第二列的单元格
	pdf.CellFormat(6,6,"","1",0,"CM",false,0,"")
	// param5 为1表示画完第二列单元格后,换行画继续画第一列的单元格
	pdf.CellFormat(6,6,"","1",1,"CM",false,0,"")
	// pdf.Ln(2) 行距2mm
}

在这里还得提下上面注释掉的这段代码"// pdf.Ln(2)",这是表示换行后,当前行与上面行相距多少,单位为new()里面的设置的单位

  1. SetHeaderFuncMode(fnc func(), homeMode bool)

这是设置页眉的函数
param1: 是一个函数参数
param2: homeMode的值应该设置为true,以便将当前位置设置为左侧和顶部调用头函数后的空白
示例:

pdf.SetHeaderFuncMode(func() {
		pdf.SetFont(fontNameC1, "", 10)
		pdf.SetY(5) // 设置顶部边距
		pdf.CellFormat(0, 10, "这是页眉", "", 0, "L", false, 0, "")
		pdf.Ln(2)  // 换行后,当前行与上面行相距多少
	}, true)
  1. SetHeaderFuncMode(fnc func(), homeMode bool)

这是页脚设置函数
参数同页眉参数一样
示例:

pdf.SetFooterFunc(func() {
		pdf.SetFont(fontNameC1, "", 6)
		pdf.SetY(-18) // 设置底部边界
		pdf.CellFormat(
			0, 4,
			"页脚",
			"", 0, "L", true, 0, "",
		)
		pdf.SetFont(fontNameC1, "", 10)
		pdf.SetY(-14) // 设置底部边界
		pdf.CellFormat(
			0, 10,
			fmt.Sprintf("当前第 %d 页,共 {nb} 页", pdf.PageNo()), //字符串中的 {nb}。大括号是可以省的,但不建议这么做
			"", 0, "C", true, 0, "",
		)
	})
	//给个空字符串就会去替换默认的 "{nb}"。
	//如果这里指定了特别的字符串,那么SetFooterFunc() 中的 "nb" 也必须换成这个特别的字符串
	pdf.AliasNbPages("")
}
  1. SetLineWidth(width float64)

设置线条的线框,比如说边框的线宽: pdf.SetLineWidth(0.1)

  1. SetTextColor(r, g, b int)

设置字体的颜色,r,g,b 分别对应三种颜色的比例,有些颜色好像不能渲染,可以自己多去试试

  1. SetFillColor(r, g, b int)

设置填充单元格的颜色,r,g,b 分别对应三种颜色的比例

  1. RegisterImageOptionsReader(imgName string, options ImageOptions, r io.Reader)

这是一个添加图片的方法,官方提供了另外一种,但是我没有设置成功.
param1: 图片的名称
param2: ImageOptions结构体,包含需要设置图片的类型,dpi,定位
param3: 图片文件的io.Reader
添加图片的详细代码如下:

func imgFunc(title, path, name string, x float64, pdf *gofpdf.Fpdf) {
	// 在图片上方添加图片的名称
	pdf.SetFont(fontNameC1, "", 10)
	pdf.CellFormat(0, 6, title, "", 0, "C", false, 0, "")
	pdf.Ln(5)
	// 初始化一个ImageOptions的结构体
	opt := gofpdf.ImageOptions{}
	// 设置类型为 png
	opt.ImageType = "png"
	// 打开一张图片,获取id.reader
	path = filepath.Join("img", path)
	fl, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	//设置为true以防止默认将负的x值强制到当前的x位置。
	opt.AllowNegativePosition = true
	// 注册图片
	_ = pdf.RegisterImageOptionsReader(name, opt, fl)

	fl.Close() //注册完,就可以关闭这个文件了
	// 添加图片,name 注册的图片名称
	pdf.ImageOptions(name, x, 0, 180, 0, true, opt, 0, "")
	pdf.Ln(2)
}
图表库官方最小示例

在介绍之前,有兴趣的朋友可以看下文章 【Golang】使用代码绘制图表的开源库对比
网上关于这个的描述不多,我对于这个库的理解也不是非常深入,建议去看看官方例子了解一些详细用法


import (
    ...
    "bytes"
    ...
    "github.com/wcharczuk/go-chart" //exposes "chart"
)

func main(){
	// 定义一个图表
	graph := chart.Chart{
		// 线条组
	    Series: []chart.Series{
	    	// 一根线 
	        chart.ContinuousSeries{
	        	// x和y坐标,一一对应,必须是float64
	            XValues: []float64{1.0, 2.0, 3.0, 4.0},
	            YValues: []float64{1.0, 2.0, 3.0, 4.0},
	        },
        },
	}
	// 创建一个图片文件的io
	f, _ := os.Create("output.png")
	defer f.Close()
	// 将图表写入文件
	err := graph.Render(chart.PNG, f)
}
属性介绍

chart是一个结构体,所有的图形属性都在里面设置:

type Chart struct {
	Title      string
	TitleStyle Style
	ColorPalette ColorPalette
	Width  int
	Height int
	DPI    float64
	Background Style
	Canvas     Style
	XAxis          XAxis
	YAxis          YAxis
	YAxisSecondary YAxis
	Font        *truetype.Font
	defaultFont *truetype.Font
	Series   []Series
	Elements []Renderable
}

挑几个我用到的介绍:

  1. Title: 图表的标题,字符串格式
  2. TitleStyle: 标题的字体格式,style结构体类型
  3. Width,Height: 图表的宽度和高度
  4. Background: 背景颜色
  5. XAxis: 可设置x坐标轴的属性
  6. YAxis: 可设置y坐标轴的属性
  7. Series: 坐标列表

Style 是一个包含字体背景线条等样式的结构体

type Style struct {
	Show    bool
	Padding Box
	StrokeWidth     float64
	StrokeColor     drawing.Color
	StrokeDashArray []float64
	DotColor drawing.Color
	DotWidth float64
	DotWidthProvider SizeProvider
	DotColorProvider DotColorProvider
	FillColor drawing.Color
	FontSize  float64
	FontColor drawing.Color
	Font      *truetype.Font
	TextHorizontalAlign TextHorizontalAlign
	TextVerticalAlign   TextVerticalAlign
	TextWrap            TextWrap
	TextLineSpacing     int
	TextRotationDegrees float64 //0 is unset or normal
}
  1. Show: 是否显示,比如坐标轴,刻度等等
  2. Padding: 上下左右距离边框的位置
  3. FontSize : 字体大小
  4. FontColor: 字体颜色,在使用改属性时,貌似有些颜色会使用报错
  5. Font: 字体类型

XAxis是x坐标轴的属性设置

type XAxis struct {
	Name      string
	NameStyle Style
	Style          Style
	ValueFormatter ValueFormatter
	Range          Range
	TickStyle    Style
	Ticks        []Tick
	TickPosition TickPosition
	GridLines      []GridLine
	GridMajorStyle Style
	GridMinorStyle Style
}
  1. Style: 可以设置坐标轴是否显示,
  2. ValueFormatter: 设置x坐标轴显示的内容,比如说时间
  3. Range: x轴的最大值
  4. Ticks: 设置在x轴上面指定位置显示的值,Tick结构体:value表示x轴的坐标,label表示当前位置显示的值
  5. TickStyle: Ticks的样式
  6. GridLines: 网格线

Series: 线条,是一个数组.可以通过chart.ContinuousSeries设置一条线
ContinuousSeries:

type ContinuousSeries struct {
	Name  string
	Style Style
	YAxis YAxisType
	XValueFormatter ValueFormatter
	YValueFormatter ValueFormatter
	XValues []float64
	YValues []float64
}
  1. XValues: 每一个x坐标轴的点
  2. YValues: 每一个y坐标轴的点
最终效果

在这里插入图片描述