Golang - html template + wkhtmltopdf生成PDF

以前很菜的时候收过这个需求
真心很讨厌PDF,因为要自己算座标和设定一堆东西
後来这个需求就被弃置了,也没继续研究
直到最近坑又被挖出来了
拜各位大神赐教,这礼拜试过很多方法,终於实作出来几种方法,真的非常感谢
然後我要去刻画面了==

PDF大评比

  • maroto:很好上手,但是option很少
  • gofpdf:难度稍高,几乎什麽都可以设定,但有些还是没办法,还有一些issue,没维护了,好处是不用依赖driver
  • html template + wkhtmltopdf:看到後来才想到之前很菜的时候就是这样做的,我真是蠢= =,好处是html会帮你搞定一切,什麽都可以设定,缺点是要依赖一个driver

driver & package

网址留作纪念,因为有可能会搜寻到另一个封装起来的同名package,要找资料也方便

html template + wkhtmltopdf如何使用

要灌driver

  • wkhtmltopdf或brew都行

用go mod

package的坑

手动import "github.com/SebastiaanKlippert/go-wkhtmltopdf"
    
github上面的quick start是在他的test file里写的
你会不知道要用什麽开头import
用go mod之後package引用只要加上wkhtmltopdf就不用在import前面加上alias
ex:wkhtmltopdf.NewPDFGenerator()

原理

1.利用html template将html档参数化可以injection parameters
2.excute成byte档给wkhtmltopdf去生成页面

注意1:谨慎使用html template,因为可能有injection风险,千万不要信任来路不明的html档,详细请参阅html template
注意2:要是页面太多,package会自动AddPages,不用担心

Go程序码

func GeneratePDF() error {

	Student := struct {
		Title string
	}{
		"My Awesome Site 123",
	}

	htmlTemp, err := template.ParseFiles("./example.html")
	if err != nil {
		log.Fatal(err)
		return err
	}

	var buf bytes.Buffer
	htmlTemp.Execute(&buf, &Student)

	pdfg, err := wkhtmltopdf.NewPDFGenerator()
	if err != nil {
		log.Fatal(err)
	}
	pdfg.AddPage(wkhtmltopdf.NewPageReader(bytes.NewReader(buf.Bytes())))
	pdfg.Dpi.Set(600)

	err = pdfg.Create()
	if err != nil {
		log.Fatal(err)
	}

	err = pdfg.WriteFile("./simplesample.pdf")
	if err != nil {
		log.Fatal(err)
	}

	return nil
}

html

<!DOCTYPE html>
<html>
    <head>
         <meta http-equiv="content-type" content="text/html;charset=utf-8"> <!-- 有中文要加这行,不然乱码 -->
        <title>{{ .Title }}</title>
    </head>
    
    <body>
       <h1>{{ .Title }}</h1>    <!-- 想测试自动分页的把这行复制一堆就可以 -->
    </body>
</html>

参考资料


<<:  【填坑系列01】IP位址计算 (IPv4 适用)

>>:  【HTML】【CSS】关於空白压缩

[Day15] JavaScript - 同步(Synchronous) 与 非同步 (Asynchronous)

JS需要JavaScript 引擎才能执行 JavaScript 是一个直译式语言,而直译语言无法独...

(Day5) 原始型别及物件型别

在 JavaScript 这语言里,其实指分成两种型别:原始型别、物件型别 原始型别 原始型别又称纯...

【不是铁人赛】Day 01|虚拟货币价格预测(一)资料处理

友:你要不要一起参加铁人赛? 我:好啊! (几天後) 我:乾我不小心忘了报名...... ----...

【Day12-排序】浅谈python中的资料排序——sort, sorted, natsort, pd.sort_values

前一天我们学会了对资料进行简单的map处理之後,今天来聊一下排序 不论是进行人工的检视或是後续分析的...

goroutine

Golang goroutine 我自己理解goroutine 就很类似其他语言的thread[备注...