解决使用LibreOffice转换.doc文件到.docx时出现Error: source file could not be loaded的问题

D:\extracodes\open-webui\backend\data/uploads/18a598c2-54cc-47f1-a7da-d3e1bfd830a2_1.doc 转换为 .docx 格式完成 CompletedProcess(args="soffice --headless --convert-to docx --outdir 'D:\\extracodes\\open-webui\\backend\\data/uploads' 'D:\\extracodes\\open-webui\\backend\\data/uploads/18a598c2-54cc-47f1-a7da-d3e1bfd830a2_1.doc'", returncode=0, stdout='', stderr='Error: source file could not be loaded\n') 这个文件D:\\extracodes\\open-webui\\backend\\data/uploads/18a598c2-54cc-47f1-a7da-d3e1bfd830a2_1.doc 实际是存在的, 问题出在哪里?

解决方案: 应该标准化路径, 不可以出现反斜杠这样的形式

如果换成 

doc_file = "D:/extracodes/open-webui/backend/data/uploads/18a598c2-54cc-47f1-a7da-d3e1bfd830a2_1.doc" 这样的就可以正常解析了

核心代码就是替换成正常的路径: 

# 标准化路径
    input_path = os.path.abspath(doc_path).replace('\\', '/')

完整的代码示例如下

import os
import subprocess
import msvcrt
import tempfile

def convert_doc_to_docx_secure(doc_path):
    # 标准化路径
    input_path = os.path.abspath(doc_path).replace('\\', '/')
    output_dir = os.path.dirname(input_path)
    
    # 环境配置
    with tempfile.TemporaryDirectory() as tmpdir:
        os.environ['TMP'] = tmpdir
        os.environ['TEMP'] = tmpdir
        
        # 构建命令
        cmd = [
            'soffice',
            '--headless',
            '--nologo',
            '--nodefault',
            '--norestore',
            '--convert-to', 'docx:MS Word 2007 XML',
            '--outdir', output_dir,
            input_path
        ]
        
        # 执行转换
        try:
            result = subprocess.run(
                cmd,
                capture_output=True,
                text=True,
                check=True,
                timeout=30  # 设置超时防止卡死
            )
            return True
        except subprocess.CalledProcessError as e:
            print(f"深度错误信息:\nSTDOUT: {e.stdout}\nSTDERR: {e.stderr}")
            return False

# 使用示例
success = convert_doc_to_docx_secure(r'D:\extracodes\open-webui\backend\data\uploads\18a598c2-54cc-47f1-a7da-d3e1bfd830a2_1.doc')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值