Java使用Puppeteer将网页指定区域转成pdf

友情提示:本文章只提供方法思路,不要复制粘贴后说跑不通

一、需要先安装NodeJs,网上教程很多

二、安装puppeteer依赖,如果npm下载不成功就使用cnpm命令(cnpm需要先安装)

npm install puppeteer --save

三、在安装puppeteer依赖的目录下创建puppeteer.js

const puppeteer = require('puppeteer');
const options = process.argv;
var address, types;
(async () => {
 if(options.length>=4){
    address=options[2]; //网址
    types=options[3]; //types
    //idclass=options[4]; //页面div中的id
    mobileWidth=Number(options[4]); //网页可见区域宽:采用网页中js的document.body.clientWidth方法获取
    mobileHight=Number(options[5]); //网页可见区域高:采用网页中js的document.body.clientHeight方法获取
    }
  const browser = await puppeteer.launch({
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
    timeout: 60000,
     headless:true
  })
  try {
      const page = await browser.newPage();
      page.setViewport({width: mobileWidth, height: mobileHight});
      await page.goto(address, {waitUntil: 'networkidle2'});
      await page.waitForSelector('.nodeCompleted'); //页面加载完成后才开始导出,需要在前端页面设置一个class
/*	 let clip = await page.evaluate(classId => {
    	let {
    		x,
    		y,
    		width,
    		height
    	} = document.getElementById(classId).getBoundingClientRect();
    	return {
    		x,
    		y,
    		width,
    		height
    	};
      },idclass);*/
//   console.log("mobileWidth="+mobileWidth+",mobileHight="+mobileHight)
//   console.log("mobileWidth="+mobileWidth+",clip.height="+clip.height)
//  await page.waitFor(1000000); //页面加载完成后才开始导出
      const pdf = await page.pdf({
		  width:mobileWidth,
          height:mobileHight+1,//不知道什么原因,前端页面真实长度比document.body.clientHeight方法获取到的长度多1,解释不通,可能不通网页会有不一样,切勿直接复制粘贴,请根据具体情况设置
          printBackground:true,
          margin:{top:0,right:0,bottom:0,left:0},
          scale:1
         
    });
    await browser.close();
    process.stdout.write(pdf);
 

}catch(e){

}finally{
  await browser.close();
}
})().then(function(res){
  
});

四、Java项目中创建PuppeteerHtmlToPdf.class

/**
 *
 * @author zx
 * @date 2020/8/5
 * 用谷歌提供的node实现的Puppeteer,实现网页截图及把网页生成pdf文件采
 */
public class PuppeteerHtmlToPdf {
    /**
     * html转pdf,直接通过流输出到浏览器
     * @param response 浏览器响应
     * @param fileName 文件名称
     * @param puppeteerjs 要采用哪个js文件执行
     * @param webSiteUrl 要生成pdf/图片的网页
     * @param types 类型  pdf代表要生成pdf文件,jpg代表要生成jpg图片
     * @param mobileWidth 需要转化的网页宽度 
     * @param mobileHight 需要转化的网页长度 
     */
    public static void parseHtml2Pdf(HttpServletResponse response, String fileName, String puppeteerjs, String webSiteUrl, String types, String mobileWidth, String mobileHight) {
        try {
            Runtime rt = Runtime.getRuntime();
            //Process p = rt.exec("node C:\\Users\\boshi\\Desktop\\iview-admin-master\\hn.js http://yunfu.ifutest.com/adminAchievement/viewPdfHtml/7e6bba53b5d34124a54c0648a825bcda pdf");
            Process p = rt.exec("node " + puppeteerjs + " " + webSiteUrl + " " + types + " " + mobileWidth + " " + mobileHight);
            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();
        }

    }
}

五、在你需要将网页转成pdf是去调用PuppeteerHtmlToPdf 的parseHtml2Pdf方法即可

六、注意:需要等页面加载完才去转pdf,需要在页面设置一个标志用于判断页面是否加载完成(这里前端使用的是vue的语法,页面加载完会把addNameFlags置为true,只有为true才设置class属性nodeCompleted,传统的可以在onload函数中给标签绑定class属性)

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中的代码是使用puppeteer.js来生成PDF文件的示例代码。它使用puppeteer库来模拟浏览器行为,访问指定的URL,并将页面内容保存为PDF文件。代码中的`puppeteer.launch()`方法用于启动一个浏览器实例,`browser.newPage()`方法用于创建一个新的页面实例,`page.goto()`方法用于导航到指定的URL,`page.pdf()`方法用于将页面内容保存为PDF文件。根据代码中的参数,可以选择保存为PDF文件或者关闭浏览器实例。 引用\[2\]中的Java调用代码是调用了一个Node.js脚本`setContent.js`来将HTML内容转换为PDF文件。它使用了`Runtime`类来执行命令行命令,通过`Process`类来获取命令行输出,并将输出保存为PDF文件。 引用\[3\]中的`setContent.js`是一个用于将HTML内容转换为PDF文件的Node.js脚本。它使用puppeteer库来模拟浏览器行为,读取指定的HTML文件内容,将内容设置到页面中,然后将页面内容保存为PDF文件。 综上所述,这些代码示例展示了如何使用puppeteer库来生成PDF文件,可以通过调用Node.js脚本或者在Java中执行命令行命令来实现。 #### 引用[.reference_title] - *1* *2* *3* [java+puppeteer实现html转pdf文件](https://blog.csdn.net/linwei_1029/article/details/125429715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值