使用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格式,再将带格式的内容复制回剪贴板。
系统预期流程
- 剪贴板监控
- 清空剪贴板避免重复内容
- 自动检测新的复制文本
- HTML处理
- 将复制的文本保存为
.html文件 - 格式化HTML以保证兼容性
- 将复制的文本保存为
- 转换为DOCX
- 使用LibreOffice把HTML转换成DOCX格式
- 在LibreOffice中打开并复制
- 以无头模式连接到LibreOffice
- 打开生成的
.docx文档 - 将带格式的内容复制到剪贴板
- 粘贴格式化文本
- 用户可以把文本粘贴到任意程序中,同时保留原格式
不过我遇到了一个无法解决的问题:当尝试用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
相关产品推荐
相关产品推荐

