#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ DOCX 转 Markdown 转换器 使用 mammoth 库将 Word 文档转换为 Markdown 格式 """ import mammoth import os import sys from pathlib import Path def docx_to_markdown(docx_path, md_path=None): """ 将 docx 文件转换为 markdown 文件 参数: docx_path: 输入的 docx 文件路径 md_path: 输出的 markdown 文件路径(可选,默认为同名 .md 文件) 返回: 转换是否成功 (bool) """ try: # 检查输入文件是否存在 if not os.path.exists(docx_path): print(f"错误: 文件 '{docx_path}' 不存在") return False # 检查文件扩展名 if not docx_path.lower().endswith('.docx'): print(f"警告: 文件 '{docx_path}' 可能不是 .docx 格式") # 如果没有指定输出路径,使用同名 .md 文件 if md_path is None: md_path = Path(docx_path).with_suffix('.md') print(f"正在转换: {docx_path} -> {md_path}") # 打开 docx 文件并转换为 markdown with open(docx_path, "rb") as docx_file: result = mammoth.convert_to_markdown(docx_file) markdown_text = result.value # 如果有转换警告,打印出来 if result.messages: print("\n转换警告:") for message in result.messages: print(f" - {message}") # 保存为 markdown 文件 with open(md_path, "w", encoding="utf-8") as md_file: md_file.write(markdown_text) print(f"✓ 转换成功!输出文件: {md_path}") print(f" 文件大小: {len(markdown_text)} 字符") return True except Exception as e: print(f"✗ 转换失败: {str(e)}") return False def batch_convert(input_dir, output_dir=None): """ 批量转换目录下的所有 docx 文件 参数: input_dir: 输入目录路径 output_dir: 输出目录路径(可选,默认为输入目录) """ if output_dir is None: output_dir = input_dir # 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) # 查找所有 .docx 文件 docx_files = list(Path(input_dir).glob("*.docx")) if not docx_files: print(f"在 '{input_dir}' 目录下没有找到 .docx 文件") return print(f"找到 {len(docx_files)} 个 docx 文件\n") success_count = 0 fail_count = 0 for docx_file in docx_files: md_file = Path(output_dir) / (docx_file.stem + '.md') if docx_to_markdown(str(docx_file), str(md_file)): success_count += 1 else: fail_count += 1 print() # 空行分隔 print(f"批量转换完成: 成功 {success_count} 个,失败 {fail_count} 个") def main(): """主函数:处理命令行参数""" if len(sys.argv) < 2: print("DOCX 转 Markdown 转换器") print("\n使用方法:") print(" 单文件转换:") print(f" python {sys.argv[0]} [output.md]") print("\n 批量转换:") print(f" python {sys.argv[0]} --batch [output_dir]") print("\n示例:") print(f" python {sys.argv[0]} document.docx") print(f" python {sys.argv[0]} document.docx output.md") print(f" python {sys.argv[0]} --batch ./docs ./markdown") sys.exit(1) # 批量转换模式 if sys.argv[1] == "--batch": if len(sys.argv) < 3: print("错误: 请指定输入目录") sys.exit(1) input_dir = sys.argv[2] output_dir = sys.argv[3] if len(sys.argv) > 3 else input_dir batch_convert(input_dir, output_dir) # 单文件转换模式 else: docx_path = sys.argv[1] md_path = sys.argv[2] if len(sys.argv) > 2 else None success = docx_to_markdown(docx_path, md_path) sys.exit(0 if success else 1) if __name__ == "__main__": main()