[1276]LibreOffice安装及使用

libreoffice简介

官网:https://zh-cn.libreoffice.org/download/libreoffice/
https://zh-cn.libreoffice.org/get-help/install-howto/

LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。LibreOffice 支持各种文档格式。除了它原生支持的开放文档格式 (OpenDocument Format, ODF) 外,它还支持许多的非开放格式,比如微软的 Microsoft® Word, Excel, PowerPoint 以及 Publisher 的格式等。

LibreOffice和OpenOffice是两个开源办公软件套件,都是基于同一个代码库(原始的OpenOffice.org项目)开发的。在2010年,由于对OpenOffice.org的管理和发展方向不满意,一些开发者分离出了LibreOffice项目,成立了The Document Foundation(TDF)来管理该项目。因此,LibreOffice和OpenOffice之间存在很大的相似性和互相借鉴,但它们是由不同的组织和开发者团队维护和发展的。目前LibreOffice已经成为了开源办公软件领域的主要代表之一,而OpenOffice则已经逐渐退出了主流市场。

win安装

下载地址:https://zh-cn.libreoffice.org/download/libreoffice/

常规软件安装,一路下一步,可选择自定义安装路径,安装之后配置环境变量,D:\soft\LibreOffice\program,运行下面命令测试命令是否安装成功

C:\Users\admin>soffice --version
# 如果安装成功,会提示
LibreOffice 24.2.2.2 d56cc158d8a96260b836f100ef4b4ef25d6f1a01

Libreoffice测试

Libreoffice 在进行文档转换的过程中,转换出来的文档可能会出现乱码,所以需要在正式使用之前,把可能存在的乱码问题进行测试和解决。

创建一个中英文内容的.doc 文档,用如下命令将文档转成 PDF:

soffice --headless --invisible --convert-to pdf example.doc

转换成功之后,会在当前目录下生成一个 example.pdf 的文件,然后打开转换后的PDF文件,查看文件中的中文是否存在乱码等。如果存在乱码,则朝以下两个方向去解决。

1、字符编码是否支持,比如 gbk 或者 utf-8 等
2、是否缺少相应的中文字体库。如 ubuntu 下,可以使用如下的方式进行安装:

apt install ttf-wqy-zenhei
apt install fonts-wqy-microhei

linux安装

yum安装

yum install -y libreoffice

版本验证

[root@s178 opt]# libreoffice --version
or
soffice --version

卸载

yum remove libreoffice*

rpm包安装

1、下载软件包
我们登录libreoffice官网,根据操作系统环境选择对应的软件包,我们需要下载主程序包、中文语言支持包、帮助手册软件包,将压缩包下载到/opt目录下。

[root@s178 opt]# wget https://download.documentfoundation.org/libreoffice/stable/7.5.4/rpm/x86_64/LibreOffice_7.5.4_Linux_x86-64_rpm.tar.gz
[root@s178 opt]# wget https://download.documentfoundation.org/libreoffice/stable/7.5.4/rpm/x86_64/LibreOffice_7.5.4_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
[root@s178 opt]# wget https://download.documentfoundation.org/libreoffice/stable/7.5.4/rpm/x86_64/LibreOffice_7.5.4_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
[root@s178 opt]# ll
total 233696
-rw-r–r–. 1 root root 3116300 Jun 2 21:37 LibreOffice_7.5.4_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
-rw-r–r–. 1 root root 915283 Jun 2 21:37 LibreOffice_7.5.4_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
-rw-r–r–. 1 root root 235265947 Jun 2 21:37 LibreOffice_7.5.4_Linux_x86-64_rpm.tar.gz

2、安装主程序软件包
将下载的主程序软件包解压后使用rpm方式安装,可以使用*.rpm通配符的方式安装RPMS目录下的所有RPM包。安装完成后就会生成/opt/libreoffice7.5/目录,就是libreoffice7.5软件的实际安装目录。

