如何在 Python + Windows 中使用 LibreOffice API (UNO)?
Posted
技术标签:
【中文标题】如何在 Python + Windows 中使用 LibreOffice API (UNO)?【英文标题】:How to use LibreOffice API (UNO) with Python + Windows? 【发布时间】:2020-04-27 10:48:18 【问题描述】:这个问题的重点是 Windows + LibreOffice + Python 3。
我也安装了 LibreOffice (6.3.4.2)
pip install unoconv
和 pip install unotools
(pip install uno
是另一个不相关的库),但在 import uno
之后我仍然收到此错误:
ModuleNotFoundError: 没有名为“uno”的模块
更一般地,作为 UNO 的使用示例,如何使用 LibreOffice UNO 打开 .docx 文档并将其导出为 PDF?
几天以来,我对此进行了广泛的搜索,但没有找到可在 Windows 上运行的可重现示例代码:
无头使用soffice.exe
,请参阅我的问题+答案Headless LibreOffice very slow to export to PDF on Windows (6 times slow than on Linux) 和答案注释:它与soffice.exe --headless ...
“工作”,但更接近COM 交互(组件对象模型)的东西是对于许多应用程序很有用,因此这里有这个问题
相关forum post, 和LibreOffice: Programming with Python Scripts,但是在windows上安装uno的方式,用python,就不详述了;还有Detailed tutorial regarding LibreOffice to Python macro writing, especially for Calc
我也试过这个(不成功):Getting python to import uno / pyuno:
import os
os.environ["URE_BOOTSTRAP"] = r"vnd.sun.star.pathname:C:\Program Files\LibreOffice\program\fundamental.ini"
os.environ["PATH"] += r";C:\Program Files\LibreOffice\program"
import uno
【问题讨论】:
【参考方案1】:为了与 LibreOffice 交互,请启动一个在套接字上侦听的实例。我不怎么使用 COM,但我认为这相当于您询问的 COM 交互。这可以在命令行上或使用 shell 脚本最轻松地完成,但它也可以与使用时间延迟和子进程的系统调用一起工作。
chdir "%ProgramFiles%\LibreOffice\program\"
start soffice -accept=socket,host=localhost,port=2002;urp;
接下来,运行LibreOffice自带的python安装,默认安装了uno
。
"C:\Program Files\LibreOffice\program\python.exe"
>> import uno
如果您在 Windows 上使用未随 LibreOffice 提供的 Python 安装,那么让它与 UNO 一起工作会很多困难,除非你喜欢黑客,否则我不推荐它.
现在,这里是所有代码。在实际项目中,最好是组织成类,但这是一个简化的版本。
import os
import uno
from com.sun.star.beans import PropertyValue
def createProp(name, value):
prop = PropertyValue()
prop.Name = name
prop.Value = value
return prop
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext)
ctx = resolver.resolve(
"uno:socket,host=localhost,port=2002;urp;"
"StarOffice.ComponentContext")
smgr = ctx.ServiceManager
desktop = smgr.createInstanceWithContext(
"com.sun.star.frame.Desktop", ctx)
dispatcher = smgr.createInstanceWithContext(
"com.sun.star.frame.DispatchHelper", ctx)
filepath = r"C:\Users\JimStandard\Desktop\Untitled 1.docx"
fileUrl = uno.systemPathToFileUrl(os.path.realpath(filepath))
uno_args = (
createProp("Minimized", True),
)
document = desktop.loadComponentFromURL(
fileUrl, "_default", 0, uno_args)
uno_args = (
createProp("FilterName", "writer_pdf_Export"),
createProp("Overwrite", False),
)
newpath = filepath[:-len("docx")] + "pdf"
fileUrl = uno.systemPathToFileUrl(os.path.realpath(newpath))
try:
document.storeToURL(fileUrl, uno_args) # Export
except ErrorCodeIOException:
raise
try:
document.close(True)
except CloseVetoException:
raise
最后,由于速度是一个问题,使用 LibreOffice 的监听实例可能会很慢。要更快地执行此操作,请将代码移动到宏中。 APSO 提供了一个菜单来组织 Python 宏。然后像这样调用宏:
soffice "vnd.sun.star.script:myscript.py$name_of_maindef?language=Python&location=user"
在宏中,从XSCRIPTCONTEXT
而不是解析器获取文档对象。
【讨论】:
感谢您的详细解答!我要试试这个。 如果您在 Windows 上使用未随 LibreOffice 提供的 Python 安装,那么让它与 UNO 一起工作要困难得多:哦,好吧,这确实是我正在尝试的!事实上,我想使用我的标准 python(不是 LibreOffice 附带的那个),因为我已经拥有了我所有的库,等等。 是的,我明白你为什么要这样做,但这可能不是一个好主意。以上是关于如何在 Python + Windows 中使用 LibreOffice API (UNO)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MSYS2 中使用 Windows Python 安装
如何使用 Python 在 Windows 控制台中打印卢比符号?
如何在 Windows 中同时安装 Python 2.x 和 Python 3.x