保存内容到word

import mistune
from docx import Document
from docx.shared import Inches
from bs4 import BeautifulSoup
import requests
from io import BytesIO

# 使用 Mistune 解析器,确保支持 GitHub 风格的表格
markdown_parser = mistune.create_markdown(renderer='html', plugins=['table'])

def download_image(url):
"""根据 URL 下载图片并返回字节流"""
response = requests.get(url)
response.raise_for_status() # 如果请求失败,则抛出异常
return BytesIO(response.content)

def convert_markdown_to_word(md_content, output_path):
"""
将 Markdown 内容转换为 Word 文档,并确保表格和其他元素正确格式化。

:param md_content: Markdown 格式的字符串内容
:param output_path: 输出的 Word 文档路径
"""
try:
# 解析 Markdown 内容为 HTML
html_content = markdown_parser(md_content)

# 使用 BeautifulSoup 来解析 HTML 并提取元素
soup = BeautifulSoup(html_content, 'html.parser')

# 创建一个新的 Word 文档
doc = Document()

def process_element(element):
"""根据 HTML 元素类型添加相应格式的内容到文档"""
if element.name in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:
p = doc.add_paragraph(element.get_text(), style=f'Heading {element.name[1]}')
elif element.name == 'p':
for img in element.find_all('img'):
# 处理段落中的图片
image_url = img['src']
try:
image_stream = download_image(image_url)
doc.add_picture(image_stream, width=Inches(4)) # 调整宽度以适应页面
except Exception as e:
print(f"无法下载或插入图片 {image_url}: {e}")
doc.add_paragraph(f"无法加载图片: {image_url}")
text = element.get_text(strip=True)
if text:
doc.add_paragraph(text)
elif element.name in ['ul', 'ol']:
for item in element.find_all('li', recursive=False):
p = doc.add_paragraph(style='List Bullet' if element.name == 'ul' else 'List Number')
p.add_run(item.get_text())
elif element.name == 'strong':
p = doc.add_paragraph()
run = p.add_run(element.get_text())
run.bold = True
elif element.name == 'em':
p = doc.add_paragraph()
run = p.add_run(element.get_text())
run.italic = True
elif element.name == 'code':
p = doc.add_paragraph(style='Code') # 假设有自定义的 Code 样式
run = p.add_run(element.get_text())
run.font.name = 'Courier New'
elif element.name == 'table':
# 提取表格数据
table_data = [[cell.get_text(strip=True) for cell in row.find_all(['td', 'th'])]
for row in element.find_all('tr')]

# 创建一个表格
table = doc.add_table(rows=0, cols=len(table_data[0]))
table.style = 'Table Grid' # 设置表格样式

# 添加表头
hdr_cells = table.add_row().cells
for i, header in enumerate(table_data[0]):
hdr_cells[i].text = header
hdr_cells[i].paragraphs[0].runs[0].font.bold = True # 表头文字加粗

# 添加表格内容
for row_data in table_data[1:]:
row_cells = table.add_row().cells
for i, item in enumerate(row_data):
row_cells[i].text = item

# 处理所有顶级 HTML 元素
for element in soup.find_all(recursive=False):
process_element(element)

# 保存文档
doc.save(output_path)
print(f"Markdown 内容已成功转换并保存到 {output_path}")

except Exception as e:
print(f"转换过程中发生错误: {e}")

if __name__ == "__main__":
# 示例 Markdown 内容
md_content = """
# 这是标题 1
这是一个普通的段落。

## 这是标题 2
这是另一个段落,包含 **粗体** 和 *斜体*。

### 这是标题 3
- 无序列表项 1
- 无序列表项 2
1. 有序列表项 1
2. 有序列表项 2

| 表头1 | 表头2 | 表头3 |
| --- | --- | --- |
| 单元格1 | 单元格2 | 单元格3 |
| 单元格4 | 单元格5 | 单元格6 |

### 这是标题 3
这是另一个段落,包含 **粗体** 和 *斜体*。

![这是一个示例图片](https://xxx.com/17351829252111.png "示例图片标题")

"""

# 指定输出文件路径
output_path = 'output.docx'

# 调用函数将 Markdown 内容转换为 Word 文档
convert_markdown_to_word(md_content, output_path)


相关推荐

  • 生成图片

    from PIL import Image, ImageColor, ImageDraw, ImageFont, ImageFilterdef create_image_with_text(size, color, text, font_path, font_size, text_color, shadow_color, output_path): """ Create a new image of specified size and color with centered text that has a border and shadow. :param size: A tuple con

  • 获取指定目录下的所有图片信息

    1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (

  • Thinkphp各版本的PHP要求

    ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3