制作Unoconv项目的Docker镜像
1 介绍
1.1 Unoconv
在Linux下将Office转换为pdf的很多包仅支持Windows,Unoconv是一个用LibreOffice转化文档的项目,已经归档(2025-3-31)。迁移后的新版本是unoserver,unoserver不太好用,我没安装成功,推荐使用Unoconv。
参考地址
# 归档版本
https://github.com/unoconv/unoconv# 新版本
https://github.com/unoconv/unoserver
1.2 LinuxServer.io
LinuxServer.io是一个借助docker将开源项目封装为镜像的组织团队。他们封装了很多有用的镜像。本文借助linuxserver封装的LibreOffice进行二次封装镜像。
参考地址
# linuxserver官网地址
https://www.linuxserver.io/# Github地址
https://github.com/linuxserver/
1.3 LibreOffice
LibreOffice是一个功能强大的免费、开源的办公软件套件。由于LibreOffice官网没有见到封装docker镜像。所以本文使用LinuxServer.io封装的LibreOffice。
参考地址
# LibreOffice官网
https://www.libreoffice.org/# Github上linuxserver封装的LibreOffice地址
https://github.com/linuxserver/docker-libreoffice
1.4 KasmVNC
KasmVNC是一款开源的、基于Web 的 VNC 服务器,用户可以直接通过浏览器访问远程桌面,无需安装任何客户端。 lscr.io/linuxserver/libreoffice:7.6.7使用这个开源项目借助浏览器访问LibreOffice系统。
参考地址
# 官网
https://www.kasmweb.com/kasmvnc# Github上linuxserver封装的KasmVNC地址
https://github.com/linuxserver/docker-baseimage-kasmvnc
2 构建Unoconv镜像
2.1 下载linuxserver/libreoffice镜像
下载镜像
# lscr.io/linuxserver/libreoffice和linuxserver/libreoffice是同一个镜像# 下载linuxserver/libreoffice
docker pull linuxserver/libreoffice:7.6.7# 下载lscr.io/linuxserver/libreoffice
docker pull lscr.io/linuxserver/libreoffice:7.6.7
创建容器
docker run -itd --name pyunoconv linuxserver/libreoffice:7.6.7
在宿主机内将data.docx复制到unoserver容器中,用于文档转换测试。
docker cp data.docx pyunoconv:/home/
2.2 封装pyunoconv容器
(1)进入容器
# 进入容器
docker exec -it pyunoconv /bin/bash
(2)创建虚拟环境
⚠️ 注意:在linuxserver/libreoffice中自带Python,它是为linuxserver/libreoffice系统提供可视化支撑的(系统的Python环境),所以不能作为用户研发环境。如果使用系统的Python会出现下面错误。
error: externally-managed-environment× This environment is externally managed
Python虚拟环境
# 进入容器中的home目录
cd /home# 在home中创建虚拟环境
python -m venv pyunoconv# 激活虚拟环境
source ./pyunoconv/bin/activate
Python安装unoserver依赖
pip install --upgrade setuptools wheel
pip install unoconv
⚠️下面的报错需要执行 pip install --upgrade setuptools wheel
ERROR: Could not find a version that satisfies the requirement distutils (from versions: none)
ERROR: No matching distribution found for distutils
(3)测试unoserver
使用python时可使用subprocess包通过命令行的形式调用即可。
# 在将测试的office转化为pdf
unoconv -f pdf data.docx
执行结果
2.3 解决中文乱码
没安装中文字体会出现转换时都是空,无法转中文。解决方法将Windows下的C:\Windows\Fonts
的字体全部打包为”Fonts.zip“,复制到容器中的/usr/share/fonts/
。
在宿主机中将"Fonts.zip"复制到容器中。
docker cp Fonts.zip pyunoconv:/home/
在pyunoconv容器中解压和移动字体
# 进入容器
docker exec -it pyunoconv /bin/bash# 进入目录
cd /home# 进入容器解压字体包
unzip Fonts# 将字体移动到字体目录下
mv Fonts/* /usr/share/fonts/
3 Web访问LibreOffice
基于Docker使用linuxserver/libreoffice:7.6.7镜像实现在线预览LibreOffice。由于linuxserver/libreoffice内置了KasmVNC,所以可以使用浏览器使用LibreOffice。
使用Docker创建镜像
docker run -d \--name=libreoffice \--security-opt seccomp=unconfined `#optional` \-e PUID=1000 \-e PGID=1000 \-e TZ=Etc/UTC \-p 3000:3000 \-p 3001:3001 \-v /path/to/config:/config \--restart unless-stopped \lscr.io/linuxserver/libreoffice:7.6.7
访问地址
端口3000是http的访问地址,端口3001是https是https的访问地址。
http://192.168.108.146:3000/