browserless 屏幕捕捉以及pdf 导出简单试用

基于browserless 以及puppeteer 我们可以快速的进行屏幕捕捉生成图片以及导出pdf 文件,以下是一个简单的试用

环境准备

  • docker-compose
version: "3"
services:
   app:
      image: browserless/chrome:latest
      ports:
         - "3000:3000"
  • node app

package.json 基于express 的web 服务,同时使用了ncc 进行打包

{
  "name": "appv2",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "express": "^4.19.2",
    "puppeteer-core": "^22.6.5"
  },
  "scripts": {
    "dev":"node index.js",
    "build": "ncc build index.js -o dist"
  },
  "devDependencies": {
    "@vercel/ncc": "^0.38.1"
  }
}

index.js

包含一个image 以及pdf 的get 服务,我们需要传递的是website 查询字符串

const   express = require("express");
const  puppeteer = require("puppeteer-core");
 
const app = express();
 
const browserWSEndpoint = process.env.ENDPOINT ||  "ws://localhost:3000";
 
const getBrowser = async () => puppeteer.connect({ browserWSEndpoint });
 
app.get("/image", async (req, res) => {
  let  browser_local = null;
  const website  = req.query.website;
  await getBrowser()
    .then(async (browser) => {
     browser_local = browser
      const page = await browser.newPage();
      await page.setViewport({ width: 1280, height: 1024 });
      await page.goto(website,{
        waitUntil: ["load",'networkidle0'],
      });
      const screenshot = await page.screenshot({
        fullPage: true,
        captureBeyondViewport: true,
      });
      res.end(screenshot, "binary");
    })
    .catch((error) => {
      if (!res.headersSent) {
        res.status(400).send(error.message);
      }
    })
    .finally(() => browser_local && browser_local.close());
});
 
 
app.get("/pdf", async (req, res) => {
    let browser_local = null;
    const website  = req.query.website;
    await getBrowser()
      .then(async (browser) => {
        browser_local = browser
        const page = await browser.newPage();
        await page.setViewport({ width: 1280, height: 1024 });
        await page.goto(website,{
          waitUntil: ["load",'networkidle0'],
        });
        const screenshot = await page.pdf({
            displayHeaderFooter: true,
            format: "A4",
            printBackground: true,
        });
        res.end(screenshot, "binary");
      })
      .catch((error) => {
        if (!res.headersSent) {
          res.status(400).send(error.message);
        }
      })
      .finally(() => browser_local && browser_local.close());
  });
 
 
app.listen(8080, () => console.log("Listening on PORT: 8080"));
  • 效果

图片的


pdf 文件

说明

使用好browserless 可以做不少有意思的东西,值得尝试下

参考资料

https://pptr.dev/api/puppeteer.page.screenshot
https://pptr.dev/api/puppeteer.page.pdf
https://www.browserless.io/
https://github.com/browserless/browserless

posted on   荣锋亮  阅读(70)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2023-04-18 ipp-server 基于python实现的不错的ipp 服务
2021-04-18 使用k6 压测cube.js 请求接口
2021-04-18 cube.js TimeoutError: ResourceRequest timed out 问题
2020-04-18 easy-batch job 调度
2020-04-18 easy-batch job 监控
2020-04-18 easy-batch job 配置
2020-04-18 使用bloom 加速sqler + gitbase 的代码统计分析情况

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示