IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java+puppeteer实现html转pdf文件 -> 正文阅读

[Java知识库]java+puppeteer实现html转pdf文件

1. puppeteer是一个无头浏览器,可以模拟访问网站或者生成html源文件,并返回pdf流的组件。

2. puppeteer使用需要预先安装nodejs, nodejs具体步骤如下[安装最新版本nodejs即可]:Node.js安装教程_北忆?的博客-CSDN博客_nodejs安装教程

3. puppeteer安装具体步骤如下:进入cmd控制台,执行如下命令:npm install -g puppeteer

之后会在如图上对应位置生成 puppeteer安装包。

4. 在puppeteer安装包下直接创建如下2个文件,此2个文件为2种实现方式:

方式1:puppeteer.js? ,表示从对应URL处获取信息,并返回pdf流。具体代码如下:

const puppeteer = require('puppeteer');
const options = process.argv;
var address, types;

(async() => {
if(options.length>=4){
    address=options[2];
    types=options[3];
}

const browser = await puppeteer.launch();
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: 1080 });

await page.setViewport({ width: 480, height: 800,isMobile: true}); 

await page.goto(address, {waitUntil: 'networkidle2'});
if(types == 'pdf') {
    const pdf = await page.pdf({path: 'd://page.pdf', format: 'A4'});
    await browser.close();
    process.stdout.write(pdf);
}else {
    await browser.close();
}


})();

?方式2:setContent.js? (window系统使用),表示从html文件获取源文件流,并返回pdf流。具体代码如下:

const puppeteer = require('puppeteer');
var fs = require('fs');
const options = process.argv;
var htmlContent;

(async() => {
htmlFilePath=options[2];

const browser = await puppeteer.launch();
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: 1080 });

await page.setViewport({ width: 480, height: 800,isMobile: true}); 

//const buff2 = Buffer.from(htmlContent, 'base64')
//const htmlContentResult = buff2.toString('utf-8')

var contentHtml = fs.readFileSync(htmlFilePath, 'utf-8');

//await page.goto('file://d:\\test2.html');

await page.setContent(contentHtml);

const pdf = await page.pdf({path: 'page.pdf', format: 'A4'});

await browser.close();

process.stdout.write(pdf);


})();

setContent.js? (linux系统使用)

const puppeteer = require('puppeteer');
var fs = require('fs');
const options = process.argv;
var htmlContent;

(async() => {
    htmlFilePath=options[2];

    const browser = await puppeteer.launch({
        args: ['--no-sandbox', '--disable-setuid-sandbox'],
    });
    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: 1080 });

    await page.setViewport({ width: 1800, height: 1800});

//const buff2 = Buffer.from(htmlContent, 'base64')
//const htmlContentResult = buff2.toString('utf-8')

    var contentHtml = fs.readFileSync(htmlFilePath, 'utf-8');

//await page.goto('file://d:\\test2.html');

    await page.setContent(contentHtml);

    const pdf = await page.pdf({path: 'page.pdf', fullPage: true});

    await browser.close();

    process.stdout.write(pdf);


})();

3.??puppeteer.js对应的java调用代码如下:

/**
     * 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 C:\\Users\\boshi\\Desktop\\iview-admin-master\\hn.js https://www.baidu.com pdf");
            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();
        }
    }

4.?setContent.js 对应的java调用代码如下:

  public void parseHtml2Pdf(String htmlFileName) {
        try {
            Runtime rt = Runtime.getRuntime();
            Process p = rt.exec("node " + createPdfJsPath + "setContent.js " + this.getHtmlTempPath(htmlFileName));
            InputStream is = p.getInputStream();
            BufferedInputStream bf = new BufferedInputStream(is);
            byte[] data = IOUtils.toByteArray(bf);
            File file = new File(diseaseControlPdfPath + htmlFileName + ".pdf");
            IOUtils.write(data,new FileOutputStream(file));
        } catch (IOException e) {
            log.error("in parseHtml2Pdf has an error,e is ",e);
        }
    }

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 17:56:45  更:2022-06-25 18:00:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:18:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码