java实现html转pdf(node+puppeteer)

一、安装NodeJs

1、进入 Node.js 官网,网址:Download | Node.js,根据自己系统给选择对应的版本进行下载

java实现html转pdf(node+puppeteer)_第1张图片

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、测试环境变量是否配置成功,如图

java实现html转pdf(node+puppeteer)_第2张图片

 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系统亲测有效

你可能感兴趣的:(前端,linux,java,java,javascript,npm,前端)