[root@s178 opt]# tar -zxvf LibreOffice_7.5.4_Linux_x86-64_rpm.tar.gz
[root@s178 opt]# cd LibreOffice_7.5.4.2_Linux_x86-64_rpm/RPMS/
[root@s178 RPMS]# rpm -ivh *.rpm
…
42:libreoffice7.5-freedesktop-menus-################################# [100%]
/bin/update-desktop-database
/bin/update-mime-database
/bin/gtk-update-icon-cache
/bin/update-desktop-database
/bin/update-desktop-database

或者使用yum install -y *.rpm安装;

3、安装中文语言包
安装中文语言包中的所有rpm包。

[root@s178 opt]# tar -zxvf LibreOffice_7.5.4_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
[root@s178 opt]# cd LibreOffice_7.5.4.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/
[root@s178 RPMS]# rpm -ivh *.rpm
Preparing… ################################# [100%]
Updating / installing…
1:libobasis7.5-zh-CN-7.5.4.2-2 ################################# [ 50%]
2:libreoffice7.5-zh-CN-7.5.4.2-2 ################################# [100%]

4、安装中文离线帮助rpm包
安装中文离线帮助文件中的所有rpm包。

[root@s178 opt]# tar -zxvf LibreOffice_7.5.4_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
[root@s178 opt]# cd LibreOffice_7.5.4.2_Linux_x86-64_rpm_helppack_zh-CN/RPMS/
[root@s178 RPMS]# rpm -ivh *.rpm
Preparing… ################################# [100%]
Updating / installing…
1:libobasis7.5-zh-CN-help-7.5.4.2-2################################# [100%]

5、版本验证

[root@s178 RPMS]# libreoffice7.5 --version
LibreOffice 7.5.4.2 36ccfdc35048b057fd9854c757a8b67ec53977b6

可能遇到的问题

# 安装libcairo.so.2依赖库
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ sudo yum install ibus

# 安装字体
# 在CentOS7服务器上,利用LibreOffice将word等格式转换为PDF,发现不支持汉字。需要安装字体库
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ sudo yum -y install fontconfig
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ sudo yum -y install ttmkfdir
# 检查已有字体库
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ fc-list

# 安装libreoffice-headless
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ sudo yum install -y libreoffice-headless

# 检验是否安装完成
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ libreoffice7.3 --version
LibreOffice 7.3.5.2 184fe81b8c8c30d8b5082578aee2fed2ea847c01

# 测试一下
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ libreoffice --headless --convert-to pdf 1.doc
Error: source file could not be loaded

# 需要安装 libreoffice-writer
[harry@iZ8vbbip4bq97z0o60rq3uZ office]$ sudo yum install libreoffice-writer

# 附加安装
yum groupinstall "Fonts"
yum groupinstall "Input Methods"

libreoffice使用简介

  • 查看libreoffice命令
[root@localhost pandoc_test]# which libreoffice
/bin/libreoffice
[root@localhost pandoc_test]# ll /bin/ |grep libre
-rwxr-xr-x. 1 root root        372 2月   2 2021 libreoffice
lrwxrwxrwx. 1 root root         11 4月   8 01:15 openoffice.org -> libreoffice
lrwxrwxrwx. 1 root root         38 4月   8 01:15 soffice -> /usr/lib64/libreoffice/program/soffice

命令方式使用libre

soffice --headless --convert-to pdf test.doc

# 批量word转PDF
soffice --headless --convert-to pdf *.doc --outdir /tmp/test
  • python命令行方式,适用win和linux环境
# -*- coding: utf-8 -*-
import subprocess
import os


def test_1():
    # win路径 方式1
    # source_file = 'D:\\soft\\pycharm\\PycharmCode\\zhs_pro\\dev_test\\llama_test\\data\\input\\test_2.docx'
    # outdir='D:\\soft\\pycharm\\PycharmCode\\zhs_pro\\dev_test\\llama_test\\data\\input'
    # win路径 方式2
    source_file = 'D:/soft/pycharm/PycharmCode/zhs_pro/dev_test/llama_test/data/input/test.epub'
    outdir = 'D:/soft/pycharm/PycharmCode/zhs_pro/dev_test/llama_test/data/input'
    # linux 路径
    source_file = '/home/zhou/zhs_pro/pandoc_test/data/input/test_2.docx'
    outdir = '/home/zhou/zhs_pro/pandoc_test'

    # 构建转换命令
    command = [
        'soffice',
        '--headless',
        '--invisible',
        '--convert-to', 'pdf',source_file,
        '--outdir', outdir  # 输出目录路径
    ]
    # 执行转换
    info=subprocess.run(command, check=True)
    print(info)

