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.rhkb.cn/news/4002.html

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

相关文章

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…

ARP Check

ARP Check所解决的问题 ARP Check主要用于解决ARP欺骗的问题&#xff0c;依赖于DHCP SnoopingIP Source Guard或者是端口安全全局地址绑定来达到防止ARP欺骗的作用 一旦在端口下配置了ARP Check功能&#xff0c;那么如果不是表项中所对应的IPMAC或是IP的话&#xff0c;就会拒…

通信协议之多摩川编码器协议

前言 学习永无止境&#xff01;本篇是通信协议之多摩川编码器协议&#xff0c;主要介绍RS485硬件层以及软件层帧格式。 注&#xff1a;本文章为学习笔记&#xff0c;部分图片与文字来源于网络/应用手册&#xff0c;如侵权请联系&#xff01;谢谢&#xff01; 一、多摩川协议概述…

Web前端第一次作业

主页代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>主页</title> …

力扣动态规划-2【算法学习day.96】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

LINUX 内核设计于实现 阅读记录(2025.01.14)

文章目录 一、内核历史1、内核简介2、LINUX 内核与 UNIX 内核比较3、LINUX内核版本命名 二、从内核出发1、获取内核源码&#xff08;1&#xff09;查看Linux内核版本 uname -r&#xff08;2&#xff09;下载源码 https://www.kernel.org/&#xff08;3&#xff09;编译内核 2、…

Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5

大家好&#xff0c;我是编程乐趣。 行业诸多大佬一直在说&#xff1a;“‌2025年将是AI应用元年‌”&#xff0c;虽然说大佬的说法不一定对&#xff0c;但AI趋势肯定没错的。 对于我们程序员来说&#xff0c;储备AI应用开发技能&#xff0c;不管对找工作、接项目、创业肯定是…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…

【机器学习实战入门】基于深度学习的乳腺癌分类

什么是深度学习&#xff1f; 作为对机器学习的一种深入方法&#xff0c;深度学习受到了人类大脑和其生物神经网络的启发。它包括深层神经网络、递归神经网络、卷积神经网络和深度信念网络等架构&#xff0c;这些架构由多层组成&#xff0c;数据必须通过这些层才能最终产生输出。…

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时&#xff0c;是在地址:端口/Controller名称进行访问的&#xff0c;这个时候Controller的默认路由配置如下 访问接口时&#xff0c;是通过请求方法&#xff08;GET、Post、Put、Delete&#xff09;进行接口区分的&…

TextButton组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了CircleAvatar Widget,本章回中将介绍Button这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 关于Button相信大家都很熟悉&#xff0c;也就是我们常用的按钮。用户按下按钮后…

3. 后端验证前端Token

书接上回&#xff0c;后端将token返回给前端&#xff0c;前端存入cookie&#xff0c;每次前端给后端发送请求&#xff0c;后端是如何验证的。 若依是用过滤器来实现对请求的验证&#xff0c;过滤器的简单理解是每次发送请求的时候先发送给过滤器执行逻辑判断以及处理&#xff0…

RabbitMQ-消息可靠性以及延迟消息

目录 消息丢失 一、发送者的可靠性 1.1 生产者重试机制 1.2 生产者确认机制 1.3 实现生产者确认 &#xff08;1&#xff09;开启生产者确认 &#xff08;2&#xff09;定义ReturnCallback &#xff08;3&#xff09;定义ConfirmCallback 二、MQ的持久化 2.1 数据持久…

大文件上传服务-后端V1V2

文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节&#xff0c;把之前做的项目拿过来总结一下&#xff0c;自己写的一个…

Web小练习01

#制作简易网页# 本章包括主页、注册页面、登陆页面 主页 1.1主页代码如下 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

SpringBoot多级配置文件

1.问题先导 有这样的场景&#xff0c;我们开发完毕后需要测试人员进行测试&#xff0c;由于测试环境和开发环境的很多配置都不相同&#xff0c;所以测试人员在运 行我们的工程时需要临时修改很多配置&#xff0c;如下 java –jar springboot.jar –-spring.profiles.activete…

2,Linux文件基本属性(基于Ubuntu示例进行讲解)

创建文件 创建文件touch命令创建文件夹mkdir命令写入文件内容echo命令 # 创建文件夹&#xff0c;文件夹名称为demo_001 mkdir demo_001# 创建文件&#xff0c;文件名称为demo_file_001.py touch demo_file_001.py# 写入内容到文件中&#xff0c;例如写入print("hello wo…

蓝桥杯训练—斐波那契数列

文章目录 一、题目二、解析三、代码 一、题目 求100以内的斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列 &#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&…

nginx 配置防爬虫

今天早上查看服务器&#xff0c;发现昨天发布的一个在线解析充电桩协议的网页工具有大量的访问记录&#xff0c;应该是爬虫在爬api接口数据。该工具api接口后台用的是python写的&#xff0c;和大多数项目一样也采用nginx反向代理&#xff0c;由于采用nginx&#xff0c;可以利用…

Mockito+PowerMock+Junit单元测试

一、单元测试用途 1、日常开发团队要求规范&#xff0c;需要对开发需求代码进行单元测试并要求行覆盖率达到要求&#xff0c;DevOps流水线也会开设相关门禁阀值阻断代码提交&#xff0c;一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于…