上篇文章提到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
