MaxKB 之文档处理:doc批量转docx

1、背景

客户政府行业,文档多为 doc 格式且数量比较多,目前 MaxKB 支持 docx 格式文档导入,一个个改太麻烦,通过 Python 脚本批量转换为 MaxKB 兼容的 docx 格式。

2、实现方式

import os
import sys
import time
from win32com import client as wc
from tqdm import tqdm  # 用于显示进度条,可选
 
 
def doc_to_docx(input_path, output_path):
    """将单个doc文件转换为docx格式"""
    word = None
    try:
        time.sleep(1) # 跑太快,word报错,时间可调整
        word = wc.Dispatch("Word.Application")
        word.Visible = False  # 后台运行
        word.DisplayAlerts = False  # 关闭警告
        doc = word.Documents.Open(os.path.abspath(input_path))
        doc.SaveAs(os.path.abspath(output_path), 16)  # 16表示docx格式
        return True
    except Exception as e:
        print(f"转换错误: {e}")
        return False
    finally:
        if word:
            doc.Close()
            word.Quit()
 
 
def batch_convert_doc_to_docx(directory):
    """批量转换目录下的所有doc文件为docx"""
    directory = os.path.abspath(directory)
    if not os.path.exists(directory):
        print(f"错误:目录不存在 - {directory}")
        return
 
    # 获取目录下所有doc文件(包括子目录)
    doc_files = []
    for root, _, files in os.walk(directory):
        for file in files:
            if file.lower().endswith('.doc'):
                doc_files.append(os.path.join(root, file))
 
    if not doc_files:
        print("该目录下未找到.doc文件")
        return
 
    print(f"找到 {len(doc_files)} 个.doc文件,开始转换...")
 
    # 创建输出目录(如果不存在)
    output_dir = os.path.join(directory, "docx_files")
    os.makedirs(output_dir, exist_ok=True)
 
    # 转换统计
    success_count = 0
    fail_count = 0
 
    # 转换每个文件
    for input_path in tqdm(doc_files, desc="转换进度"):
        try:
            # 保持原始目录结构
            rel_path = os.path.relpath(os.path.dirname(input_path), directory)
            output_subdir = os.path.join(output_dir, rel_path)
            os.makedirs(output_subdir, exist_ok=True)
 
            # 生成输出路径
            filename = os.path.basename(input_path)
            output_filename = os.path.splitext(filename)[0] + ".docx"
            output_path = os.path.join(output_subdir, output_filename)
 
            # 转换文件
            if doc_to_docx(input_path, output_path):
                success_count += 1
            else:
                fail_count += 1
                print(f"转换失败: {filename}")
 
        except Exception as e:
            fail_count += 1
            print(f"\n处理 {filename} 时出错: {e}")
 
    print(f"\n转换完成! 成功: {success_count}, 失败: {fail_count}")
    print(f"结果已保存到: {output_dir}")
 
 
if __name__ == "__main__":
    # 获取用户输入或使用当前目录
    if len(sys.argv) > 1:
        directory = sys.argv[1]
    else:
        directory = input("请输入文档目录路径: ").strip('"')
 
    batch_convert_doc_to_docx(directory)

三、效果