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
这是另一个段落,包含 **粗体** 和 *斜体*。  

"""
    # 指定输出文件路径
    output_path = 'output.docx'
    # 调用函数将 Markdown 内容转换为 Word 文档
    convert_markdown_to_word(md_content, output_path)保存内容到word
相关推荐
- 
                            
生成图片
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
查看详情 
								    智享笔记