使用go语言生成PDF

go语言生成PDF

最近由于工作需要,将之前用phantomjs生成PDF报告的部分重构(phantomjs在数据量较大时候,占用太高的服务器资源),改用go代码直接生成,在GitHub上搜索相关第三方库, 关键词:pdf language:Go,按照star排序如图:

image-20211128174940814

在各大网站上查找相关资料后,大致了解如下:

  1. jung-kurt/gofpdf 的star数量较多,但是更新频率较低,在我用的时候,最新的tag是v2.17.2,已经有将近两年没更新了,有很多open的issue没有关,担心不会再更新,所以当时没有考虑用这个。

    image-20211128175616771

    另外,go语言中文网有一篇文章说这个包不支持中文,是的,那篇文章是2017年的,当时不支持,这个库2019年更新了,现在是支持的。

    image-20211128180115859

  2. 排在第二的是gotenberg/gotenberg,这个库主要用于将其他类型的文件转化为PDF,以及合并PDF的,不符合我们的需求,暂不考虑。

  3. pdfcpu/pdfcpu 是一个用于合并PDF的命令行工具,也不符合需求,暂不考虑。

  4. signintech/gopdf 初步看着还是比较符合需求,再看一看其他的。

  5. unidoc/unipdf 是unioffice的一个PDF工具,他们还有个比较厉害的用于生成word的库,不过使用需要商业授权,源码也做了混淆,加上文档有限,不是太好用,先不考虑了。

    附unipdf部分源码截图:

    image-20211128181311607


最终,对比了多个第三方库之后,选用了signintech/gopdf

这个库的部分功能还有待完善,比如自动分页,自动换行等。大纲书签功能,之前只有最基本的跳转功能,而且跳转功能有些问题,会跳转到下一页,我提交了一次优化,并附带了demo,现在作者已经将我提交的那部分合入了。

代码示例:

package main
import (
	"log"
	"github.com/signintech/gopdf"
)

func main() {
	pdf := gopdf.GoPdf{}
	pdf.Start(gopdf.Config{ PageSize: *gopdf.PageSizeA4 })  
	pdf.AddPage()
	err := pdf.AddTTFFont("wts11", "../ttf/wts11.ttf")
	if err != nil {
		log.Print(err.Error())
		return
	}
	err = pdf.SetFont("wts11", "", 14)
	if err != nil {
		log.Print(err.Error())
		return
	}
	pdf.Cell(nil, "您好")
	pdf.WritePdf("hello.pdf")

}

先来说说这个库使用的大致流程(如上面代码块):

  1. 首先下载并在代码里引入这个包:import "github.com/signintech/gopdf"
  2. 初始化一个pdf对象:pdf := gopdf.GoPdf{}
  3. 初始化配置(页面尺寸):pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4});这里的PageSizeA4指的是用A4纸的尺寸,即宽210mm,高297mm;在分辨率为72px/inch的时候,宽高分为约为595px、842px,使用px更符合实际场景,比如UI给的设计稿一般都是像素单位;
  4. 添加一页画布:pdf.AddPage()
  5. 添加字体,可以从ttf文件直接读取,也可以使用字节流的字体数据:err := pdf.AddTTFFont("wts11", "../ttf/wts11.ttf"),可以在初始化的时候添加多个字体,以便后续在不同地方选用不同的字体;
  6. 设置字体:pdf.SetFont("wts11", "", 14),这里的wts11是上面设置的,如果上面设置的是abc,这里用的时候也是abc。这一步一定不要忘记,否则生成的时候回抛一个空指针异常;
  7. 绘制内容,可以是文字、线条、图片、图形、填充颜色等等,自由度极高。(但是文字不会自动换行…)
  8. 保存输出到pdf文件:pdf.WritePdf("hello.pdf")

相关代码示例和使用注意事项后续有空了再详细写写。

gopdf使用注意事项及常见问题

区块链是一种分布式账本技术,很受关注。而Go语言则是一种开源、高效、并发编程的编程语言。在区块链开发中,Go语言具有许多优势,因此Go语言的相关资源也相应增加。 Go语言区块链PDF即指的是关于使用Go语言进行区块链开发的相关PDF文档。这些文档通常包含对Go语言基础知识的介绍,以及如何使用Go语言来构建区块链应用程序的详细指南。 在这些PDF文档中,你可以学习到如何使用Go语言的特性来实现区块链的核心功能,比如创建区块、交易验证、共识算法等等。同时,还可以了解到如何使用Go语言库来简化开发过程,比如Go-Ethereum、Hyperledger等。 使用Go语言进行区块链开发的优势包括: 1. 并发性能优秀:Go语言天生支持并发编程,并提供了轻量级的线程(goroutine)和通信(channel)机制。这使得Go语言在处理区块链交易高并发的场景中具有很大优势。 2. 丰富的标准库和第三方包:Go语言拥有丰富的标准库和活跃的开源社区,提供了许多与区块链相关的第三方包和工具,使得开发者可以更快速地构建区块链应用程序。 3. 跨平台支持:Go语言编译生成的可执行文件具有很好的跨平台性,可以在不同的操作系统上运行。这对于区块链的去中心化特性来说是非常重要的,因为不同的参与者可能使用不同的操作系统。 总之,Go语言区块链PDF资源对于想要学习和开发区块链应用程序的开发者是非常有价值的。通过阅读这些文档,开发者可以快速入门Go语言开发,并掌握使用Go语言来构建高效、安全的区块链应用程序的技能。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值