请教下有什么方案可以在服务器上把 html 转成图片

14 天前
 AlanBrian

服务器是 ARM 架构的。html 的主要内容是 echarts 。

2892 次点击
所在节点    Python
29 条回复
tool2dx
14 天前
无头调用 chrome 的内置 api 截图功能,echarts 强依赖 js 运行期,又没办法直接解析文件的。

有个叫 devtools-protocol 协议,可以通过 websocket 发送控制命令,并下载 jpeg 截图。
wangbin526
14 天前
偶是用 go 动态生成 html 的 echart 然后转图片再插入 pdf ,用的是 docker 的 lampnick/doctron ,实测 arm 能用,一秒三五张连续转了几万张也没出问题
Gilfoylek
14 天前
刚做过类似功能 [chromedp]( https://pkg.go.dev/github.com/chromedp/chromedp) 我们用的是 golang 的包
money1991
14 天前
docker 里跑 Puppeteer ,它有转图片 api ,非常方便
PolarBears
14 天前
playwright
dudubaba
14 天前
一般都是 html 转 canvas 转图片,或者转 pdf 再拆分图片,都有现成的库吧。
xiaoriri666
14 天前
直接用 serverless ,阿里云直接部署个,就是冷启动有点慢,如果量不是很大可以用
yph007595
14 天前
python 之 selenium ,我现在就用这个定时发送图表
moxiaonai
14 天前
playwright, puppeteer 之类的,缺点是内存占用有点大,qps 大的话,服务容易崩
AlanBrian
14 天前
因为程序使用的 python ,目前用的 pyppeteer 无头调用 chrome 生成图片。但是有个问题,在 https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html 下载 mac 和 Windows 对对应的 chrome 包,然后在对于系统代码运行都没问题,可以生成图片。但是下载 linux_x64 的包在 x64 服务器上运行就报错了(我是想先在 x64 架构的服务器运行测试通过再去尝试 ARM 架构的)。大佬知道是什么原因吗?
还有你说的这个“devtools-protocol 协议,可以通过 websocket 发送控制命令”哪里可以参考吗?感谢🙏
@tool2dx
tool2dx
14 天前
@AlanBrian https://github.com/ChromeDevTools/awesome-chrome-devtools

我是抓页面数据没办法,要用到 websocket 的 devtools 协议。一般截图用 api 就够了,不用上这个协议的。
daxin945
14 天前
selenium + firefox 无头浏览器 部署在 arm 架构的国产化操作系统上跑过
horizon
14 天前
@wangbin526 #2
清晰度有问题没
kenilalexandra
14 天前
屏幕截图不行?
AlanBrian
14 天前
@daxin945 请问下 arm 架构的 firefox 浏览器在哪下载呢?我看官网好像没有。
makerbi
14 天前
Python 的话 Playwright 就可以,我是和你完全一样的需求,需要渲染 ECharts 图表,部署在阿里云函数,每次调用平均用时 4 秒的样子。
daxin945
14 天前
s2555
14 天前
imgkit ,我上个帖子发的字帖生成就用这个,先生成 html ,再转成图片
hetal
14 天前
Oldletter
14 天前
你的 arm 和 x64 还有问题呢(深度踩坑),应该 arm64 上的 pyppeteer 调用 chrome(开源的那个有问题),我之前写的是 pyppeteer 调用 firefox

Dockerfile
```
FROM node:16

# examples: https://github.com/puppeteer/puppeteer/blob/main/docker/Dockerfile

RUN apt-get update \
&& apt-get install -y wget gnupg firefox-esr fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-khmeros fonts-kacst fonts-freefont-ttf libxss1

ENV PUPPETEER_PRODUCT=firefox

WORKDIR /home/app

COPY ./package.json /home/app
COPY ./firefox.js /home/app

RUN npm install
RUN mkdir screenshots

CMD echo “Hello World”
```
调用
```
const puppeteer = require('puppeteer-core');
(async() => {
const browser = await puppeteer.launch({
product: 'firefox',
headless: true,
executablePath: "/usr/bin/firefox",
defaultViewport: { width: 1700, height: 800 },
args: [
]
});

const page = await browser.newPage();

await page.goto('https://www.baidu.com/');
console.log('saving baidu screenshot');
await page.screenshot({ path: 'screenshots/baidu.png', fullPage: true });

await browser.close();

})();
```

环境需要你自己搭建下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1070094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX