问题
- 实测发现用tcp让go进程传数组给node进程处理,传输速度太慢了,go解析80M的文件只需要1分钟,而传输数据用了3分钟,这实在太蠢了,所以打算用go直接处理数组生成文件。
- 需要增加新功能批量生成快递单打印模板,大概像小灰狼软件的功能,根据一个信息汇总表,批量生成透明的文字模板图片
软件界面大概这样子:
思路
- 使用go语言重写一遍之前node处理数组生成文件的逻辑
- 写一个快递单页面,使用node-xlsx解析快递单信息汇总表,将信息定位到固定的快递单模板页面上,然后用html2canvas模块将指定的dom画成处理成canvas然后生成透明图片
go重写node部分的excel处理流程
研究go语法,重写代码,处理数组的时候使用切片的append()比较多,具体业务逻辑跟node差不多,重写完成之后,省去了tcp大量数据传输的时间还有很多node进程和go进程沟通成本,拆分80Mexcel文件的时间由之前的5分钟减少到了2分钟
html2canvas的使用
/**
* 将页面指定节点内容转为图片
* 1.拿到想要转换为图片的内容节点DOM;
* 2.转换,拿到转换后的canvas
* 3.转换为图片
*/
generatePicture () {
const imageDom = this.$refs.imageDom
const opt = {
width: imageDom.offsetWidth,
height: imageDom.offsetHeight,
scale: 1,
backgroundColor: null // 透明背景
}
return html2canvas(imageDom, opt).then(canvas => {
// 转成图片,生成图片地址
const base64Data = canvas.toDataURL().replace(/^data:image\/\w+;base64,/, '')
const dataBuffer = Buffer.from(base64Data, 'base64')
// 生成文件夹
const folderName = '快递单模板图'
const caseNum = this.textObj.caseNum.replace(/2.+?初/, '')
const addressee = this.textObj.addressee
let filename = `${caseNum}${addressee}.png`
let path = `${this.folderPath}/${folderName}/${filename}`
if (!fs.existsSync(`${this.folderPath}/${folderName}`)) {
fs.mkdirSync(`${this.folderPath}/${folderName}`)
}
let index = 1
while (fs.existsSync(path)) {
filename = `${caseNum}${addressee + index++}.png`
path = `${this.folderPath}/${folderName}/${filename}`
}
fs.writeFileSync(path, dataBuffer)
this.log.text = `成功生成${++this.fileNum}张图片`
})
}
遇到的坑
生成的图片一直是二倍图,一直找不到是什么原因,因为宽高也传进去了,后面研究源码发现html2canvas()传的第二个参数是一个配置对象,如果里面不传scale为1,那么默认的scale会计算出来是2,那么生成的图片会变成二倍图,所以想要1倍图的话不要忘记传配置参数scale: 1