AI 生成的 Markdown 每天都有,但要转成 Word 时,在线工具让人不放心——文件上传到云端,隐私没保障;而且 AI 换行经常在 Word 里挤成一团。我习惯用 Pandoc 加一段 Python 脚本在本地完成转换,既不用联网,又能保住排版。
先装 Pandoc
Pandoc 是个命令行工具,没有图形界面,但转换质量是公认最好的。
Windows
去 Pandoc GitHub Releases 下后缀为 .msi 的安装包,比如 pandoc-3.x.x-windows-x86_64.msi。安装时保持默认选项('Install for all users'一般已经勾上了)。装完按 Win + R,输入 cmd,在黑框里敲 pandoc -v,能看到版本信息就说明成了。
macOS
同样在 Releases 页下载 .pkg 包,双击按提示安装。然后打开终端输入 pandoc -v 检查。
为什么需要 Python 打个辅助
直接用 Pandoc 转 AI 生成的 Markdown,常见的问题是'软换行'会被合并。比如原文里两行文字,转成 Word 就粘成一段了。解决办法是在非空行之间补空行,迫使 Pandoc 把它们当独立段落。但简单地在每行后加空行会毁掉表格——表格行一断,结构就散了。
所以得让脚本能认出表格,只对普通文本行加空行。
智能预处理脚本
下面这段脚本做三件事:
- 普通文本行之间插入空行,段落分明
- 表格内部(以
|开头的行)保持原样,不插空行 - 表格前后自动补空行,防止和正文粘连
把代码存成 md2docx.py,你的电脑需要装了 Python。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import shutil
def preprocess_markdown(content):
""" 预处理 Markdown 文本:
1. 普通文本行之间插入空行,防止 Pandoc 将它们合并为一段。
2. 表格内部(以 | 开头)保持原样,不插入空行。
3. 表格前后确保有空行进行隔离。
"""
lines = content.split('\n')
processed_lines = []
in_table = False
for i, line in enumerate(lines):
stripped = line.strip()
# 简单的 Markdown 表格行判断:以竖线开头
is_table_row = stripped.startswith('|')
if is_table_row:
if in_table:
processed_lines processed_lines[-].strip() != :
processed_lines.append()
in_table =
processed_lines.append(line)
:
in_table:
in_table =
processed_lines.append()
processed_lines.append(line)
stripped stripped.startswith():
processed_lines.append()
.join(processed_lines)
():
shutil.which():
()
file_path = os.path.abspath(input_file)
folder = os.path.dirname(file_path)
filename = os.path.basename(file_path)
filename_no_ext = os.path.splitext(filename)[]
temp_md_file = os.path.join(folder, )
output_docx = os.path.join(folder, )
:
()
(file_path, , encoding=) f:
raw_content = f.read()
clean_content = preprocess_markdown(raw_content)
(temp_md_file, , encoding=) f:
f.write(clean_content)
cmd =
()
result = subprocess.run(cmd, shell=, capture_output=, text=)
result.returncode == :
()
()
:
()
Exception e:
()
:
os.path.exists(temp_md_file):
os.remove(temp_md_file)
__name__ == :
(sys.argv) > :
target_file = sys.argv[]
run_conversion(target_file)
:
()
()
()
()


