请教 Golang 如何 Markdown/Html/文字 生成图片? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
copriwolf
V2EX    问与答

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

  •  1
     
  •   copriwolf 2021-07-16 13:23:02 +08:00 2883 次点击
    这是一个创建于 1552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # 背景
    有一些监控类需求,希望能够生成一张包含数据面板的图片,推送到需要的人群。目前可以生成出 HTML 源码、Makrdown 源码等。

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

    # 尝试解决
    1. 目前只想到,生成 HTML,然后用 headless-chrome 去截图,但是 headless-chrome 需要 linux/pc 系统支持。
    20 条回复    2021-07-20 15:23:36 +08:00
    jdhao
        1
    jdhao  
       2021-07-16 13:25:43 +08:00 via Android
    想把 html 源码和 markdown 源码截图,还是渲染以后的页面截图?
    zoharSoul
        2
    zoharSoul  
       2021-07-16 13:25:54 +08:00
    如果 svg 算图片的话,
    弄好模板, 直接往里面替换变量即可
    copriwolf
        3
    copriwolf  
    OP
       2021-07-16 13:26:12 +08:00
    @jdhao 需要渲染以后的页面截图。
    copriwolf
        4
    copriwolf  
    OP
       2021-07-16 13:27:02 +08:00
    @zoharSoul 请教,普通浏览器、微信、企业微信应该不能直接打开 svg,所以目标人群可能还是看不到图片。
    zoharSoul
        5
    zoharSoul  
       2021-07-16 13:43:35 +08:00
    @copriwolf #4 浏览器可以打开 svg, 微信我没试过..
    Thinklong
        6
    Thinklong  
       2021-07-16 13:48:49 +08:00
    建议用 go-chart 之类的库生成图表图片,然后发图片地址
    copriwolf
      &nsp; 7
    copriwolf  
    OP
       2021-07-16 14:00:49 +08:00 via iPhone
    @Thinklong 先接入企业微信生态直接推送到人,但是图片要 jpeg/png
    copriwolf
        8
    copriwolf  
    OP
       2021-07-16 14:01:17 +08:00 via iPhone
    jdhao
        9
    jdhao  
       2021-07-16 14:04:33 +08:00 via Android
    用 pandoc 先把源码转为 pdf,然后再对 pdf 截图(imagemagick)
    copriwolf
        10
    copriwolf  
    OP
       2021-07-16 14:06:35 +08:00
    @jdhao pandoc 是否需要系统底层支持?主要是考量部署到容器里,pandoc 需要类似 headless-chrome 需要系统层面支持,不好扩展或者做成微服务。
    jdhao
        11
    jdhao  
       2021-07-16 14:09:16 +08:00 via Android
    @copriwolf 把 pandoc 需要的组建,以及 imagemagick 都做成 docker 容器就可以了
    copriwolf
        12
    copriwolf  
    OP
       2021-07-16 14:12:43 +08:00
    @jdhao 谢谢你的提议,感觉的确是一个方向不错的。但是涉及到包一个 imaeg docker 进去,不好和运维对接,记录下来了谢谢
    zjj19950716
        13
    zjj19950716  
       2021-07-16 16:52:59 +08:00
    Puppeteer
    0001110001011
        14
    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
        15
    copriwolf  
    OP
       2021-07-16 17:46:14 +08:00
    @zjj19950716 Puppeteer 我理解其实就是 headless-chrome,他只是在上面封装了一层 nodejs 接口
    copriwolf
        16
    copriwolf  
    OP
       2021-07-16 17:49:12 +08:00
    @0001110001011 哈哈谢谢,我内部也实现了一个类似的东西,不过我不经过 node 的 puppeteer,直接在 go 调用 headless-chrome 的 go 库拉起模拟登陆和截图。
    但是最主要的问题是,headless-Chrome 太笨重了,我还特意把它放在一个容器里分开部署,有时候还很吃内存。我想实现一个可以在代码层面的图片生成转换,目前看比较难,只能从 svg 入手。
    Muninn
        17
    Muninn  
       2021-07-16 19:34:07 +08:00   1
    我生成海报用的 gg 这个库

    没有特别现成的其实

    懒得实现一遍只能曲线救国了
    0001110001011
        18
    0001110001011  
       2021-07-17 00:31:54 +08:00   1
    @copriwolf 但是 puppeteer 有个问题,就是导致 chrome 假死线程会很多,所以,我还有个脚本,定时 kill 所有的进程,以免 僵尸进程太多导致资源占用。
    copriwolf
        19
    copriwolf  
    OP
       2021-07-19 13:12:53 +08:00
    @Muninn 感谢,大概看了下这个库可以直接渲染文字!我试试。
    zjj19950716
        20
    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. 没用过不太清楚,不过简介这么写的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5894 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 06:24 PVG 14:24 LAX 23:24 JFK 02:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86