- pdf库: github.com/jung-kurt/gofpdf
- 图表库: github.com/wcharczuk/go-chart
// 初始化一个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.
- 创建pdf的流程要经过new()方法产生一个pdf对象,后面所有的操作都使用这个pdf对象
- 使用AddPage()添加一下新的空白页,后续的操作都将发生在这个空白页上,换页也是使用这个操作
- SetFont()设置下面的字体样式,大小.可以set多次,后面的字体已最后一次设置的为准
- CellFormat()/Cell() 相当于是开辟一块空间,可以在这块空间上面写字,贴图等,在调用这个方法之前,上面的字体必须要进行一次初始化.
- 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)
- 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()里面的设置的单位
- 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)
- 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("")
}
- SetLineWidth(width float64)
设置线条的线框,比如说边框的线宽: pdf.SetLineWidth(0.1)
- SetTextColor(r, g, b int)
设置字体的颜色,r,g,b 分别对应三种颜色的比例,有些颜色好像不能渲染,可以自己多去试试
- SetFillColor(r, g, b int)
设置填充单元格的颜色,r,g,b 分别对应三种颜色的比例
- 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
}
挑几个我用到的介绍:
- Title: 图表的标题,字符串格式
- TitleStyle: 标题的字体格式,style结构体类型
- Width,Height: 图表的宽度和高度
- Background: 背景颜色
- XAxis: 可设置x坐标轴的属性
- YAxis: 可设置y坐标轴的属性
- 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
}
- Show: 是否显示,比如坐标轴,刻度等等
- Padding: 上下左右距离边框的位置
- FontSize : 字体大小
- FontColor: 字体颜色,在使用改属性时,貌似有些颜色会使用报错
- 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
}
- Style: 可以设置坐标轴是否显示,
- ValueFormatter: 设置x坐标轴显示的内容,比如说时间
- Range: x轴的最大值
- Ticks: 设置在x轴上面指定位置显示的值,Tick结构体:value表示x轴的坐标,label表示当前位置显示的值
- TickStyle: Ticks的样式
- GridLines: 网格线
Series: 线条,是一个数组.可以通过chart.ContinuousSeries设置一条线
ContinuousSeries:
type ContinuousSeries struct {
Name string
Style Style
YAxis YAxisType
XValueFormatter ValueFormatter
YValueFormatter ValueFormatter
XValues []float64
YValues []float64
}
- XValues: 每一个x坐标轴的点
- YValues: 每一个y坐标轴的点