def test_2():
    import_file_name = "D:/soft/pycharm/PycharmCode/zhs_pro/dev_test/llama_test/data/input/test_2.docx"
    output_file_path = "D:/soft/pycharm/PycharmCode/zhs_pro/dev_test/llama_test/data/input"
    os.system("soffice --headless --convert-to pdf %s --outdir %s" % (import_file_name, output_file_path))


# test_1()
test_2()

这段代码会启动LibreOffice的无头服务模式来执行文档转换。--convert-to参数后面是目标文件格式,--outdir指定输出文件的存储位置。subprocess.run()用于执行命令,check=True确保如果转换过程中有错误,会抛出异常。

python调用libre(使用于win环境)

# -*- coding: utf-8 -*-
import win32com.client

# 调用程序
OO_ServiceManager = win32com.client.DispatchEx("com.sun.star.ServiceManager")
desktop = OO_ServiceManager.CreateInstance("com.sun.star.frame.Desktop")
OO_ServiceManager._FlagAsMethod("Bridge_GetStruct")


# 生成参数元祖
def createProp(name, value):
    prop = OO_ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    prop.Name = name
    prop.Value = value
    return prop


# 读取文档的参数
loading_properties = []
loading_properties.append(createProp("ReadOnly", True))  # 以只读方式打开
loading_properties.append(createProp("Hidden", True))  # 隐藏可视化界面,只是隐藏,还是加载了资源的
# filepath = "file:///%s" % r"C:/workSpace/python/word2pdf/test.docx"  # 绝对路径,注意反斜杠
filepath = "file:///%s" % r"D:/soft/pycharm/PycharmCode/zhs_pro/dev_test/llama_test/data/input/test_2.docx"  # 绝对路径,注意反斜杠

document = desktop.loadComponentFromUrl(filepath, "_blank", 0, tuple(loading_properties))
document.CurrentController.Frame.ContainerWindow.Visible = False  # 据说这样就不会加载可视化界面了,可是放在这个位置都已经加载完成了呀!先放着吧
# 转换为pdf的参数
pdf_properties = []
pdf_properties.append(createProp("FilterName", "writer_pdf_Export"))

newpath = filepath[:-len("docx")] + "pdf"  # pdf 保存路径和名称

try:
    document.storeToURL(newpath, pdf_properties)  # 转换输出
except Exception:
    raise
try:
    document.close(True)  # 关闭
except Exception:
    raise

如何使用 Python 调用 LibreOffice API

开启接口服务

/bin/soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard &

查看端口服务

netstat -tnpl

创建文件、保存为不同的格式、导出为PDF、并添加密码保护

首先,从您的 LibreOffice 安装位置带参数运行 soffice.bin,如下(注意该命令会一直保持运行,可通过Ctrl+C结束运行):

$ /opt/libreofficedev7.1/program/soffice.bin "--accept=socket,host=localhost,port=2002;urp;"

然后,将如下Python代码保存到某个位置,假设文件名为hello_world.py:

import uno
from com.sun.star.beans import PropertyValue

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)

''' 1. 创建空白文档
'''

model = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
text = model.Text
cursor = text.createTextCursor()

# 参考:https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XSimpleText.html
text.insertString( cursor, "Hello World", 0)
text.insertControlCharacter(cursor, uno.getConstantByName("com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK"), 0)
text.insertString( cursor, "Hello World 2", 0)

