python(25) : 含有大模型生成的公式的文本渲染成图片并生成word文档(支持flask接口调用)

公式样例

渲染前

 \[\sqrt{1904.615384} \approx 43.64\]

渲染后

安装依赖


pip install matplotlib  -i https://mirrors.aliyun.com/pypi/simple/ requestspip install sympy  -i https://mirrors.aliyun.com/pypi/simple/ requestspip install python-docx -i https://mirrors.aliyun.com/pypi/simple/ requests

代码

# -*- coding: utf-8 -*-# ====> 数学公式导出处理 <==== #import os
import tracebackimport matplotlib
from docx import Documentfrom common.conf import doc_handle_path
from common.util import generate_time_random_codestart_marker = "\["
end_marker = "\]"output_tmp_folder = f'{doc_handle_path}math_2_img{os.sep}'
if not os.path.exists(output_tmp_folder):os.mkdir(output_tmp_folder)def is_have_math(text):s_count = text.count('\[')e_count = text.count('\]')if s_count >= e_count or e_count >= s_count:return Truereturn Falsedef find_and_replace(text, start_marker="\[", end_marker="\]"):"""查找并替换由_start和_end包围的文本。:param text: 需要处理的原始文本:param start_marker: 标记开始的字符串,默认为"_start":param end_marker: 标记结束的字符串,默认为"_end":return: 替换后的文本"""result_parts = []  # 存储结果片段current_position = 0  # 当前处理到的位置while True:start_pos = text.find(start_marker, current_position)if start_pos == -1:# 没有找到更多的_start标记,将剩余部分添加到结果中并退出循环result_parts.append(text[current_position:])break# 添加_start之前的部分到结果中result_parts.append(text[current_position:start_pos])# 查找对应的_end标记end_pos = text.find(end_marker, start_pos + len(start_marker))if end_pos == -1:# 如果没有找到_end标记,则将剩余部分全部添加到结果中并退出result_parts.append(text[start_pos:])break# 提取并处理_start和_end之间的文本content = text[start_pos + len(start_marker):end_pos]processed_content = '111'  # 定义你自己的处理逻辑print(content)# 将处理后的内容添加到结果中result_parts.append(processed_content)# 更新当前处理位置为_end之后current_position = end_pos + len(end_marker)# 返回拼接后的最终结果return ''.join(result_parts)def replace_first_closing_brace(text, split_marker=r'\(\boxed{', start_tag='[', end_tag=']'):"""根据split_marker切割文本,并将每个元素的第一个"}"替换为replacement字符。:param text: 需要处理的原始文本:param split_marker: 用于切割文本的标记,默认为'\(\boxed{':param replacement: 用来替换第一个'}'的字符,默认为'_':return: 处理后的文本"""# 如果没有split_marker,则直接返回原textif split_marker not in text:return text# 根据split_marker切割文本parts = text.split(split_marker)# 第一个元素是split_marker之前的内容,不需要处理processed_parts = [parts[0]]for part in parts[1:]:# 找到第一个"}"的位置并替换为replacementclosing_brace_index = part.find('}')if closing_brace_index != -1:new_part = part[:closing_brace_index] + end_tag + part[closing_brace_index + 3:]else:new_part = part  # 如果没有找到"}",则保持原样processed_parts.append(new_part)# 将处理后的部分重新组合成新的字符串result = split_marker.join(processed_parts)if split_marker in result:result = result.replace(split_marker, start_tag)return resultdef math_generate_docx(text, path):# 创建新的Document对象document = Document()# 添加标题# document.add_heading('Document Title', 0)current_position = 0  # 当前处理到的位置imgs = []while True:start_pos = text.find(start_marker, current_position)if start_pos == -1:# 没有找到更多的_start标记,将剩余部分添加到结果中并退出循环other_text = replace_first_closing_brace(text[current_position:])document.add_paragraph(other_text)break# 添加_start之前的部分到结果中document.add_paragraph(text[current_position:start_pos])# 查找对应的_end标记end_pos = text.find(end_marker, start_pos + len(start_marker))if end_pos == -1:# 如果没有找到_end标记,则将剩余部分全部添加到结果中并退出document.add_paragraph(text[start_pos:])break# 提取并处理_start和_end之间的文本content = text[start_pos + len(start_marker):end_pos]math_img_path = math_2_img(content)if math_img_path:imgs.append(math_img_path)document.add_picture(math_img_path)else:document.add_paragraph(content)# 更新当前处理位置为_end之后current_position = end_pos + len(end_marker)# 保存文档到本地document.save(path)for img in imgs:if os.path.exists(img):os.remove(img)def math_2_img(text):text = text.replace('\n', '')formula = r"$" + text + "$"matplotlib.use('Agg')import matplotlib.pyplot as plttry:# 创建一个只包含公式的图像plt.figure(figsize=(6, 1))  # 调整大小以适应公式plt.text(0.5, 0.5, formula, fontsize=20, ha='center', va='center')plt.axis('off')  # 关闭坐标轴# 保存图像到本地output_tmp_path = f'{output_tmp_folder}{generate_time_random_code(5)}.png'plt.savefig(output_tmp_path, bbox_inches='tight', pad_inches=0.1, dpi=300)except:traceback.print_exc()return Noneplt.close()return output_tmp_pathif __name__ == '__main__':s = r"""为了解决这个问题,我们将按照以下步骤进行:1. 计算58和64的乘积。
2. 将结果除以3.12。
3. 将结果乘以1.6。
4. 对结果取平方根。让我们从第一步开始:1. 计算58和64的乘积:\[58 \times 64 = 3712\]2. 将3712除以3.12:\[\frac{3712}{3.12} \approx 1190.384615\]3. 将1190.384615乘以1.6:\[1190.384615 \times 1.6 \approx 1904.615384\]4. 对1904.615384取平方根:\[\sqrt{1904.615384} \approx 43.64\]因此,最后的得数是 \(\boxed{43.64}\)。   
"""math_generate_docx(s, 'example.docx')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM宠物医院信息管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 宠…

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

PostgreSQL-01-入门篇-简介

文章目录 1. PostgreSQL是什么?2. PostgreSQL 历史 2.1. 伯克利 POSTGRES 项目2.2. Postgres952.3. PostgreSQL来了 3. PostgreSQL vs MySQL4. 安装 4.1 Windows 安装4.2 linux 安装4.3 docker安装 1. PostgreSQL是什么 PostgreSQL 是一个基于加州大学伯克利分校计算机系开…

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…

一文夯实垃圾收集的理论基础

如何判断一个引用是否存活 引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 优点&#xff1a;可即刻回收垃圾&a…

Spring Boot 配置(官网文档解读)

目录 摘要 Spring Boot 配置加载顺序 配置文件加载顺序 Spring Boot 配置加载方式 Value Value 注解简单示例 ConfigurationProperties 启动 ConfigurationProperties ConfigurationProperties 验证 ConfigurationProperties 与 Value 对比 Autowired Autowired 自…

一款功能强大的互联网资产测绘引擎-CyberEdge

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 CyberEdge简洁而强大的互联网资产测绘工具核心特性搭建指南快…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…

【优选算法】----移动零

好久没写博客的兄弟姐妹们~ 今天来写一篇算法过过水吧~ --------------------------------------begin---------------------------------------- 题目要求&#xff1a; 给的难度是简单哦 题目解析&#xff1a; 这道题的思路可以借助双指针的思想&#xff0c;定义dest和c…

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式&#xff1f;2、观察者模式优缺点及注意事项&#xff1f;3、观察者模式实现&#xff1f;4、手写线程安全的观察者模式&#xff1f; 1、什么是观察者模式&#xff1f; - 实例&#xff1a;现实生活中很多事物都是依赖存在的&#x…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter

前言 在微服务架构中&#xff0c;API 网关扮演着至关重要的角色&#xff0c;负责路由请求、执行安全验证、流量控制等任务。Spring Cloud Gateway 作为一个强大的网关解决方案&#xff0c;提供了灵活的方式来实现这些功能。 本篇博客将重点介绍如何在 Spring Cloud Gateway 中…

Redis源码-redisObject

解释 redis中&#xff0c;所有的数据类型最终都转换成了redisObject&#xff0c;该结构体的定义&#xff0c;在文件server.h中。 参数说明 参数名说明unsigned type:4对象对应的数据类型unsigned encoding:4对象的编码方式unsigned lru:LRU_BITSLRU算法清空对象&#xff0c…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

js重要知识点

目录 一、冒泡排序的计算方法 二、数组forEach方法 三、Number(null)和Number(undefined) 四、es6中的set 一、冒泡排序的计算方法 冒泡排序的重点:两次循环&#xff0c;外层循环是总共要进行的躺数,为数组总长度-1,内层循环则是每个元素在每一次循环中需要比较的次数&#xff…