请教 Golang 如何 Markdown/Html/文字 生成图片?

2021-07-16 13:23:02 +08:00
 copriwolf
# 背景
有一些监控类需求,希望能够生成一张包含数据面板的图片,推送到需要的人群。目前可以生成出 HTML 源码、Makrdown 源码等。

# 问题
如何用 Go 在容器里不依靠系统,把 HTML/Markdown/纯文字 渲染出图片?可行吗?

# 尝试解决
1. 目前只想到,生成 HTML,然后用 headless-chrome 去截图,但是 headless-chrome 需要 linux/pc 系统支持。
2029 次点击
所在节点    问与答
20 条回复
jdhao
2021-07-16 13:25:43 +08:00
想把 html 源码和 markdown 源码截图,还是渲染以后的页面截图?
zoharSoul
2021-07-16 13:25:54 +08:00
如果 svg 算图片的话,
弄好模板, 直接往里面替换变量即可
copriwolf
2021-07-16 13:26:12 +08:00
@jdhao 需要渲染以后的页面截图。
copriwolf
2021-07-16 13:27:02 +08:00
@zoharSoul 请教,普通浏览器、微信、企业微信应该不能直接打开 svg,所以目标人群可能还是看不到图片。
zoharSoul
2021-07-16 13:43:35 +08:00
@copriwolf #4 浏览器可以打开 svg, 微信我没试过..
Thinklong
2021-07-16 13:48:49 +08:00
建议用 go-chart 之类的库生成图表图片,然后发图片地址
copriwolf
2021-07-16 14:00:49 +08:00
@Thinklong 先接入企业微信生态直接推送到人,但是图片要 jpeg/png
copriwolf
2021-07-16 14:01:17 +08:00
jdhao
2021-07-16 14:04:33 +08:00
用 pandoc 先把源码转为 pdf,然后再对 pdf 截图(imagemagick)
copriwolf
2021-07-16 14:06:35 +08:00
@jdhao pandoc 是否需要系统底层支持?主要是考量部署到容器里,pandoc 需要类似 headless-chrome 需要系统层面支持,不好扩展或者做成微服务。
jdhao
2021-07-16 14:09:16 +08:00
@copriwolf 把 pandoc 需要的组建,以及 imagemagick 都做成 docker 容器就可以了
copriwolf
2021-07-16 14:12:43 +08:00
@jdhao 谢谢你的提议,感觉的确是一个方向不错的。但是涉及到包一个 imaeg docker 进去,不好和运维对接,记录下来了谢谢
zjj19950716
2021-07-16 16:52:59 +08:00
Puppeteer
0001110001011
2021-07-16 17:03:11 +08:00
htmlurl----> api(go)---> cmd(node puppeteer.js)----> save image

思路仅供参考。
------------------------------------

前段时间大概写了个这样的。 在 https://github.com/IT-Weekly/APP 里面

它是为了提供一些不可访问页面,提供 Image 缓存,供观看。。
copriwolf
2021-07-16 17:46:14 +08:00
@zjj19950716 Puppeteer 我理解其实就是 headless-chrome,他只是在上面封装了一层 nodejs 接口
copriwolf
2021-07-16 17:49:12 +08:00
@0001110001011 哈哈谢谢,我内部也实现了一个类似的东西,不过我不经过 node 的 puppeteer,直接在 go 调用 headless-chrome 的 go 库拉起模拟登陆和截图。
但是最主要的问题是,headless-Chrome 太笨重了,我还特意把它放在一个容器里分开部署,有时候还很吃内存。我想实现一个可以在代码层面的图片生成转换,目前看比较难,只能从 svg 入手。
Muninn
2021-07-16 19:34:07 +08:00
我生成海报用的 gg 这个库

没有特别现成的其实

懒得实现一遍只能曲线救国了
0001110001011
2021-07-17 00:31:54 +08:00
@copriwolf 但是 puppeteer 有个问题,就是导致 chrome 假死线程会很多,所以,我还有个脚本,定时 kill 所有的进程,以免 僵尸进程太多导致资源占用。
copriwolf
2021-07-19 13:12:53 +08:00
@Muninn 感谢,大概看了下这个库可以直接渲染文字!我试试。
zjj19950716
2021-07-20 15:23:36 +08:00
@copriwolf Puppeteer runs headless by default, but can be confi gured to run full (non-headless) Chrome or Chromium. 没用过不太清楚,不过简介这么写的

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

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

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

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

© 2021 V2EX