Bas*_*asj 8 python openoffice.org uno libreoffice
这个问题主要针对 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 在 Windows 上导出到 PDF 非常慢(比 Linux 慢 6 倍)以及答案的注释:它“可以”使用,soffice.exe --headless ...
但更接近 COM 交互(组件对象模型) )对于许多应用程序都是有用的,因此这个问题在这里
相关论坛帖子,以及LibreOffice:使用Python脚本编程,但是uno应该如何安装在Windows上,使用Python,没有详细说明;还有关于 LibreOffice 到 Python 宏编写的详细教程,尤其是 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
Run Code Online (Sandbox Code Playgroud)为了与 LibreOffice 交互,启动一个监听套接字的实例。我不太使用 COM,但我认为这相当于你问的 COM 交互。这可以通过命令行或使用 shell 脚本最轻松地完成,但它也可以使用时间延迟和子进程与系统调用一起使用。
chdir "%ProgramFiles%\LibreOffice\program\"
start soffice -accept=socket,host=localhost,port=2002;urp;
Run Code Online (Sandbox Code Playgroud)
接下来,运行LibreOffice自带的python安装,uno
默认已经安装了。
"C:\Program Files\LibreOffice\program\python.exe"
>> import uno
Run Code Online (Sandbox Code Playgroud)
相反,如果您在 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
Run Code Online (Sandbox Code Playgroud)
最后,由于速度是一个问题,因此使用 LibreOffice 的侦听实例可能会很慢。要更快地完成此操作,请将代码移至宏中。APSO提供了一个菜单来组织 Python 宏。然后像这样调用宏:
soffice "vnd.sun.star.script:myscript.py$name_of_maindef?language=Python&location=user"
Run Code Online (Sandbox Code Playgroud)
XSCRIPTCONTEXT
在宏中,从解析器获取文档对象。