将markdown文件和LaTex公式转为word

通义千问等大模型生成的回答多数是markdown类型的,需要将他们转为Word文件

一 pypandoc 介绍

1. 项目介绍
pypandoc 是一个用于 pandoc 的轻量级 Python 包装器。pandoc 是一个通用的文档转换工具,支持多种格式的文档转换,如 Markdown、HTML、LaTeX、DocBook 等。pypandoc 通过提供一个简单的 Python 接口,使得在 Python 脚本中调用 pandoc 变得更加方便。

2. 安装

使用pip安装:
pip install pypandoc_binary
自动下载 Pandoc并安装
注意:pypandoc 提供了两个包:
pypandoc:需要用户自行安装 pandoc软件才能使用。
pypandoc_binary:包含了预编译的 pandoc 二进制文件,方便用户快速上手。

手动安装
可以手动安装pandoc再安装pypandoc库
pip install pypandoc
也可以先安装pypandoc然后再在pyhon中运行 pypandoc.download_pandoc()函数自动下载并安装 Pandoc,将其存放在 pypandoc 可以访问的目录中。

二、使用Python 将markdown转Word
本脚本实现了三类功能
1、将markdown文件转为word文件
2、将 markdown中段落开头的“-“转为回车,避免渲染成黑点或者空心圆等Word中不常见的符号
3、自定义了模板,格式化输出。

import pypandoc
import time
import re# 定义路径
path1 = r"md.md"
path2 = r".docx"
template_path = r"D:\aTools\ytemplates\templates_s.docx"# 读取原始Markdown文件内容
with open(path1, 'r', encoding='utf-8') as file:content = file.read()# 使用正则表达式将以'- '开头的部分替换为换行符
processed_content = re.sub(r'- ', '\n', content)# 记录开始时间
t1 = time.time()# 将处理后的内容转换为Word文档
pypandoc.convert_text(processed_content,'docx',format='md',outputfile=path2,extra_args=['--reference-doc', template_path]
)# 打印耗时
print(time.time() - t1)
print("转换完成!")

三、直接指定Word格式

直接读取文件(可以为txt或者md)转为指定格式的word。
这里格式是:
1、将 markdown中段落开头的“-“转为回车,避免渲染成黑点或者空心圆等Word中不常见的符号
2、将原来加粗部分继续加粗和左对齐
3、字体为黑色GB2312

注意:代码用正则替换####这些时需要先从4级标题开始替换否则会有逻辑错误,导致奇数个#无法替换。

设置中文字体不能用run.font.name = '仿宋_GB2312’而是用style._element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) 设置中文字体。

