RockChinQ / LangBot

[WebUI Beta 测试✨] 😎高稳定、🧩支持扩展、🦄多模态的 ChatGPT QQ / QQ频道 / One Bot 机器人🤖 | 支持 OpenAI GPT、Claude、Gemini Pro、Moonshot(Kimi)、gpt4free、Ollama、Gitee AI、dify 的 QQ / QQ频道 / OneBot 机器人 / Agent 平台;原名 QChatGPT
https://docs.langbot.app
GNU Affero General Public License v3.0
4.47k stars 334 forks source link

[Feature]: 增加markdown转图片的原生支持 #793

Open bobandbrony opened 6 months ago

bobandbrony commented 6 months ago

这是一个?

新功能

详细描述

这样使用更稳定,而不是使用插件

RockChinQ commented 6 months ago

推荐用什么markdown转图片的方案?要轻便、支持中文的

bobandbrony commented 6 months ago

推荐用什么markdown转图片的方案?要轻便、支持中文的

这我就不清楚了,我不是做开发的,但我之前用的chatbot项目就支持,你可以去看看?地址https://github.com/lss233/chatgpt-mirai-qq-bot

RockChinQ commented 6 months ago

目前调研,转图片只找到有wkhtmltoimage或者playwright的方案,这些方案都需要非纯python实现的依赖软件,暂时不考虑添加此类依赖。如果你有找到纯python实现的、轻量的、支持中文的md转image方案,会加快这个解决进度。

bobandbrony commented 5 months ago

目前调研,转图片只找到有wkhtmltoimage或者playwright的方案,这些方案都需要非纯python实现的依赖软件,暂时不考虑添加此类依赖。如果你有找到纯python实现的、轻量的、支持中文的md转image方案,会加快这个解决进度。

理解你的需求,希望找到一个纯Python、轻量且支持中文的Markdown转图片方案。以下是一个可以满足你需求的方案,基于 markdown2Pillow,并且考虑了中文字体的支持。

方案:使用 markdown2Pillow

  1. 安装依赖

    pip install markdown2 pillow beautifulsoup4
  2. 代码实现

    import markdown2
    from PIL import Image, ImageDraw, ImageFont
    from bs4 import BeautifulSoup
    import textwrap
    
    def markdown_to_image(markdown_text, output_path, font_path='arial.ttf', font_size=20):
       # 将 Markdown 转换为 HTML
       html = markdown2.markdown(markdown_text)
    
       # 使用 BeautifulSoup 解析 HTML
       soup = BeautifulSoup(html, 'html.parser')
       text = soup.get_text()
    
       # 设置图片大小和字体
       width, height = 800, 600
       image = Image.new('RGB', (width, height), 'white')
       draw = ImageDraw.Draw(image)
    
       # 尝试加载指定路径的字体文件
       try:
           font = ImageFont.truetype(font_path, font_size)
       except IOError:
           # 如果无法加载指定字体文件,使用默认字体
           font = ImageFont.load_default()
    
       # 自动换行处理
       margin = 10
       offset = 10
       for line in textwrap.wrap(text, width=70):  # 70 是每行字符数,可根据需要调整
           draw.text((margin, offset), line, font=font, fill='black')
           offset += font.getsize(line)[1] + 5  # 行高调整
    
       # 保存图片
       image.save(output_path)
    
    markdown_text = """
    # 标题
    这是一个支持中文的 Markdown 示例。
    - 项目1
    - 项目2
    """
    markdown_to_image(markdown_text, 'output.png', font_path='/path/to/your/chinese/font.ttf')

说明:

  1. 字体文件

    • 请确保你提供的 font_path 指向一个支持中文的字体文件,例如 SimHei.ttf(黑体)或其他中文字体文件。
    • 如果你在 Windows 系统上,可以使用系统自带的中文字体,如 C:\\Windows\\Fonts\\simhei.ttf
  2. 文本换行

    • 使用 textwrap.wrap 来自动处理文本换行,以适应图片宽度。
  3. 图片大小

    • 你可以根据需要调整图片的宽度和高度,以及字体大小。

这个方案完全基于纯Python实现,轻量且支持中文,可以满足你的需求。如果有任何问题或需要进一步的调整,请随时告诉我。

看看这个?gpt-4o的建议