''' 2. 通过 PropertyValue 之 FilterName 设置要保存的文档类型

若没有指定,则采用默认文档类型(不会根据文件名后缀判断)
PropertyValue的参数和属性,请参考:https://api.libreoffice.org/docs/idl/ref/structcom_1_1sun_1_1star_1_1beans_1_1PropertyValue.html

也可以通过这个选项来将文档导出为PDF或者图像。
完整的FilterName名称,可在LibreOffice源代码的 filter/source/config/fragments/filters 目录下找到。
比如:writer8.xcu中为 node oor:name="writer8",则ODF Text Document格式的API名称为 writer8
常见的:
    writer8.xcu            -> "writer8"
    writer_pdf_Export.xcu  -> "writer_pdf_Export"
    MS_Word_2007_XML.xcu   -> "MS Word 2007 XML"
'''
    
arg_odt = PropertyValue()
arg_odt.Name = "FilterName"
arg_odt.Value = "writer8"

arg_docx = PropertyValue()
arg_docx.Name = "FilterName"
arg_docx.Value = "MS Word 2007 XML"

arg_pdf = PropertyValue()
arg_pdf.Name = "FilterName"
arg_pdf.Value = "writer_pdf_Export"

''' 3. 通过 PropertyValue 设置其他保存选项
'''

# 比如,可以指定保存再打开后显示在文件 -> 属性中的文档标题:
arg_title = PropertyValue()
arg_title.Name = "DocumentTitle"
arg_title.Value = "Hello World"

# 再比如,可以给文档设置密码:
arg_pw = PropertyValue()
arg_pw.Name = "Password"
arg_pw.Value = "123456"

# 可以设置哪些PropertyValue,取决于你要将这些参数传递给谁。
# 如下面所示,我们需要传递给model.storeToURL。storeToURL可以接受的PropertyValue范围,请参考:
# https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html

''' 4. 保存文件
'''

# 首先需要将各个选项参数连接成一个 tuple.此处我们分四个不同的组合:
#    第一个用于保存为开放文档格式ODT,
#    第二个用于保存为微软的OOXML格式DOCX,
#    第三个用于导出为PDF,
#    第四个用于保存为带密码的开放文档格式ODT。
args_odt = (arg_odt, arg_title)
args_docx = (arg_docx, arg_title)
args_pdf = (arg_pdf, )
args_odt_protected = (arg_odt, arg_title, arg_pw)

# 文件的保存路径。注意是file:///形式的路径
file_path_odt = "file:///home/suokunlong/tmp/hello_world.odt"
file_path_docx = "file:///home/suokunlong/tmp/hello_world.docx"
file_path_pdf = "file:///home/suokunlong/tmp/hello_world.pdf"
file_path_odt_protected = "file:///home/suokunlong/tmp/hello_world_protected.odt"

# 保存
model.storeToURL(file_path_odt, args_odt)
model.storeToURL(file_path_docx, args_docx)
model.storeToURL(file_path_pdf, args_pdf)
model.storeToURL(file_path_odt_protected, args_odt_protected)

# 关闭文档(注意此时您通过命令行运行的 libreoffice 管道进程并不会通过以下代码关闭)
model.dispose()

最后,新建一个命令行窗口,通过以下命令用位于 LibreOffice 安装路径下的python解释器(注意不是您系统自身安装的python)来运行这段 hello_world.py 代码:

$ /opt/libreofficedev7.1/program/python ./hello_world.py

此时,你定义的保存路径下会生成四个文件:一个ODT文件,一个DOCX文件,一个PDF文件,还有一个受密码保护的ODT文件。

以上代码在Fedora 32下测试通过,使用的是最新的 LibreOffice 7.1分支构建版本。

以上示例是通过创建空白文档,然后对该空白文档进行操作的。当然,您可以修改代码,从而先读入现有的文档,然后进行后续操作。读文档时,只需要将上述完整代码中的以下代码:

model = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())

修改为:(注意尖括号里的内容)

model = desktop.loadComponentFromURL(<文件路径>, "_blank", 0, <通过PropertyValue构造的打开文件的参数选项,比如FilterName, Password等>)

Python调用LibreOffice转换文件

