You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LibreOffice UNO API打开DOCX文件时出现「expected str, bytes or os.PathLike object, not pyuno」错误的解决求助

使用LibreOffice UNO API打开DOCX文件时出现「expected str, bytes or os.PathLike object, not pyuno」错误的解决求助

我正在开发一个叫ClipboardMonitor的系统,它会监控用户剪贴板并处理复制的文本,确保文档格式被完整保留。这个系统通过LibreOffice的UNO API来操作.docx文件,先把HTML转换成DOCX格式,再将带格式的内容复制回剪贴板。

系统预期流程

  1. 剪贴板监控
    • 清空剪贴板避免重复内容
    • 自动检测新的复制文本
  2. HTML处理
    • 将复制的文本保存为.html文件
    • 格式化HTML以保证兼容性
  3. 转换为DOCX
    • 使用LibreOffice把HTML转换成DOCX格式
  4. 在LibreOffice中打开并复制
    • 以无头模式连接到LibreOffice
    • 打开生成的.docx文档
    • 将带格式的内容复制到剪贴板
  5. 粘贴格式化文本
    • 用户可以把文本粘贴到任意程序中,同时保留原格式

不过我遇到了一个无法解决的问题:当尝试用LibreOffice UNO API打开.docx文档时,收到了如下错误:

❌ Error copying from LibreOffice: expected str, bytes or os.PathLike object, not pyuno

下面的Python脚本可以完整重现这个问题:

import os
import sys
import time
import pyperclip
from pathlib import Path
# 配置UNO环境变量以定位LibreOffice
os.environ["URE_BOOTSTRAP"] = "vnd.sun.star.pathname:C:/Program Files/LibreOffice/program/fundamental.ini"
os.environ["UNO_PATH"] = "C:/Program Files/LibreOffice/program"
os.environ["PATH"] += os.pathsep + os.environ["UNO_PATH"]
sys.path.append(os.environ["UNO_PATH"])
from ooodev.loader.lo import Lo
from ooodev.write import Write

# DOCX文件路径
DOCX_PATH = "C:\\caminho_arquivo_exemplo\\output.docx" 

def copy_from_libreoffice(docx_file):
    """打开LibreOffice并复制带格式的文本"""
    try:
        print(" 正在连接到LibreOffice...")
        loader = Lo.load_office(Lo.ConnectPipe())  

        # 将路径转换为绝对字符串
        doc_path = Path(docx_file).resolve(strict=False)  
        doc_path_str = str(doc_path)

        print(f" 文档路径: {doc_path_str}")
        print(f" 路径类型: {type(doc_path_str)}")  # 预期输出为<class 'str'>

        # 在LibreOffice中打开DOCX
        doc = Write.open_doc(loader, doc_path_str)  # ❌ 错误发生在这里
        if not doc:
            print("❌ 无法在LibreOffice中打开文档!")
            return

        print("✅ 文档成功打开!")

        # 全选文本
        cursor = Write.get_cursor(doc)
        cursor.gotoStart(False)
        cursor.gotoEnd(True)

        # 复制选中的文本
        Write.copy_selected_text(doc)
        time.sleep(1)  

        # 获取剪贴板内容
        clipboard_text = pyperclip.paste()
        if clipboard_text.strip():
            print("✅ 文本复制成功!")
        else:
            print("⚠️ 没有复制到内容!")

    except Exception as e:
        print(f"❌ 从LibreOffice复制时出错: {e}")

copy_from_libreoffice(DOCX_PATH)

我并不拘泥于当前的实现方式,只需要一个简单的方法能把.docx里的带格式内容复制到剪贴板,满足以下要求:

  • 保留粗体、斜体、下划线和颜色格式
  • 自动运行,不需要打开LibreOffice的可视化界面
  • 不需要安装Microsoft Word

我已经尝试过以下方法,但都没能解决问题:

  • 用Pathlib和os.path.abspath()确保路径格式正确
  • 显式把路径转换成字符串再传给Write.open_doc()
  • 调试doc_path的输出,确认它是有效的字符串类型
  • 打开文件前检查文件是否存在
  • 搜索过类似问题,但找到的解决方案都不适用

备注:内容来源于stack exchange,提问作者Nikollas Verly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:43:07