• java实现html转pdf(node+puppeteer)


    一、安装NodeJs

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

    2、 下载好了之后,进行解压,解压后,修改文件名称为nodejs

    1. windows系统:直接进行解压即可;
    2. linux系统:用命令tar -xf node-v16.15.1-linux-x64.tar.xz进行解压

    3、NodeJs环境变量配置

    1. windows系统:
    2. 右键【此电脑】—>选择【属性】—>选择【高级系统设置】—>点击【环境变量】—>选择【系统变量】中的【path】选项,然后添加:D:\Program Files\nodejs(需要修改为自己的node.exe文件所在文件)
    3. linux系统:
    4. 执行:vim /etc/profile
    5. 在文件末尾处添加:export PATH=${PATH}:/home/nodejs/bin(需要修改为自己的node.exe文件所在的文件)

    4、测试环境变量是否配置成功,如图

     5、配置 npm 在安装全局模块时的路径和缓存 cache 的路径。在自己喜欢的目录下,分别新建文件夹 node_global 和 node_cache 来分别代表 安装全局所有工具的安装目录 和 缓存 cache 的文件夹,并在 CMD 中输入以下命令来配置这两个文件夹:

    1. npm config set prefix "D:\Program Files\nodejs\node_global"
    2. 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

    1. const puppeteer = require('puppeteer');
    2. const args = process.argv;
    3. var address, pdfPath;
    4. console.log(process.argv);
    5. console.log(args);
    6. (async() => {
    7. address=args[2];
    8. pdfPath=args[3]
    9. console.log('args[0]===', args[0]);
    10. console.log('args[1]===', args[1]);
    11. console.log('args[2]===', args[2]);
    12. console.log('args[3]===', args[3]);
    13. const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
    14. try {
    15. const page = await browser.newPage();
    16. 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";
    17. page.setUserAgent(userAgent);
    18. await page.setViewport({
    19. width: 1920,
    20. height: 1440,
    21. deviceScaleFactor: 1,
    22. });
    23. // Configure the navigation timeout
    24. await page.setDefaultNavigationTimeout(0);
    25. await page.goto(address, {
    26. waitUntil: 'networkidle0',
    27. // networkidle0
    28. });
    29. const pdf = await page.pdf({
    30. path: pdfPath,
    31. // format: 'A4',
    32. scale: 1,
    33. width: '1920px',
    34. height: '1440px',
    35. printBackground: true
    36. });
    37. await browser.close();
    38. } catch (err) {
    39. await browser.close();
    40. console.log('出错');
    41. console.log(err);
    42. }
    43. })();

    四、执行命令进行测试

    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

    1. /**
    2. * @ClassName PuppeteerHtmlToPdf
    3. * @Description TODO
    4. * @Date 2022/6/23 10:13
    5. * @Author wf
    6. */
    7. public class PuppeteerHtmlToPdf {
    8. /**
    9. * html转pdf
    10. * @param puppeteerjs 要采用哪个js文件执行
    11. * @param webSiteUrl 要生成的pdf/图片的网页
    12. * @param pdfPath 要生成的pdf文件
    13. */
    14. public static void parseHtml2Pdf(String puppeteerjs, String webSiteUrl, String pdfPath) {
    15. try {
    16. Runtime rt = Runtime.getRuntime();
    17. String cmd = "node " + puppeteerjs + " " + webSiteUrl + " " + pdfPath;
    18. System.out.println("cmd===" + cmd);
    19. Process p = rt.exec(cmd);
    20. p.waitFor(); // 等待运行结束
    21. } catch (Exception e) {
    22. }
    23. }
    24. /**
    25. * html转pdf,直接通过流输出到浏览器
    26. * @param response 浏览器响应
    27. * @param fileName 文件名称
    28. * @param puppeteerjs 要采用哪个js文件执行
    29. * @param webSiteUrl 要生成pdf/图片的网页
    30. * @param types 类型 :pdf代表要生成pdf文件,jpg代表要生成jpg图片
    31. */
    32. public static void parseHtml2Pdf(HttpServletResponse response, String fileName, String puppeteerjs, String webSiteUrl, String types) {
    33. try {
    34. Runtime rt = Runtime.getRuntime();
    35. Process p = rt.exec("node "+puppeteerjs+" "+webSiteUrl+" "+types);
    36. InputStream is = p.getInputStream();
    37. BufferedInputStream bf=new BufferedInputStream(is);
    38. byte[] data = IOUtils.toByteArray(bf);
    39. fileName = URLEncoder.encode(fileName, "UTF-8");
    40. response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    41. response.addHeader("Content-Length", "" + data.length);
    42. response.setContentType("application/octet-stream;charset=UTF-8");
    43. OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
    44. outputStream.write(data);
    45. outputStream.flush();
    46. outputStream.close();
    47. } catch (IOException e) {
    48. e.printStackTrace();
    49. }
    50. }
    51. public static void main(String[] args) throws Exception {
    52. String html2pdfjs = "E:\\node_modules/puppeteer/puppeteer.js";
    53. String url = "http://www.baidu.com";
    54. String pdfPath = "E:\\pdf/" + DateUtils.getStringDate(DateUtils.pattern3) + ".pdf";
    55. //生成pdf
    56. parseHtml2Pdf(html2pdfjs, url, pdfPath);
    57. }
    58. }

    此方法本人在windows系统和linux系统亲测有效

  • 相关阅读:
    康力健身中心
    科普:String hashCode 方法为什么选择数字 31 作为乘子
    python自动化测试—Python自动化框架及工具
    使用企业微信移动办公效果如何?
    【GIC400】——驱动代码实现
    SWT/ANR问题--SWT 导致 low memory killer(LMK)
    SOME/IP 协议介绍(三)参数和数据结构的序列化
    挖矿木马攻破了服务器
    vue3项目修改浏览器的项目icon小图标
    ResNet分类器量化
  • 原文地址:https://blog.csdn.net/weixin_42722953/article/details/125520058