V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
copriwolf
V2EX  ›  问与答

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

  •  1
     
  •   copriwolf · 2021-07-16 13:23:02 +08:00 · 2335 次点击
    这是一个创建于 1237 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # 背景
    有一些监控类需求,希望能够生成一张包含数据面板的图片,推送到需要的人群。目前可以生成出 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
        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   ·   实用小工具   ·   3489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:13 · PVG 19:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.