import re
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn# 定义设置字体和颜色的函数
def set_font_color(run):run.font.name = 'Times New Roman'  # 设置西文字体run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')  # 设置中文字体run.font.size = Pt(12)run.font.color.rgb = RGBColor(0, 0, 0)run.italic = False  # 去除斜体# 定义路径
path1 = r"C:\Users\xueshifeng\Desktop\数据分割.txt"
path2 = r"C:\Users\xueshifeng\Desktop\数据分割.docx"# 读取原始txt文件内容
with open(path1, 'r', encoding='utf-8') as file:content = file.read()# 处理以'- '开头的项目符号
processed_content = re.sub(r'- ', '\n', content)# 创建一个新的Word文档
doc = Document()# 设置默认字体为仿宋_GB2312
style = doc.styles['Normal']
style.font.name = 'Times New Roman'  # 设置西文字体
style._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')  # 设置中文字体
style.font.size = Pt(12)
style.font.color.rgb = RGBColor(0, 0, 0)# 正则表达式模式
bold_pattern = re.compile(r'\*\*(.*?)\*\*')
heading4_pattern = re.compile(r'^\s*####\s*(.*)')  # 四级标题
heading3_pattern = re.compile(r'^\s*###\s*(.*)')  # 三级标题
heading2_pattern = re.compile(r'^\s*##\s*(.*)')  # 二级标题
heading1_pattern = re.compile(r'^\s*#\s*(.*)')  # 一级标题# 处理每一行内容
for line in processed_content.split('\n'):# 检查四级标题heading_match = heading4_pattern.match(line)if heading_match:title_text = heading_match.group(1).strip()if title_text:heading = doc.add_heading(title_text, level=4)heading.alignment = WD_ALIGN_PARAGRAPH.LEFTfor run in heading.runs:set_font_color(run)run.bold = Truecontinue  # 跳过后续处理# 检查三级标题heading_match = heading3_pattern.match(line)if heading_match:title_text = heading_match.group(1).strip()if title_text:heading = doc.add_heading(title_text, level=3)heading.alignment = WD_ALIGN_PARAGRAPH.LEFTfor run in heading.runs:set_font_color(run)run.bold = Truecontinue  # 跳过后续处理# 检查二级标题heading_match = heading2_pattern.match(line)if heading_match:title_text = heading_match.group(1).strip()if title_text:heading = doc.add_heading(title_text, level=2)heading.alignment = WD_ALIGN_PARAGRAPH.LEFTfor run in heading.runs:set_font_color(run)run.bold = Truecontinue  # 跳过后续处理# 检查一级标题heading_match = heading1_pattern.match(line)if heading_match:title_text = heading_match.group(1).strip()if title_text:heading = doc.add_heading(title_text, level=1)heading.alignment = WD_ALIGN_PARAGRAPH.LEFTfor run in heading.runs:set_font_color(run)run.bold = Truecontinue  # 跳过后续处理# 处理普通段落和加粗文本matches = list(bold_pattern.finditer(line))if not matches:paragraph = doc.add_paragraph(line)paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFTfor run in paragraph.runs:set_font_color(run)else:paragraph = doc.add_paragraph()start = 0for match in matches:if match.start() > start:run = paragraph.add_run(line[start:match.start()])set_font_color(run)run = paragraph.add_run(match.group(1))run.bold = Trueset_font_color(run)start = match.end()if start < len(line):run = paragraph.add_run(line[start:])set_font_color(run)paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT# 保存文档
doc.save(path2)print("转换完成!")

四、将LaTex公式转为Word

将 latex_content字符串$ $ 中间的位置替换为公式,或者直接复制代码到GPT,让GPT修改代码

import pypandoc# 定义包含特定公式的LaTeX字符串
#$ $ 中间的位置替换为公式,或者直接复制代码到GPT,让GPT生成最终代码
latex_content = r"""
\documentclass{article}
\usepackage{amsmath} % 确保包含用于数学排版的包
\begin{document}$ L(y_i, f(x_i)) = \max(0, 1 - y_if(x_i)) $\end{document}
"""# 将LaTeX内容转换为Word文档
output_file = r"xx14.docx"output = pypandoc.convert_text(latex_content,  # 输入的字符串'docx',         # 输出格式format='latex', # 输入格式(LaTeX)outputfile=output_file,  # 输出文件路径extra_args=['--mathml']  # 额外参数,确保公式渲染为MathML格式
)# 检查转换是否成功
if output != '':print(f"转换过程中出现错误: {output}")
else:print(f"Word 文档已生成: {output_file}")

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

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

相关文章

kubernetes(二)

文章目录 NamespacePodLabelDeploymentService Namespace 在Kubernetes系统中&#xff0c;Namespace是一种至关重要的资源类型&#xff0c;其主要功能在于实现多套环境的资源隔离或者多租户的资源隔离&#xff0c;默认情况下所有的Pod都能够相互访问&#xff0c;但如果不想让两…

巧妙利用数据结构优化部门查询

目录 一、出现的问题 部门树接口超时 二、问题分析 源代码分析 三、解决方案 具体实现思路 四、优化的效果 一、出现的问题 部门树接口超时 无论是在A项目还是在B项目中&#xff0c;都存在类似的页面&#xff0c;其实就是一个部门列表或者叫组织列表。 从页面的展示形式…

