一、安装NodeJs
1、进入 Node.js
官网,网址:Download | Node.js,根据自己系统给选择对应的版本进行下载
2、 下载好了之后,进行解压,解压后,修改文件名称为nodejs
- windows系统:直接进行解压即可;
-
- linux系统:用命令tar -xf node-v16.15.1-linux-x64.tar.xz进行解压
3、NodeJs环境变量配置
- windows系统:
-
- 右键【此电脑】—>选择【属性】—>选择【高级系统设置】—>点击【环境变量】—>选择【系统变量】中的【path】选项,然后添加:D:\Program Files\nodejs(需要修改为自己的node.exe文件所在文件)
-
- linux系统:
-
- 执行:vim /etc/profile
-
- 在文件末尾处添加:export PATH=${PATH}:/home/nodejs/bin(需要修改为自己的node.exe文件所在的文件)
4、测试环境变量是否配置成功,如图
5、配置 npm 在安装全局模块时的路径和缓存 cache 的路径。在自己喜欢的目录下,分别新建文件夹 node_global
和 node_cache
来分别代表 安装全局所有工具的安装目录
和 缓存 cache
的文件夹,并在 CMD 中输入以下命令来配置这两个文件夹:
- npm config set prefix "D:\Program Files\nodejs\node_global"
-
- npm config set cache "D:\Program Files\nodejs\node_cache"
此步骤并不是必要的,如果跳过此步骤,以后使用全局命令的时候,会默认将模块安装在 C:\Users\用户名\AppData\Roaming
路径下的 npm
和 npm-cache
中,这可能会对以后配置路径和开发都带来麻烦,建议不要跳过此步骤。
6、输入以下命令将 registry 地址更改为阿里云 NPM 镜像地址:
npm config set registry http://registry.npmmirror.com
【注意】
很早以前,上面命令中的地址是 http://registry.npm.taobao.org。现在,阿里官方已宣布将在 2022 年停用此地址,因此现在不要再使用这个地址了。
如果不进行此操作,则等同于输入了以下命令:
npm config set registry http://registry.npmjs.org
这样的结果是,之后使用 npm 安装国外的插件时,可能由于访问国外互联网的限制导致失败,从而报错 rollbackFailedOptional: verb npm-session。
二、安装puppeteer依赖,如果npm下载不成功就使用cnpm命令(cnpm需要先安装)
npm install puppeteer --save
三、在安装puppeteer依赖的目录下创建puppeteer.js
- const puppeteer = require('puppeteer');
- const args = process.argv;
- var address, pdfPath;
- console.log(process.argv);
- console.log(args);
-
- (async() => {
-
- address=args[2];
- pdfPath=args[3]
-
- console.log('args[0]===', args[0]);
- console.log('args[1]===', args[1]);
- console.log('args[2]===', args[2]);
- console.log('args[3]===', args[3]);
- const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
- try {
- const page = await browser.newPage();
- const userAgent = "Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36";
- page.setUserAgent(userAgent);
- await page.setViewport({
- width: 1920,
- height: 1440,
- deviceScaleFactor: 1,
- });
- // Configure the navigation timeout
- await page.setDefaultNavigationTimeout(0);
- await page.goto(address, {
- waitUntil: 'networkidle0',
- // networkidle0
- });
- const pdf = await page.pdf({
- path: pdfPath,
- // format: 'A4',
- scale: 1,
- width: '1920px',
- height: '1440px',
- printBackground: true
- });
- await browser.close();
- } catch (err) {
- await browser.close();
- console.log('出错');
- console.log(err);
- }
- })();
四、执行命令进行测试
node /xxxxxx/node/html2pdf/node_modules/puppeteer/puppeteer.js https://www.baidu.com /home/tomcat/tempPdf/111111.pdf
【备注】node后面的三个参数分别是:puppeteer.js文件的位置、要转成pdf的页面地址、要生成的pdf位置
五、Java项目中创建PuppeteerHtmlToPdf.java
- /**
- * @ClassName PuppeteerHtmlToPdf
- * @Description TODO
- * @Date 2022/6/23 10:13
- * @Author wf
- */
- public class PuppeteerHtmlToPdf {
-
- /**
- * html转pdf
- * @param puppeteerjs 要采用哪个js文件执行
- * @param webSiteUrl 要生成的pdf/图片的网页
- * @param pdfPath 要生成的pdf文件
- */
- public static void parseHtml2Pdf(String puppeteerjs, String webSiteUrl, String pdfPath) {
- try {
- Runtime rt = Runtime.getRuntime();
- String cmd = "node " + puppeteerjs + " " + webSiteUrl + " " + pdfPath;
- System.out.println("cmd===" + cmd);
- Process p = rt.exec(cmd);
- p.waitFor(); // 等待运行结束
- } catch (Exception e) {
-
- }
- }
-
- /**
- * html转pdf,直接通过流输出到浏览器
- * @param response 浏览器响应
- * @param fileName 文件名称
- * @param puppeteerjs 要采用哪个js文件执行
- * @param webSiteUrl 要生成pdf/图片的网页
- * @param types 类型 :pdf代表要生成pdf文件,jpg代表要生成jpg图片
- */
- public static void parseHtml2Pdf(HttpServletResponse response, String fileName, String puppeteerjs, String webSiteUrl, String types) {
- try {
- Runtime rt = Runtime.getRuntime();
- Process p = rt.exec("node "+puppeteerjs+" "+webSiteUrl+" "+types);
- InputStream is = p.getInputStream();
- BufferedInputStream bf=new BufferedInputStream(is);
- byte[] data = IOUtils.toByteArray(bf);
- fileName = URLEncoder.encode(fileName, "UTF-8");
- response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
- response.addHeader("Content-Length", "" + data.length);
- response.setContentType("application/octet-stream;charset=UTF-8");
- OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
- outputStream.write(data);
- outputStream.flush();
- outputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
-
-
- public static void main(String[] args) throws Exception {
- String html2pdfjs = "E:\\node_modules/puppeteer/puppeteer.js";
- String url = "http://www.baidu.com";
- String pdfPath = "E:\\pdf/" + DateUtils.getStringDate(DateUtils.pattern3) + ".pdf";
- //生成pdf
- parseHtml2Pdf(html2pdfjs, url, pdfPath);
- }
- }
此方法本人在windows系统和linux系统亲测有效