使用Libre Office进行文件转换的服务器
项目描述
使用LibreOffice作为服务器进行文档转换。
概述
使用LibreOffice转换文档很容易,例如,你可以使用以下命令将文件转换为PDF:
$ libreoffice --headless --convert-to pdf ~/Documents/MyDocument.odf
但是,这样会将LibreOffice加载到内存中,转换文件然后退出LibreOffice,这意味着下次你转换文档时,LibreOffice需要再次加载到内存中。
为了避免这种情况,LibreOffice有一个监听模式,其中它可以监听通过端口的命令,并加载和转换文档而无需退出和重新加载软件。这降低了转换多个文档时的CPU负载,大约在50%到75%之间,这意味着你可以使用监听器在相同的时间内转换大约两到四倍的文档。
Unoserver 包含三个命令来帮助您完成这项任务,分别是 unoserver,它会在指定的 IP 网络接口和端口上启动监听器;unoconverter,它将连接到监听器并请求转换文档;以及 unocompare,它将连接到监听器并请求比较两个文档并转换结果文档。
安装
注意!Windows 和 Mac 的支持尚未测试。
Unoserver 需要使用与 LibreOffice 相同的 Python 安装进行安装和运行。在 Unix 系统上,通常意味着您可以使用以下命令安装它:
$ sudo -H pip install unoserver
如果您已安装多个版本的 LibreOffice,您需要为每个版本安装它。通常,每个 LibreOffice 安装都有自己的 python 可执行文件,您需要使用该可执行文件运行 pip。
$ sudo -H /full/path/to/python -m pip install unoserver
要查找安装了相关 LibreOffice 库的所有 Python 安装,您可以运行一个名为 find_uno.py 的脚本。
wget -O find_uno.py https://gist.githubusercontent.com/regebro/036da022dc7d5241a0ee97efdf1458eb/raw/find_uno.py python3 find_uno.py
输出结果应类似于以下内容:
Trying python found at /usr/bin/python3... Success! Trying python found at /opt/libreoffice7.1/program/python... Success! Found 2 Pythons with Libreoffice libraries: /usr/bin/python3 /opt/libreoffice7.1/program/python
/usr/bin/python3 二进制文件将是系统 Python,用于由系统包管理器安装的 LibreOffice 版本。在 /opt/ 下的 Python 安装将是官方 LibreOffice 发行版中包含的 Python 版本。
要在这种发行版上安装,请执行以下操作:
$ wget https://bootstrap.pypa.io/get-pip.py $ sudo /path/to/python get-pip.py $ sudo /path/to/python -m pip install unoserver
如果您正在使用系统 Python 的虚拟环境,您也可以在虚拟环境中安装它,并指定 --system-site-packages 参数。
$ virtualenv --python=/usr/bin/python3 --system-site-packages virtenv $ virtenv/bin/pip install unoserver
Windows 和 Mac 的安装尚不支持,但在 Windows 上,LibreOffice Python 可执行文件的路径通常位于例如 C:\Program Files (x86)\LibreOffice\python.exe 等位置。在 Mac 上,例如可以是 /Applications/LibreOffice.app/Contents/python 或 /Applications/LibreOffice.app/Contents/Resources/python。
用法
安装 unoserver 会安装三个脚本,分别是 unoserver、unoconverter 和 unocompare。所有这些也可以作为模块运行,使用 python3 -m unoserver.server、python3 -m unoserver.converter 和 python3 -m unoserver.comparer,与主脚本具有相同的参数。
Unoserver
unoserver [-h] [-v] [--interface INTERFACE] [--uno-interface UNO_INTERFACE] [--port PORT] [--uno-port UNO_PORT]
[--daemon] [--executable EXECUTABLE] [--user-installation USER_INSTALLATION]
[--libreoffice-pid-file LIBREOFFICE_PID_FILE]
–interface:XMLRPC 服务器使用的接口,默认为 “127.0.0.1”
–port:XMLRPC 服务器使用的端口号,默认为 “2003”
–uno-interface:LibreOffice 服务器使用的接口,默认为 “127.0.0.1”
–uno-port:LibreOffice 服务器使用的端口号,默认为 “2002”
–daemon:使服务器成为守护进程
–executable:LibreOffice 可执行文件的路径
–user-installation:LibreOffice 用户配置文件的路径,默认为动态创建的临时目录
–libreoffice-pid-file:如果设置,unoserver 将将 LibreOffice 进程 ID 写入此文件。如果以守护进程模式启动,则在 unoserver 退出时不会删除该文件。
-v, –version:显示版本并退出。
Unoconvert
unoconvert [-h] [-v] [--convert-to CONVERT_TO] [--input-filter INPUT_FILTER] [--output-filter OUTPUT_FILTER]
[--filter-options FILTER_OPTIONS] [--update-index] [--dont-update-index] [--host HOST] [--port PORT]
[--host-location {auto,remote,local}] infile outfile
infile:要转换的文件的路径(使用 - 表示 stdin)
outfile:转换后文件的路径(使用 - 表示 stdout)
–convert-to:输出文件的文件类型/扩展名(例如 pdf)。在使用 stdout 时是必需的。
–input-filter:在自动检测失败时使用的 LibreOffice 输入过滤器(例如 'writer8')
–output-filter:转换时使用的导出过滤器。如果未指定,则会自动选择。
–filter:–output-filter 的过时别名
–filter-option:以 name=value 格式传递导出过滤器的选项。对于布尔值,使用 true/false。可以重复多次以传递多个选项。
–filter-options:–filter-option 的过时别名。
–host:服务器使用的主机,默认为 “127.0.0.1”
–port:服务器使用的端口号,默认为 “2003”
–host-location:主机位置决定了文件的处理方式。如果在同一台机器上运行客户端和服务器,它可以设置为本地,文件将通过路径发送。如果它们在不同的机器上,则是远程的,文件将通过二进制数据发送。默认是自动,如果主机是 127.0.0.1 或 localhost,则发送文件路径,对于其他主机则发送二进制数据。
-v, –version:显示版本并退出。
设置 PNG 宽度/高度的示例
unoconvert infile.odt outfile.png --filter-options PixelWidth=640 --filter-options PixelHeight=480
Unocompare
unocompare [-h] [-v] [--file-type FILE_TYPE] [--host HOST] [--port PORT] [--host-location {auto,remote,local}]
oldfile newfile outfile
oldfile:与原始文件进行比较的较旧文件的路径(使用 - 表示 stdin)
newfile:与修改后的文件进行比较的较新文件的路径(使用 - 表示 stdin)
outfile:比较结果和转换文件的路径(使用 - 表示 stdout)
–file-type:输出文件的文件类型/扩展名(例如 pdf)。使用 stdout 时必须指定。
–host:服务器使用的主机,默认为 “127.0.0.1”
–port:服务器使用的端口号,默认为 “2003”
–host-location:主机位置决定了文件的处理方式。如果在同一台机器上运行客户端和服务器,它可以设置为本地,文件将通过路径发送。如果它们在不同的机器上,则是远程的,文件将通过二进制数据发送。默认是自动,如果主机是 127.0.0.1 或 localhost,则发送文件路径,对于其他主机则发送二进制数据。
-v, –version:显示版本并退出。
开发和测试
从 https://github.com/unoconv/unoserver 克隆仓库。
设置虚拟环境
$ virtualenv --system-site-packages ve $ ve/bin/pip install -e .[devenv]
运行测试
$ ve/bin/pytest tests
运行 flake8 检查
$ ve/bin/flake8 src tests
与 unoconv 的比较
Unoserver 作为一个重写,并且希望作为一个替换 unoconv 的工具,它是一个支持使用 LibreOffice 作为监听器来转换文档的模块。
用户差异
对于系统版本的 LibreOffice,安装更简单。在 Linux 上,LibreOffice 的打包版本通常使用系统 Python,这使得通过简单的 sudo pip install unoserver 命令安装 unoserver 更加容易。
分别有服务器和客户端的命令。客户端不再尝试启动监听器然后在转换后关闭它,如果找不到监听器。相反,新的 unoconverter 客户端要求启动 unoserver。这使得一次性转换不太实用,但如前所述,可以使用 LibreOffice 本身轻松完成。
unoserver 监听器不会阻止您以普通用户身份使用 LibreOffice,而 unoconv 监听器则会阻止您以正常方式启动 LibreOffice 打开文档。
您应该在多核机器上能够运行多个具有不同端口的 unoservers。但是,在 unoserver 中没有支持任何形式的负载均衡,您将不得不在自己的 unoconverter 使用中自行实现。为了高性能的多核扩展,必须为每个 unoserver 的 –port 和 –uno-port 选项指定唯一的值。
仅支持 LibreOffice。其他变体未经测试。
维护者差异
这是一个完整且干净的重新编写,仅支持 Python 3,具有易于理解且因此易于维护的代码,希望意味着更多的人可以贡献。
它不依赖于文件类型和导出筛选器的内部映射,而是请求 LibreOffice 提供此信息,这将增加与不同版本 LibreOffice 的兼容性,并降低维护难度。
贡献者
Lennart Regebro,regebro@gmail.com
Stephan Richter,srichter@shoobx.com
Bruno Simão,https://github.com/ankology
Åsmund Stavdahl,https://github.com/asmundstavdahl
Balázs Varga,https://github.com/bvarga91
Alessandro Filippini,https://github.com/AlePini
Dmitry Shachnev,https://github.com/mitya57
Socheat Sok,https://github.com/socheatsok78
BohwaZ,https://github.com/bohwaz
ReeceJones,https://github.com/ReeceJones
2.2.2 (2024-09-18)
修复了 unoserver 中的内存泄漏。
2.2.1 (2024-07-24)
恢复了 Python 3.8 功能。
2.2 (2024-07-23)
ReeceJones添加了对指定IPv6地址的支持。
现在尝试连接到服务器,如果服务器尚未启动,则会重试。
验证服务器和客户端上安装的版本是否相同。
如果您拼错了过滤器名称,输出将更加友好。
在重构过程中,客户端变得非常安静,已修复此问题。
使用–verbose和–quiet参数可以获得更多或更少的输出。
2.1 (2024-03-26)
错误地发布了错误的版本号,应该是2.1。
2.0.2 (2024-03-21)
向命令添加了–version标志以打印版本号。另外,unoserver在启动时也会打印版本号。
文件路径现在始终发送为绝对路径。
2.1b1 (2024-01-12)
添加–input-filter参数以指定与LibreOffice猜测不同的文件类型。
为了保持一致性,将–filter重命名为–output-filter,但–filter将保持不变以实现向后兼容。
如果您指定了一个不存在的过滤器,过滤器列表现在将按字母顺序排列。
您现在可以使用LibreOffice的名称,也可以使用内部较短的名称,有时甚至可以使用文件扩展名来指定过滤器。
2.0.1 (2024-01-12)
如果您从localhost使用端口转发,则指定–host-location=remote对输出文件不起作用。
无论XMLRPC接口是什么,始终将uno接口默认设置为127.0.0.1。
2.0 (2023-10-19)
使–daemon参数再次工作。
为–filter-options添加了–filter-option别名。
2.0b1 (2023-08-18)
进行了大量重构,包括XML-RPC服务器和新的客户端,该客户端使用该XML-RPC服务器进行通信。这意味着客户端现在可以更轻量级,不再需要Uno库,甚至不需要安装LibreOffice。相反,可以使用新的unoserver.client.UnoClient()作为Python库。
对命令进行了清理和重构,使用新的、更好的参数名称。
1.6 (2023-08-18)
为命令参数添加了一些弃用警告,因为它们将在2.0中更改。
1.5 (2023-08-11)
添加了对通过–filter-options参数传递过滤器选项的支持。
向unoserver添加了–user-installation标志,以支持自定义用户安装。
为unoserver添加了–libreoffice-pid-file参数,用于保存LibreOffice PID。
1.4 (2023-04-28)
添加了新功能:比较文档并将结果导出为任何格式。
您可以将新模块作为脚本运行,也可以使用python3 -m unoserver.comparer,就像使用python3 -m unoserver.server和python3 -m unoserver.converter一样。
从上一个版本迁移功能:目录表的索引刷新。
1.3 (2023-02-03)
现在在Windows上工作(尽管它不是官方支持的)。
向unoconverter添加了–filter参数,允许显式选择用于转换的导出过滤器。
1.2 (2022-03-17)
将日志配置从导入时间移动到main()函数。
改进了对KeyboardInterrupt的处理。
添加了弃用但仍然必要的com.sun.star.text.WebDocument,用于HTML文档。
1.1 (2021-10-14)
修复了一个错误:如果您在将结果通过管道发送到stdout时指定了未知文件扩展名,则会得到类型错误而不是正确的错误。
添加了额外的检查,以确保退出时LibreOffice已经完全关闭。我遇到了几个案例,其中soffice.bin在unoserver退出后使用100%的负载在后台运行。我希望这可以解决这个问题。
添加了if __name__ == "main":块,以便您可以像脚本一样运行模块,也可以使用python3 -m unoserver.server和python3 -m unoserver.converter。
1.0.1 (2021-09-20)
修复了一个错误,该错误意味着unoserver在与Supervisord的重启命令不兼容。
1.0 (2021-08-10)
进行了一些小的拼写和语法更改。
1.0b3 (2021-07-01)
确保遵守interface和port选项。
服务器中添加了“-executable”选项,以选择特定的libreoffice安装。
将输入文件和输出文件的选项更改为位置参数。
添加了对使用stdin和stdout的支持。
添加了一个“-convert-to”参数,用于指定结果文件类型。
1.0b2(2021-06-24)
一个错误阻止了将文件转换为或从本地目录中的文件。
1.0b1(2021-06-24)
第一个beta版本
0.0.1 (2021-06-16)
第一个alpha版本
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
unoserver-2.2.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8e6a9944e821db6fb8d570fd4709f439ee2034404c632f2f46c36b3f62ba9e19 |
|
MD5 | 2703f25a594fbce7bf69c925ea45806c |
|
BLAKE2b-256 | 682867c9774d9d398c95e64b75411384b5c0ea192d04d93ebe68342574344c44 |
unoserver-2.2.2-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3fd208c09023a9d653a3325a526c22b5039a3302c944e88b1fd34f13096ef24a |
|
MD5 | 5bd8ec83700b37b16b72e3d7a2750f77 |
|
BLAKE2b-256 | 9dd2f22dd5e28bbe30d9c4e564d1784ebaf4a4c1ce449a87d67fbb96fe8f2612 |