【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟&#xff0c;用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时&#xff0c;头和尾都指向同一个位置。当环形队列为满时&#xff0c;头和尾也都指向同一个位置。 因此&#xff0c; 可以通过加计数器或者标记…

Vue指令v-html

目录 一、Vue中的v-html指令是什么&#xff1f;二、v-html指令与v-text指令的区别&#xff1f; 一、Vue中的v-html指令是什么&#xff1f; v-html指令的作用是&#xff1a;设置元素的innerHTML&#xff0c;内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…

OPENGLPG第九版学习 - 着色器基础

文章目录 2.1 着色器与OpenGL2.2 0penGL的可编程管线2.3 OpenGL着色语言GLSL概述2.3.1 使用GLSL构建着色器变量的声明变量的作用域变量的初始化构造函数 、 类型转换聚合类型访问向量和矩阵中的元素结构体数组多维数组 2.3.2 存储限制符const 存储限制符in 存储限制符out 存储限…

路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)

鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…

Docker Compose的使用

文章首发于我的博客&#xff1a;https://blog.liuzijian.com/post/docker-compose.html 目录 Docker Compose是什么Docker Compose安装Docker Compose文件Docker Compose常用命令案例&#xff1a;部署WordPress博客系统 Docker Compose是什么 Docker Compose是Docker官方的开源…

AP单类平均准确率

P_true N_true P_pred TP Fp N_pred FN TNP NTP&#xff08;真正样本&#xff0c;与真实框IoU大于阈值的框&#xff09; FP&#xff08;假正样本&#xff0c;与真实框IoU小于阈值的框&#xff09; TN&#xff08;真负样本&#xff0c;背景&#xff09;…

Leetcode—1427. 字符串的左右移【简单】Plus

2025每日刷题&#xff08;206&#xff09; Leetcode—1427. 字符串的左右移 实现代码 class Solution { public:string stringShift(string s, vector<vector<int>>& shift) {// shift[i] [dir, amount]// dir 0(左) or 1(右)// 左表示正, 右表示负int len…

机器学习10

自定义数据集 使用scikit-learn中svm的包实现svm分类 代码 import numpy as np import matplotlib.pyplot as pltclass1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])class2_points np.array([[3.2, 3.2],[3.7, 2.9],…

股票入门知识

股票入门&#xff08;更适合中国宝宝体制&#xff09; 股市基础知识 本文介绍了股票的基础知识&#xff0c;股票的分类&#xff0c;各板块发行上市条件&#xff0c;股票代码&#xff0c;交易时间&#xff0c;交易规则&#xff0c;炒股术语&#xff0c;影响股价的因素&#xf…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…

C#,入门教程(11)——枚举(Enum)的基础知识和高级应用

上一篇&#xff1a; C#&#xff0c;入门教程(10)——常量、变量与命名规则的基础知识https://blog.csdn.net/beijinghorn/article/details/123913570 不会枚举&#xff0c;就不会编程&#xff01; 枚举 一个有组织的常量系列 比如&#xff1a;一个星期每一天的名字&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上&#xff0c;主要对分布式应用架构下的异步化机制和缓存技术进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。大家知道原来传统的单一WAR应用中&#xff0c;由于所有数据都在同一个数据库中&#xff0c;因此事务问题一般借助数据库事…

【C++】继承(下)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的继承&#xff08;下&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承8.继…

基于LLM的路由在专家混合应用:一种新颖的交易框架,该框架在夏普比率和总回报方面提升了超过25%

“LLM-Based Routing in Mixture of Experts: A Novel Framework for Trading” 论文地址&#xff1a;https://arxiv.org/pdf/2501.09636 摘要 随着深度学习和大语言模型&#xff08;LLMs&#xff09;的不断进步&#xff0c;混合专家&#xff08;MoE&#xff09;机制在股票投资…

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University&#xff0c;然后实际内容不完全基于它&#xff0c;因为它的例子还是基于.NET Core 3.1做的&#xff0c;距离现在很遥远了。 截至本文撰写的时间&#xff0c;2025年&#xff0c;最新的.NET是.NET9了都&#xff0c;可能1…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…