整体流程
1、启动LibreOffice服务
2、打开待转换的文件
3、设置文件输出路径和格式
4、执行文件转换
5、关闭LibreOffice服务

下面让我们逐步进行每一步的实现。

步骤一:启动LibreOffice服务
在开始转换文件之前,我们需要先启动LibreOffice服务。这可以通过命令行来实现,具体命令如下:

soffice --headless --invisible --nodefault --nofirststartwizard --nologo --norestore

这个命令会启动一个LibreOffice的服务实例,通过参数设置使其在后台运行并不显示图形界面。我们可以使用Python的subprocess模块来执行这个命令,代码如下:

import subprocess

# 启动LibreOffice服务
subprocess.run(['soffice', '--headless', '--invisible', '--nodefault', '--nofirststartwizard', '--nologo', '--norestore'])

步骤二:打开待转换的文件
在启动了LibreOffice服务之后,我们可以开始打开待转换的文件。这可以通过LibreOffice提供的Python库uno来实现。具体代码如下:

import uno

# 创建一个LibreOffice组件上下文
local_context = uno.getComponentContext()

# 创建一个服务管理器
resolver = local_context.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local_context)

# 连接到LibreOffice的服务
ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")

# 获取Root解析器
smgr = ctx.ServiceManager

# 创建一个新的Desktop组件
desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)

# 打开待转换的文件
doc = desktop.loadComponentFromURL(file_url, "_blank", 0, ())

在上述代码中,file_url代表待转换的文件路径,可以是本地文件路径或者是网络文件路径。这段代码会通过LibreOffice的服务打开待转换的文件。

步骤三:设置文件输出路径和格式
在打开了待转换的文件之后,我们需要设置转换后文件的输出路径和格式。具体代码如下:

import os

# 获取待转换文件的目录和文件名
file_dir = os.path.dirname(file_url)
file_name = os.path.basename(file_url)

# 构造输出文件的路径和名称
output_file = os.path.join(file_dir, f"converted_{file_name}.pdf")

# 设置输出参数
output_props = (
    uno.createUnoStruct("com.sun.star.beans.PropertyValue"),
)
output_props[0].Name = "FilterName"
output_props[0].Value = "writer_pdf_Export"

# 设置转换后文件的输出路径和格式
doc.storeToURL(output_file, output_props)

在上述代码中,output_file代表转换后文件的输出路径和名称,这里以PDF格式为例。我们通过设置FilterName属性来指定转换的文件格式。

步骤四:执行文件转换
在设置了输出路径和格式之后,我们可以执行文件转换的操作。具体代码如下:

import time

# 转换文件
doc.refresh()
time.sleep(2)

# 关闭文档
doc.close(True)

在上述代码中,我们使用refresh方法来刷新文档内容,然后使用sleep方法来等待一段时间确保转换完成。最后,我们使用close方法关闭文档。

步骤五:关闭Libre

安装参考:https://blog.csdn.net/carefree2005/article/details/131286781
https://www.sohu.com/a/614599009_120108288
https://blog.51cto.com/xrayly/2074430
https://blog.csdn.net/qq_31810357/article/details/126221833
https://blog.51cto.com/u_15127645/4323947

使用参考:https://blog.csdn.net/lsjweiyi/article/details/122586458
https://www.libreofficechina.org/python-libreoffice-api-hello-world/
https://blog.51cto.com/u_16175439/7256105
https://blog.csdn.net/ppp5741/article/details/130383648

其它:https://github.com/mirkonasato/pyodconverter

rpm安装libreoffice24.2遇到的问题:

问题1:/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found
解决:https://blog.csdn.net/weixin_48043343/article/details/130732382
https://blog.csdn.net/lsb2002/article/details/131456857

问题2:/lib64/libc.so.6: version `GLIBC_2.18‘ not found
解决:https://blog.csdn.net/fdbright/article/details/131467605

问题3:/lib64/libm.so.6: version `GLIBC_2.27‘ not found
解决:https://blog.csdn.net/nilm61/article/details/134266633
https://blog.csdn.net/qq_38225558/article/details/128641561

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值