当前位置: 首页 > 后端技术 > Node.js

node(eggjs)下使用nsq实现puppteer生成pdf服务(二)

时间:2023-04-03 10:12:54 Node.js

上篇文章提到ctx.service.pdf.index.generate(data)方法是核心业务方法。调用egg中根目录service/pdf/index.js下的generate方法。说了这么多,下面简单介绍一下eggjs。官网地址:https://eggjs.org/zh-cn/basic....认识eggjsEgg.js是为企业级框架和应用而生的。koa大家应该都知道,Egg选择了Koa作为基础框架。在其模型的基础上进一步增强,因此继承了koaonion模型。Egg.js的特点提供基于Egg自定义上层框架的能力高度可扩展的插件机制内置多进程管理基于Koa开发,性能优异,框架稳定,测试覆盖率高渐进式开发想要的同学了解更多可以到官网自行学习。Puppteer生成imgPuppeteer是Chrome开发团队在2017年发布的一个Node.js包,用于模拟Chrome浏览器的运行。由于公司业务需要,我很早就认识了这个厉害的家伙。但是不得不说,这东西好用,坑也不少。后面会讲到puppteer遇到的一些坑。项目研究过程中发现puppteer直接生成pdf会有一些坑,于是决定先用puppteer生成img再用canvas转成pdf。进入正题:这里是使用puppteer生成imgasynchtmlToImg(url){returnnewPromise(async(resolve,reject)=>{try{letstartTime,endPrintTimestartTime=newDate()//打开内置Chromium浏览器constbrower=awaitpuppeteer.launch({args:['--no-sandbox','--disable-dev-shm-usage']})//在浏览器中打开一个标签页constpage=awaitbrower.newPage()//设置窗口参数awaitpage.setViewport({width:tools.interceptWidth,height:tools.interceptHeight,deviceScaleFactor:tools.deviceScaleFactor})//配置浏览器ua,我这里配置了手机模式等待页面。setUserAgent('Mozilla/5.0(iPhone;CPUiPhoneOS12_1_2likeMacOSX)AppleWebKit/605.1.15(KHTML,likeGecko)Mobile/16C101ios/4.10.0')browerpage=page//让浏览器跳转到对应页面awaitbrowerpage.goto(url,{waitUntil:'networkidle0'})constmore=awaitthis.moreThanOnePage(browerpage)//判断首页是否小于tools.interceptHeightletlastScrllTop=more===true?-tools.interceptHeight:-moreletobj={scrollTop:0}leti=0//实例化一个imgToPDF,判断more初始化imgToPdfcanvas初始高度//下面是canvas将img转pdf的过程,imgToPdf下面会单独说明letimgToPdfHeight=more===true?tools.interceptHeight:morelettoPdf=newimgToPdf(imgToPdfHeight*tools.deviceScaleFactor)while(obj.scrollTop>lastScrllTop){letfunCanScroll=true//最后一页的高度letimgToPdfGetHeight=tools.interceptHeight*tools.deviceScaleFactor//最后一种情况小于tools.interceptHeightif(obj.scrollTop-lastScrllTop{尝试{if(index){this.ctx.addPage(tools.interceptWidth*tools.deviceScaleFactor,height)}awaitloadImage(bufferImage).then((image)=>{this.ctx.drawImage(image,0,0)})resolve(true)}catch(e){reject(e)}})}get(){returnthis.canvas.toBuffer()}}exports.imgToPdf=imgToPdf这里大致是puppteer生成的img,canvas将img转pdf的全过程。更具体的puppteer的理解请查看:https://zhaoqize.github.io/pu...详细代码请查看我的github:https://github.com/XIEJUNXIRU...