需求背景
项目中有报表功能,报表由前端渲染生成,后台需要按需求将报表生成pdf进行邮件发送,前端的报表完全是动态生成的,后台不能完美的复刻前端的报表渲染,所以pdf的生成必须还是由前端渲染生成,这里使用Jvppeteer生成pdf,模拟调用浏览器渲染页面。
Jvppetter:https://github.com/fanyong920/jvppeteer
项目准备
根据环境准备好chrome资源包,windowns如果本地装有chrome,api的设置路径写chrome.exe即可,如果是Linux环境则需要下载chrome Linux版,Jvppetter推荐的默认版本是722234,使用推荐版即可,使用其它版本会有一些莫名的问题。
chrome离线资源安装包地址:https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html
Linux放到指定目录解压即可,无需其它配置。
代码示例
- Maven引入依赖
<dependency>
<groupId>io.github.fanyong920</groupId>
<artifactId>jvppeteer</artifactId>
<version>1.1.5</version>
</dependency>
- 示例代码
ArrayList<String> arrayList = new ArrayList<>();
//生成pdf必须在无厘头模式下才能生效
LaunchOptions options = new LaunchOptionsBuilder().withArgs(arrayList).withHeadless(true).build();
arrayList.add("--no-sandbox");
arrayList.add("--disable-setuid-sandbox");
//这里设置chorme的路径,linux的设置解压后chorme执行文件的路径
options.setExecutablePath("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
Browser browser = Puppeteer.launch(options);
Page page = browser.newPage();
PageNavigateOptions navigateOptions = new PageNavigateOptions();
//导航到页面的超时时间
navigateOptions.setTimeout(30000);
List<String> waitUntil = new ArrayList<>();
//判定页面加载完成的几个等级
waitUntil.add("load");
waitUntil.add("domcontentloaded");
waitUntil.add("networkidle0");
waitUntil.add("networkidle2");
navigateOptions.setWaitUntil(waitUntil);
page.goTo("https://www.baidu.com", navigateOptions, false);
page.waitFor("30000");
//获取页面高度,这里是获取我们项目报表的动态高度,
//Object evaluate = page.evaluate("document.getElementById('ReportPrintingPage-content').clientHeight");
page.emulateMedia("screen");
PDFOptions pdfOptions = new PDFOptions();
//包含背景图生成
pdfOptions.setPrintBackground(true);
//pdfOptions.setHeight(String.valueOf(evaluate));
pdfOptions.setPath("D:\\test.pdf");
page.pdf(pdfOptions);
page.close();
browser.close();
- 注意事项
生成pdf的页面是否需要权限,可以模拟登录或者设置页面js所需的localStorage,可以通过一下代码执行js脚本。
page.evaluateOnNewDocument("console.log(123)");
//设置localStroage
page.evaluateOnNewDocument("localStorage.setItem('key', 'value');");
完结
Jvppetter是参考前端的Pupeetter,Pupeeter提供了详细的中文文档API,可参考前端文档,LaunchOptions中可设置一些浏览器参数,另外还有Jvppeteer可以生成图片等一些功能可参考Jvppeteer github地址。
Pupeeter中文文档
Chrome命令行启动参数